├── README.md
├── notes
├── lesson-1-docker-learn-resource
│ └── README.md
├── lesson-2-docker-learn-note
│ └── README.md
├── lesson-3-how-to-build-a-Tomcat-image-with-Dockerfile-and-deploy-war
│ └── README.md
├── lesson-4-manage-a-swarm
│ ├── README.md
│ └── class-3-getting-started-with-swarm-mode
│ │ ├── README.md
│ │ ├── section-1-set-up-for-the-tutorial
│ │ └── README.md
│ │ └── section-2-create-a-swarm
│ │ └── README.md
└── lesson-5-docker-common-mistakes-and-tricks
│ └── README.md
└── res
└── wxmoney.jpg
/README.md:
--------------------------------------------------------------------------------
1 | docker_learn
2 | ===
3 | Docker学习笔记
4 |
5 | 笔记列表
6 | - Lesson 1 [Docker学习资源](notes/lesson-1-docker-learn-resource/README.md)
7 | - Lesson 2 [Docker学习笔记](notes/lesson-2-docker-learn-note/README.md)
8 | - Lesson 3 [如何使用Dockerfile构建Tomcat镜像并部署war](notes/lesson-3-how-to-build-a-Tomcat-image-with-Dockerfile-and-deploy-war/README.md)
9 | - Lesson 4 [Manage-a-swarm(官方文档翻译)](notes/lesson-4-manage-a-swarm/README.md)
10 | - Lesson 5 [Docker日常坑和技巧](notes/lesson-5-docker-common-mistakes-and-tricks/README.md)
11 |
12 | 如果笔记有什么纰漏,或者有问题都可以到[Issue区](https://github.com/errorlife/docker_learn/issues)讨论 :)
13 |
14 | > 如果觉得我的文章对您有帮助,请随意打赏~
15 |
16 |
17 |
--------------------------------------------------------------------------------
/notes/lesson-1-docker-learn-resource/README.md:
--------------------------------------------------------------------------------
1 | Docker学习资源
2 | ===
3 | ## 文档类
4 |
5 | * [Docker官方文档](https://docs.docker.com)
6 | * [Docker技术入门与实战 杨保卫 戴王剑 曹亚伦编著](https://www.gitbook.com/book/yeasy/docker_practice/details)
7 | * [Docker部署springboot](https://github.com/bingohuang/spring-boot-docker)
8 |
9 | ## 工具类
10 |
11 | * [更新yum源](http://blog.csdn.net/junbujianwpl/article/details/51146888)
12 | * [Daocloud加速器(需注册)](https://www.daocloud.io/mirror#accelerator-doc)
13 |
14 | > 如果觉得我的文章对您有帮助,请随意打赏~
15 |
16 |
17 |
--------------------------------------------------------------------------------
/notes/lesson-2-docker-learn-note/README.md:
--------------------------------------------------------------------------------
1 | Docker学习笔记
2 | ===
3 | ## 0x01 Docker是什么?
4 |
5 | ### 如何通俗的理解Docker
6 | 作者:刘允鹏
7 | 链接:https://www.zhihu.com/question/28300645/answer/67707287
8 | 来源:知乎
9 | 著作权归作者所有,转载请联系作者获得授权。(已获授权)
10 |
11 | Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
12 |
13 | docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。
14 |
15 | 1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
16 |
17 | 2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
18 |
19 | 3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
20 |
21 | 总之docker就是集装箱原理。
22 |
23 | ## 0x02 安装([官网文档](https://docs.docker.com/engine/installation/))
24 |
25 | ### 系统环境:Centos 7.2 64位
26 |
27 | ### 官方文档要求Linux kernel至少3.10以上,且docker只能运行在64位的系统中。本来是打算用Centos 6.5 64位的,既然官方都建议用最新的了,那还是不折腾升级内核好了,执意要的请参考这篇[博文](http://blog.csdn.net/wuzhilon88/article/details/41621285/)。
28 |
29 | $ uname -r
30 | 3.10.0-327.36.3.el7.x86_64
31 |
32 | ### 开始安装(yum)
33 | 1、使用sudo或root权限的用户登录到你的机器
34 | 2、确保现有的包是最新的
35 |
36 | $ sudo yum update -y -y表示yes
37 |
38 | 3、添加yum repo
39 |
40 | $ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
41 | [dockerrepo]
42 | name=Docker Repository
43 | baseurl=https://yum.dockerproject.org/repo/main/centos/7/
44 | enabled=1
45 | gpgcheck=1
46 | gpgkey=https://yum.dockerproject.org/gpg
47 | EOF
48 |
49 | 4、安装Docker软件包
50 |
51 | $ sudo yum install docker-engine -y
52 |
53 | 5、启用服务
54 |
55 | $ sudo systemctl enable docker.service
56 |
57 | 6、启动Docker守护进程
58 |
59 | $ sudo systemctl start docker
60 |
61 | 7、验证docker是通过在一个容器中运行测试图像正确安装的
62 |
63 | $ sudo docker run --rm hello-world
64 |
65 | # 默认情况下,每个容器在退出时,它的文件系统也会保存下来,这样一方面调试会方便些,因为你可以通过查看日志等方式来确定最终状态。另外一方面,你也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。
66 |
67 | Unable to find image 'hello-world:latest' locally
68 | latest: Pulling from library/hello-world
69 | c04b14da8d14: Pull complete
70 | Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
71 | Status: Downloaded newer image for hello-world:latest
72 |
73 | Hello from Docker!
74 | This message shows that your installation appears to be working correctly.
75 |
76 | To generate this message, Docker took the following steps:
77 | 1. The Docker client contacted the Docker daemon.
78 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
79 | 3. The Docker daemon created a new container from that image which runs the
80 | executable that produces the output you are currently reading.
81 | 4. The Docker daemon streamed that output to the Docker client, which sent it
82 | to your terminal.
83 |
84 | To try something more ambitious, you can run an Ubuntu container with:
85 | $ docker run -it ubuntu bash
86 |
87 | Share images, automate workflows, and more with a free Docker Hub account:
88 | https://hub.docker.com
89 |
90 | For more examples and ideas, visit:
91 | https://docs.docker.com/engine/userguide/
92 |
93 | ### 脚本安装([入口](https://docs.docker.com/engine/installation/linux/centos/#install-with-the-script))
94 |
95 | ### 创建docker group
96 |
97 | 1、使用sudo或root权限的用户登录到你的机器。
98 | 2、创建docker group
99 |
100 | $ sudo groupadd docker
101 |
102 | 3、将你的用户名添加进docker group
103 |
104 | $ sudo usermod -aG docker your_username
105 |
106 | 4、注销后重新登录,确定用户拥有正确的权限。
107 |
108 | 5、确认docker group中的用户可以不用sudo命令就执行docker
109 |
110 | $ docker run --rm hello-world
111 |
112 | ### 在开机启动添加Docker守护进程
113 | 1、将Docker守护程序配置为在主机启动时自动启动
114 |
115 | $ sudo systemctl enable docker
116 |
117 | ## 0x03 基础命令 - 镜像管理
118 |
119 | ### 搜索镜像
120 |
121 | 使用`docker search`命令搜索远程仓库中共享的镜像。
122 |
123 | docker search TERM
124 |
125 | 例如搜索名称为mysql的镜像
126 |
127 | $ docker search mysql
128 | NAME DESCRIPTION STARS OFFICIAL AUTOMATED
129 | mysql MySQL is a widely used... 2763 [OK]
130 | mysql/mysql-server Optimized MySQL Server... 178 [OK]
131 |
132 |
133 | ### 获取镜像
134 |
135 | 使用`docker pull`命令从网络上下载镜像。
136 |
137 | docker pull NAME[:TAG]
138 |
139 | 例如
140 |
141 | $ docker pull ubuntu
142 | Using default tag: latest
143 | latest: Pulling from library/ubuntu
144 |
145 | 43db9dbdcb30: Downloading 1.494 MB/49.33 MB
146 | 2dc64e8f8d4f: Download complete
147 | 670a583e1b50: Download complete
148 | 43db9dbdcb30: Pull complete
149 | 2dc64e8f8d4f: Pull complete
150 | 670a583e1b50: Pull complete
151 | 183b0bfcd10e: Pull complete
152 | Digest: sha256:c6674c44c6439673bf56536c1a15916639c47ea04c3d6296c5df938add67b54b
153 | Status: Downloaded newer image for ubuntu:latest
154 |
155 | 不指定Tag的时候默认使用`:latest`,因此,上述命令实际上是`docker pull ubuntu:latest`。
156 |
157 | ### 查看镜像信息
158 |
159 | 使用`docker images`可以列出本地主机上已有的镜像列表。
160 |
161 | $ docker images
162 | REPOSITORY TAG IMAGE ID CREATED SIZE
163 | php latest fe1a2c2228f4 2 days ago 364 MB
164 | mongo latest 87bde25ffc68 2 days ago 326.7 MB
165 | ubuntu latest 42118e3df429 9 days ago 124.8 MB
166 | redis latest 4465e4bcad80 6 weeks ago 185.7 MB
167 | nginx latest 0d409d33b27e 8 weeks ago 182.8 MB
168 |
169 | 还可以使用`docker inspect`命令查看单个镜像的详细信息
170 |
171 | $ docker inspect ubuntu
172 | [
173 | {
174 | "Id": "sha256:42118e3df429f09ca581a9deb3df274601930e428e452f7e4e9f1833c56a100a",
175 | "RepoTags": [
176 | "ubuntu:latest"
177 | ],
178 | "RepoDigests": [
179 | "ubuntu@sha256:c6674c44c6439673bf56536c1a15916639c47ea04c3d6296c5df938add67b54b"
180 | ],
181 | },
182 | ...
183 | "RootFS": {
184 | "Type": "layers",
185 | "Layers": [
186 | "sha256:ea9f151abb7e06353e73172dad421235611d4f6d0560ec95db26e0dc240642c1",
187 | "sha256:0185b3091e8ee299850b096aeb9693d7132f50622d20ea18f88b6a73e9a3309c",
188 | "sha256:98305c1a8f5e5666d42b578043e3266f19e22512daa8c6b44c480b177f0bf006",
189 | "sha256:9a39129ae0ac2fccf7814b8e29dde5002734c1699d4e9176061d66f5b1afc95c"
190 | ]
191 | }
192 | }
193 | ]
194 |
195 | 查看单项信息
196 |
197 | $ docker inspect -f {{".Config.Hostname"}} ubuntu
198 | 827f45722fd6
199 |
200 |
201 |
202 |
203 | ### 删除镜像
204 |
205 | 使用`docker rmi`命令删除镜像。
206 |
207 | docker rmi IMAGE [IMAGE...]
208 |
209 | 其中IMAGE可以是镜像标签或者ID。
210 |
211 | 例如
212 |
213 | docker rmi ubuntu
214 | docker rmi php:7.0.1
215 |
216 | ### 创建镜像
217 |
218 | 创建镜像有三种方法:
219 |
220 | - 基于已有镜像创建
221 | - 基于本地模板导入
222 | - 基于Dockerfile创建
223 |
224 | #### 使用已有镜像创建
225 |
226 | 该方法主要使用`docker commit`命令。
227 |
228 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
229 |
230 | 包含以下主要选项
231 |
232 | * -a --author="",作者信息
233 | * -m --message="",提交信息
234 | * -p --pause=true,提价时暂停容器运行
235 |
236 | 例如
237 |
238 | $ docker run -i -t ubuntu:latest /bin/bash
239 | root@5a86b68c4e6a:/# ls
240 | bin dev home lib64 mnt proc run srv tmp var
241 | boot etc lib media opt root sbin sys usr
242 | root@5a86b68c4e6a:~# exit
243 | exit
244 |
245 | $ docker commit -m "create a new images" -a "mylxsw" 5a86b68c4e6a test-cont
246 | sha256:68f1237c24a744b05a934f1317ead38fc68061ade7981eaae158a2ba8da02a9b
247 |
248 | $ docker images
249 | REPOSITORY TAG IMAGE ID CREATED SIZE
250 | test-cont latest 68f1237c24a7 3 seconds ago 124.8 MB
251 | php latest fe1a2c2228f4 2 days ago 364 MB
252 | mongo latest 87bde25ffc68 2 days ago 326.7 MB
253 | ubuntu latest 42118e3df429 9 days ago 124.8 MB
254 | redis latest 4465e4bcad80 6 weeks ago 185.7 MB
255 | nginx latest 0d409d33b27e 8 weeks ago 182.8 MB
256 |
257 | #### 基于本地模板导入
258 |
259 | #### 基于Dockerfile创建
260 |
261 | ### 保存镜像文件
262 |
263 | 使用`docker save`命令保存镜像文件为本地文件。
264 |
265 | docker save -o ubuntu_latest.tar ubuntu:latest
266 |
267 | ### 载入镜像
268 |
269 | 使用`docker load`从本地文件再导入镜像压缩包到本地镜像仓库。
270 |
271 | docker load --input ubuntu_latest.tar
272 | 692b4b3b88ff: Loading layer 2.56 kB/2.56 kB
273 | Loaded image: ubuntu:latest
274 |
275 | ### 上传镜像
276 |
277 | 上传镜像使用`docker push`命令。
278 |
279 | docker push NAME[:TAG]
280 |
281 | 默认上传镜像到DockerHub官方仓库。
282 |
283 |
284 | ## 0x04 基础命令 - 容器
285 |
286 | ### 创建容器
287 |
288 | 使用`docker create`命令创建一个容器,使用该命令创建的容器处于停止状态,需要使用`docker start`命令启动容器。
289 |
290 | docker create -it ubuntu:latest
291 |
292 | 例如:
293 |
294 | $ docker create -it ubuntu
295 | ddb96bff9de60765a5c10ef91c684e206866a095ec1dae2dbc66924b65d26602
296 | $ docker ps -a
297 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
298 | ddb96bff9de6 ubuntu "/bin/bash" 10 seconds ago Created grave_shaw
299 |
300 | 也可以直接使用`docker run`命令创建并启动一个新的容器,等价于执行命令`docker create`和`docker start`。
301 |
302 | $ docker run ubuntu /bin/echo 'Hello world'
303 | Hello world
304 |
305 | 下面的命令让docker启动一个bash终端,允许用于与其进行交互
306 |
307 | $ docker run -i -t ubuntu /bin/bash
308 | root@d808be915a22:/#
309 |
310 | > `-t`选项让docker分配一个伪终端并绑定到容器的标准输入上,`-i`则让容器的标准输入保持打开。
311 |
312 | 大多数情况下,我们希望容器以后台守护进程的形式运行,可以使用`-d`选项。
313 |
314 | $ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
315 | 1927a78fd6e6ca32dbf6a8efe86d83162dd974e6302d930a1766b44142f33804
316 | $ docker ps
317 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
318 | 1927a78fd6e6 ubuntu "/bin/sh -c 'while tr" 3 seconds ago Up 2 seconds prickly_mcclintock
319 | $ docker logs prickly_mcclintock
320 | hello world
321 | hello world
322 | hello world
323 |
324 |
325 | ### 终止容器
326 |
327 | 使用`docker stop`命令终止运行中的容器。
328 |
329 | $ docker stop prickly_mcclintock
330 | prickly_mcclintock
331 |
332 | > 容器终止后可以使用`docker start`命令再次启动,也可以对运行的容器执行`docker restart`使其重启。
333 |
334 | ### 进入容器
335 |
336 | 使用`-d`选项启动容器后,容器会进入后台运行,用户无法查看容器中的信息。有时候需要进入容器进行操作,可以使用`docker attach`命令以及`docker exec`命令,`nsenter`等工具。
337 |
338 | #### attach命令
339 |
340 | `docker attach`命令是Docker自带的命令,使用的时候并不太方便,当多个窗口attach到同一个容器,所有窗口都会同步显示。某一个窗口堵塞,其它创建窗口就无法继续进行操作了。
341 |
342 | docker attach prickly_mcclintock
343 |
344 | > 使用`docker attach`之后,如果使用`Ctrl+C`退出,则容器也会退出运行
345 |
346 |
347 | #### exec命令
348 |
349 | Docker提供了一个更加方便的工具exec,使用它可以直接在容器内运行命令。
350 |
351 | $ docker exec -it 9b3d /bin/bash
352 | root@9b3d40ebc289:/# ls
353 | bin dev home lib64 mnt proc run srv tmp var
354 | boot etc lib media opt root sbin sys usr
355 |
356 | ### 删除容器
357 |
358 | 使用`docker rm`命令删除处于终止状态的容器。
359 |
360 | docker rm [OPTIONS] CONTAINER [CONTAINER...]
361 |
362 | * -f --force=false 强制终止并删除一个运行中的容器
363 | * -l --link=false 删除容器的连接,但是保留容器
364 | * -v --volumes=false 删除容器挂载的数据卷
365 |
366 | ### 导出容器
367 |
368 | 使用导入容器命令可以实现将一个已经创建的容器导出到一个文件,一般可以用于容器的迁移。
369 |
370 | docker export CONTAINER
371 |
372 | 例如
373 |
374 | docker export 9b3d40 > container-migrate.tar
375 |
376 | 可以将导出的文件传输到其它机器上再进行导入。
377 |
378 | ### 导入容器
379 |
380 | 使用`docker import`命令导入容器作为镜像。
381 |
382 | $ cat container-migrate.tar| docker import - test/ubuntu
383 | sha256:7cae85635deaacdca3120196d9d068d6fc9980b73b2c904b80354a4ece3ceed5
384 | $ docker images
385 | REPOSITORY TAG IMAGE ID CREATED SIZE
386 | test/ubuntu latest 7cae85635dea 4 seconds ago 109.9 MB
387 |
388 | ## 0x05 基础命令 - 数据管理
389 | Docker 管理数据的两种主要的方法:
390 |
391 | - 数据卷
392 | - 数据卷容器
393 |
394 | ### 数据卷
395 | 数据卷是指在存在于一个或多个容器中的特定目录,此目录能够绕过Union File System提供一些用于持续存储或共享数据的特性。
396 |
397 | - 数据卷可在容器之间共享或重用
398 | - 数据卷中的更改可以直接生效
399 | - 数据卷中的更改不会包含在镜像的更新中
400 | - 数据卷的生命周期一直持续到没有容器使用它为止
401 |
402 | ### 之前提到一些初学者常犯的错误是把 Dockerfile 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:
403 |
404 | RUN cd /app
405 | RUN echo "hello" > world.txt
406 |
407 | 如果将这个 Dockerfile 进行构建镜像运行后,会发现找不到 /app/world.txt 文件,或者其内容不是 hello。原因其实很简单,在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令;而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。这就是对 Dokerfile 构建分层存储的概念不了解所导致的错误。
408 |
409 | ## 利用数据卷容器来备份、恢复、迁移数据卷
410 | 可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
411 |
412 | ### 备份
413 | 首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
414 |
415 | $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
416 |
417 | 容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 `backup.tar` 的文件。
418 |
419 | ### 恢复
420 | 如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
421 |
422 | $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
423 |
424 | 然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 `untar` 解压备份文件到挂载的容器卷中。
425 |
426 | $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
427 | /backup/backup.tar
428 |
429 | 为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
430 |
431 | $ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
432 |
433 | ## 0x08 基础命令 - 网络配置
434 |
435 | Docker目前提供了**映射容器端口到宿主主机**和**容器互联**的机制为容器提供网络服务。
436 |
437 | ### 端口映射
438 |
439 | 容器中运行了网络服务,我们可以通过`-P`或者`-p`参数指定端口映射。
440 |
441 | * **-P** Docker会随机映射一个49000-49900之间的端口到容器内部的开放端口。
442 | * **-p** 可以指定要映射的端口,格式为`ip:hostPort:containerPort`,可以多次使用`-p`指定多个映射的端口。
443 |
444 | 例如:
445 |
446 | docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
447 | docker run -d -p 5000:5000 training/webapp python app.py
448 | docker run -d -p 5000:5000/udp training/webapp python app.py
449 | docker run -d -P training/webapp python app.py
450 |
451 | > 使用`docker port [容器名称] 容器内端口` 查看端口映射绑定的地址。
452 |
453 | docker port nostalgic_morse 5000
454 |
455 | ### 容器互联通信
456 |
457 | 容器的链接(linking)系统是除了端口映射外的另一种容器应用之间交互的方式,它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
458 |
459 | 容器之间互联通过`--link`参数指定,格式为`--link name:alias`,其中name为要链接到的容器的名称,`alias`为这个连接的别名。
460 |
461 | docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=root mysql
462 | docker run --rm --name web --link mysql-demo:db ubuntu env
463 |
464 | 
465 |
466 |
467 | 使用`docker ps`可以看到容器的连接。
468 |
469 | Docker会在两个互联的容器之间创建一个安全的隧道,而且不用映射端口到宿主主机。Docker中通过两种方式为容器公开连接信息:
470 |
471 | * **环境变量** 环境变量的方式采用连接别名的大写前缀开头,比如前面的例子中,所有以`DB_`开头的环境变量。
472 | * **更新`/ect/hosts`文件** Docker也会添加host信息到父容器的`/etc/hosts`文件
473 |
474 | 查看`/etc/hosts`文件:
475 |
476 | docker run --rm --name web --link mysql-demo:db -i -t ubuntu /bin/bash
477 |
478 | 
479 |
480 |
481 | ## 0x06 Dockerfile
482 |
483 | Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
484 |
485 | ### 基本结构
486 |
487 | 一般来说,Dockerfile分为四部分:
488 |
489 | * 基础镜像信息
490 | * 维护者信息
491 | * 镜像操作指令
492 | * 容器启动时执行的指令
493 |
494 | ### 指令
495 |
496 | 指令一般格式为`INSTRUCTION arguments`。
497 |
498 | #### FROM
499 |
500 | 格式为`FROM `。第一条指令必须为`FROM`指令,指定了基础镜像。
501 |
502 | FROM ubuntu:latest
503 |
504 | #### MAINTAINER
505 |
506 | 格式为`MAINTAINER `指定维护者信息。
507 |
508 | MAINTAINER mylxsw mylxsw@aicode.cc
509 |
510 | #### RUN
511 |
512 | 格式为`RUN `或者`RUN ["executable", "param1", "param2"...]`。每条指令将在当前镜像的基础上执行,并提交为新的镜像。
513 |
514 | 格式`RUN `时将在shell终端中执行命令,也就是`/bin/sh -c`中执行,而`RUN ["executable", "param1", "param2"...]`则使用`exec`执行。
515 |
516 | #### CMD
517 |
518 | 该命令提供容器启动时执行的命令,每个Dockerfile中只能与一条CMD命令,如果指定了多条,则只有最后一条会被执行。如果用户启动容器的时候指定了运行的命令,则会覆盖CMD指令。
519 |
520 | 格式支持三种:
521 |
522 | * `CMD ["executable", "param1", "param2"] ` 使用exec执行
523 | * `CMD command param1 param2` 使用`/bin/sh -c`执行
524 | * `CMD ["param1", "param2"]` 提供给ENTRYPOINT的默认参数
525 |
526 | #### EXPOSE
527 |
528 | 格式为`EXPOSE [...]`,该指令用于告诉Docker容器要暴露的端口号,供互联系统使用。
529 |
530 | EXPOSE 22 80 8443
531 |
532 | 上述指令暴露了22, 80, 8443端口供互联的系统使用,使用的时候可以指定`-P`或者`-p`参数进行端口映射。
533 |
534 | #### ENV
535 |
536 | 格式为`ENV `。指定一个环境变量,会被后续的RUN指令使用,并且在容器运行时保持。
537 |
538 | 比如:
539 |
540 | ENV PG_MAJOR 9.3
541 | ENV PG_VERSION 9.35
542 |
543 | #### ADD
544 |
545 | 格式为`ADD `。该命令复制指定的``到``,其中` 如果``是tar包的话,会在dest位置**自动解压**为目录。
548 |
549 | #### COPY
550 |
551 | 格式为`COPY `,复制本地主机的``到容器的``,目标路径不存在则自动创建。使用本地目录为源目录时,推荐使用COPY。
552 |
553 | > 注意,`ADD`命令和`COPY`命令基本上是一样的,只不过是`ADD`命令可以复制网络资源,同时会对压缩包进行自动解压,而`COPY`则是单纯的复制本地文件(目录)。
554 |
555 | #### ENTRYPOINT
556 |
557 | 配置容器启动后执行的命令,并且不会被`docker run`提供的参数覆盖。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个的时候,只有最后一个生效。
558 |
559 | 格式有两种:
560 |
561 | * ENTRYPOINT ["executable", "param1", "param2"]
562 | * ENTRYPOINT command param1 param2
563 |
564 | #### VOLUME
565 |
566 | 格式为`VOLUME ["/data"]`,创建一个可以从本地主机或其它容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
567 |
568 | #### USER
569 |
570 | 格式为`USER daemon`,用于指定运行容器时的用户名或者UID,后续的RUN命令也会使用指定的用户。
571 |
572 | #### WORKDIR
573 |
574 | 格式为`WORKDIR /path/to/workdir`,用于为后续的RUN,CMD,ENTRYPOINT指令配置工作目录。
575 |
576 | 可以多次使用,如果后续指定的路径是相对路径,则会基于前面的路径。
577 |
578 | WORKDIR /a
579 | WORKDIR b
580 | RUN pwd
581 |
582 | 则最后得到的路径是`/a/b`。
583 |
584 | #### ONBUILD
585 |
586 | 指定基于该镜像创建新的镜像时自动执行的命令。格式为`ONBUILD [INSTRUCTION]`。
587 |
588 | ### 创建镜像
589 |
590 | 编写完Dockerfile之后,就可以通过`docker build`命令构建一个镜像了。
591 |
592 | > 可以通过`.dockerignore`指定忽略的文件和目录,类似于git中的`.gitignore`文件。
593 |
594 | 比如
595 |
596 | docker build -t build_repo/first_image /tmp/docker_builder
597 |
598 |
599 | ---
600 |
601 | 参考:
602 |
603 | - [Docker技术入门与实战 杨保卫 戴王剑 曹亚伦编著](https://www.gitbook.com/book/yeasy/docker_practice/details)
604 | - [Docker学习笔记](https://github.com/mylxsw/growing-up/blob/master/doc/Docker%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E5%9F%BA%E7%A1%80%E5%91%BD%E4%BB%A4.md)
605 | - [官方文档](https://docs.docker.com/)
606 |
607 | > 如果觉得我的文章对您有帮助,请随意打赏~
608 |
609 |
--------------------------------------------------------------------------------
/notes/lesson-3-how-to-build-a-Tomcat-image-with-Dockerfile-and-deploy-war/README.md:
--------------------------------------------------------------------------------
1 | 如何使用Dockerfile构建Tomcat镜像并部署war
2 | ===
3 | ## 0x01 前记
4 | ### 我们都知道Docker构建一个镜像有两种方式:
5 | 使用`docker commit`命令
6 | 使用`Dockerfile`文件和`docker build`命令
7 | ### 那么这两种方式有何区别呢?
8 | 相同点:底层实现上一样,最终都是通过`docker commit`生成镜像;
9 | 不同点:通过`Dockerfile`生成镜像,能够实现镜像文档化,使得镜像可读且易维护;
10 | 通过`docker build`生成镜像则相反,不能实现镜像文档化。
11 | ### 所以这篇文章采用Dockerfile来构建 :D
12 |
13 | ## 0x02准备工作
14 | ### 创建目录
15 |
16 | $ mkdir tomcat && cd tomcat # 创建一个目录来存放所需文件
17 | $ touch Dockerfile && vi Dockerfile # 编写Dockefile
18 | ### Dockerfile ([Tomcat其他版本](https://hub.docker.com/_/tomcat/))
19 | FROM tomcat:7-jre7 # tomcat7 + jre 7
20 | MAINTAINER "errorlife " # 维护者
21 | CMD ["catalina.sh", "run"] #启动tomcat shell执行程序
22 |
23 | ## 0x03 构建镜像
24 |
25 | ### 构建镜像
26 | $ sudo docker build -t errorlife/tomcat .
27 | # "-t",--tag,为当前镜像命名:errorlife/tomcat
28 | # ".", 指代当前目录
29 |
30 | ### 运行镜像
31 | $ sudo docker run -d -p 8080:8080 errorlife/tomcat
32 | # -d,--detach=false 指定容器运行于前台还是后台(-d即后台)
33 | # "-p",--port,指定宿主机的8080端口绑定到镜像暴露的8080端口
34 |
35 | ### 运行结果
36 |
37 | 1. 你可以使用`curl`命令确定是否正确部署成功
38 |
39 | $ curl http://docker.steffan.cn:8080/
40 | 2. 使用浏览器访问http://ip:8080/
41 |
42 | 
43 |
44 | 当你见到熟悉的汤姆猫的时候,就证明你构建成功了。
45 |
46 | ### 部署war包
47 |
48 | 1. 将[war包](https://pan.baidu.com/s/1gfMaY7x)上传到与`Dockerfile`文件同一目录(即tomcat)
49 | 我使用的是[WinSCP](https://winscp.net/eng/download.php),个人觉得好用到不行=。=
50 | 2. 重新编写Dockerfile:
51 |
52 | $ vi Dockerfile
53 |
54 | 3. Dockerfile:
55 |
56 | FROM tomcat:7-jre7
57 | MAINTAINER "errorlife "
58 | ADD dockertest.war /usr/local/tomcat/webapps/ #将war包添加进webapps中
59 | CMD ["catalina.sh", "run"] #启动tomcat shell执行程序
60 |
61 | 4. 运行结果
62 | 
63 |
64 | ## 0x04 其他配置文件
65 | ### 应用场景
66 | 由于一些项目需要修改tomcat的`context.xml`,`setting.xml`,`tomcat-user.xml`等,还有一些`tomcat的lib包`,甚至是添加一些独有的`授权文件`,那么也应该在`dockerfile`中`add`进去,而不是直接放到`Linux`的文件管理系统中。
67 |
68 | ### Show一下我的Dockerfile
69 |
70 | FROM tomcat:7-jre7
71 | MAINTAINER "errorlife "
72 |
73 | ADD settings.xml /usr/local/tomcat/conf/
74 | ADD tomcat-users.xml /usr/local/tomcat/conf/
75 | ADD config/license.xml
76 |
77 | ADD classes12.jar /usr/local/tomcat/lib
78 | ADD ojdbc6.jar /usr/local/tomcat/lib
79 | ADD oracle-jdbc-10.2.jar /usr/local/tomcat/lib
80 | ADD context.xml /usr/local/tomcat/conf/
81 | ADD xxx.war /usr/local/tomcat/webapps/
82 | CMD ["catalina.sh", "run"]
83 |
84 | ### 结论:docker会将这些文件添加到tomcat镜像内部的路径
85 |
86 | ## 0x04 参考资料
87 | [Docker自动部署Apache Tomcat](http://dockone.io/article/285)
88 | [通过Dockerfile和通过commit生成镜像有什么区别?](http://www.aixchina.net/Question/172781)
89 | 网络素材
90 |
91 |
92 | > 如果觉得我的文章对您有帮助,请随意打赏~
93 |
94 |
--------------------------------------------------------------------------------
/notes/lesson-4-manage-a-swarm/README.md:
--------------------------------------------------------------------------------
1 | lesson-4-manage-a-swarm
2 | ===
3 | [Manage-a-swarm(官方文档翻译)](https://docs.docker.com/engine/swarm/)
4 |
5 | 笔记列表
6 | - Class 3 [Getting started with swarm mode](class-3-getting-started-with-swarm-mode/README.md)
7 |
8 | 如果笔记有什么纰漏,或者有问题都可以到[Issue区](https://github.com/errorlife/docker_learn/issues)讨论 :)
9 |
10 | > 如果觉得我的文章对您有帮助,请随意打赏~
11 |
12 |
13 |
--------------------------------------------------------------------------------
/notes/lesson-4-manage-a-swarm/class-3-getting-started-with-swarm-mode/README.md:
--------------------------------------------------------------------------------
1 | lesson-4-manage-a-swarm
2 | ===
3 | [Manage-a-swarm(官方文档翻译)](https://docs.docker.com/engine/swarm/)
4 |
5 | 笔记列表
6 | class-3-getting-started-with-swarm-mode
7 | ===
8 | - Section 1 [Set up for the tutorial](section-1-set-up-for-the-tutorial/README.md)
9 | - Section 2 [Create a swarm](section-2-create-a-swarm/README.md)
10 |
11 |
12 | 如果笔记有什么纰漏,或者有问题都可以到[Issue区](https://github.com/errorlife/docker_learn/issues)讨论 :)
13 |
14 | > 如果觉得我的文章对您有帮助,请随意打赏~
15 |
16 |
17 |
--------------------------------------------------------------------------------
/notes/lesson-4-manage-a-swarm/class-3-getting-started-with-swarm-mode/section-1-set-up-for-the-tutorial/README.md:
--------------------------------------------------------------------------------
1 | # 开始使用swarm集群
2 | #### 预计阅读时间:4分钟
3 |
4 | 本教程向您介绍`Docker`引擎`swarm`模式的特点。在开始之前,你可能需要熟悉一些[关键概念](https://docs.docker.com/engine/swarm/key-concepts/)。
5 |
6 | 本教程将包含如下几点:
7 |
8 | * 在`swarm`模式下初始化一个`Docker`引擎的集群
9 | * 添加节点到`swarm`
10 | * 部署应用程序服务到`swarm`
11 | * 当运行服务后开始进行`swarm`管理
12 |
13 | 本教程在终端窗口的命令行上输入`Docker`引擎`CLI`命令。你可以在联网的机器上安装`Docker`,并且在你选择的`shell`中舒适地运行命令。
14 |
15 | 如果你对Docker了解甚少,可以看看关于[Docker引擎](https://docs.docker.com/engine/)
16 |
17 | ## 设置
18 |
19 | 学习本教程所需要准备:
20 |
21 | * 三台连通网络的机器
22 | * `Docker`引擎1.12版本或者更新的版本
23 | * 作为管理者机器的IP地址
24 | * 三台主机之间的开放端口
25 |
26 | ### 三台连通网络的机器
27 |
28 | 本教程在`swarm`中使用三个网络主机作为节点。这些可以是在你的PC上的虚拟机,也可以是在数据中心,或者是云服务提供商。本教程使用下列机器名:
29 |
30 | * manager1(管理者1)
31 | * worker1(工人1)
32 | * worker2(工人2)
33 |
34 | Note:你可以遵循许多教程步骤来测试单节点`swarm`,在这种情况下,你只需要一个主机。多节点命令将无法工作,但你可以初始化一个`swarm`,创建服务,并规模化它们。
35 |
36 | ### `Docker`引擎1.12版本或者更新的版本
37 |
38 | 本教程要求每一台主机都必须安装版本为1.12或者更新的版本的`Docker`引擎。请安装`Docker`引擎并确认每一台主机的Docker 引擎`daemon`(守护进程)都是开启的状态。你可以通过以下的步骤去获取最新版的`Docker`引擎:
39 |
40 | * 在`Liunx`机器上安装`Docker`引擎
41 | * 在`Mac`或者`Windows`下使用`Docker`
42 |
43 | #### 在`Liunx`机器上安装`Docker`引擎
44 |
45 | 如果您使用的是基于Linux的物理计算机或云服务提供商提供的计算机作为主机,只需为你的平台按照[`Linux的安装说明`](https://docs.docker.com/engine/installation/)安装。当你安装完后,启动这三台机器。然后你就可以在Linux机器上测试单节点和多节点`swarm`场景了。
46 |
47 | #### 在`Mac`或者`Windows`下使用`Docker`
48 |
49 | 另外,在一台计算机上安装最新的`Docker for Mac`或`Docker for Windows`应用程序。 您可以用此计算机测试单节点和多节点`swarm`,但是你将需要使用`Docker Machine`来测试多节点方案。
50 |
51 | * 您可以使用`Docker for Mac`或`Windows`来测试`swarm`模式的单节点功能,包括初始化具有单个节点的`swarm`,创建服务和扩展服务。 `Docker"Moby"`在`Hyperkit(Mac)`或`Hyper-V(Windows)`将作为单个`swarm`节点。
52 |
53 | * 目前,您不能使用`Docker for Mac`或`Windows`单独测试多节点`swarm`。 但是,您可以使用包含的`Docker Machine`版本创建`swarm`节点(请参阅`Docker Machine`和本地`VM`入门),然后按照教程了解所有多节点功能。 对于这种情况,您从`Docker for Mac`或`Docker for Windows`主机运行命令,但是Docker主机本身不参与群集(即,在我们的示例中它不会是`manager1`,`worker1`或`worker2`)。 创建节点后,您可以运行所有`swarm`命令,如`Mac`终端或`Windows PowerShell`所示,使用`Docker for Mac`或`Docker for Windows`运行。
54 |
55 | ### 作为管理者机器的IP地址
56 |
57 | IP地址必须分配给主机操作系统可用的网络接口。`swarm`中的所有节点必须能够访问IP地址处的管理器。
58 |
59 | 因为其他节点在其`IP`地址上联系管理器节点,您应该使用固定的`IP`地址。
60 |
61 | 您可以在`Linux`或`macOS`上运行`ifconfig`以查看可用网络接口的列表。
62 |
63 | 如果你使用`Docker Machine`,你可以使用`docker-machine ls`或`docker-machine ip `来获取管理器`IP`,例如`docker-machine ip manager1`。
64 |
65 | 本教程使用`manager1`:`192.168.99.100`。
66 |
67 | ### 三台主机之间的开放端口
68 |
69 | 下列端口必须可用。在某些系统中,这些端口默认打开。
70 |
71 | * TCP端口2377用于集群管理通信
72 | * TCP和UDP端口7946用于节点之间的通信
73 | * UDP端口4789用于覆盖网络流量
74 |
75 | 如果您计划创建具有加密(--opt加密)的覆盖网络,您还需要确保允许ip协议50(ESP)流量。
76 |
77 | ## 下一步呢?
78 | 设置环境后,就可以创建一个[`swarm`](../section-2-create-a-swarm/README.md)
79 | > 如果觉得我的文章对您有帮助,请随意打赏~
80 |
81 |
--------------------------------------------------------------------------------
/notes/lesson-4-manage-a-swarm/class-3-getting-started-with-swarm-mode/section-2-create-a-swarm/README.md:
--------------------------------------------------------------------------------
1 | # 创建一个swarm
2 | #### 预计阅读时间:2分钟
3 |
4 | 当你完成教程安装步骤之后,就可以创建一个`swarm`。确保`Docker Engine`守护进程已经开始在主机上工作了。
5 |
6 | 1、打开终端或者用ssh连接到管理器机器,本教程使用名为manager1的机器。 如果使用`Docker Machine`,您可以使用以下命令通过SSH连接到它:
7 |
8 | $ docker-machine ssh manager1
9 |
10 | 2、运行下面的命令创建一个新的`swarm`
11 |
12 | $ docker swarm init --advertise-addr
13 |
14 | 注意:如果您使用`Docker for Mac`或`Docker for Windows`测试单节点`swarm`,只需运行没有参数的`docker swarm init`。 在这种情况下,不需要指定`--advertise-addr`。 要了解更多信息,请参阅有关如何[使用`Docker for Mac`或`Docker for Windows` 的`swarm`主题](https://docs.docker.com/engine/swarm/swarm-tutorial/#use-docker-for-mac-or-docker-for-windows)。
15 |
16 | 在本教程中,以下命令在manager1计算机上创建一个`swarm`:
17 |
18 | $ docker swarm init --advertise-addr 192.168.99.100
19 | Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
20 |
21 | 若要向该`swarm`添加工作人员,请运行以下命令:
22 |
23 | docker swarm join \
24 | --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
25 | 192.168.99.100:2377
26 |
27 | 若要向此群集添加管理器,请运行“`docker swarm join-token manager`”并按照说明操作。
28 |
29 | `--advertise-addr`标志配置管理器节点公布其地址为`192.168.99.100`。 `swarm`中的其他节点必须能够通过IP地址访问管理器。 输出包括将新节点加入`swarm`的命令。节点将作为管理器或工作人员加入(`swarm`),具体取决于`--token`标志的值。
30 |
31 | 3、运行`docker info`查看`swarm`的当前状态:
32 |
33 | $ docker info
34 |
35 | Containers: 2
36 | Running: 0
37 | Paused: 0
38 | Stopped: 2
39 | ...snip...
40 | Swarm: active
41 | NodeID: dxn1zf6l61qsb1josjja83ngz
42 | Is Manager: true
43 | Managers: 1
44 | Nodes: 1
45 | ...snip...
46 |
47 | 4、运行`docker node ls`命令查看关于节点的信息
48 |
49 | $ docker node ls
50 |
51 | ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
52 | dxn1zf6l61qsb1josjja83ngz `*` manager1 Ready Active Leader
53 |
54 | 在节点ID旁边的`*`表示你当前正在连接这个节点。
55 | `Docker`引擎`swarm`模式自动为机器主机名的节点命名。本教程涵盖后续步骤中的其他专栏。
56 |
57 | ## 下一步呢?
58 |
59 | 在教程的下一节中,我们将在集群中[添加两个节点](https://docs.docker.com/engine/swarm/swarm-tutorial/add-nodes/)。
60 |
61 | > 如果觉得我的文章对您有帮助,请随意打赏~
62 |
63 |
--------------------------------------------------------------------------------
/notes/lesson-5-docker-common-mistakes-and-tricks/README.md:
--------------------------------------------------------------------------------
1 | Docker日常坑和技巧
2 | ===
3 | ## Mistakes
4 |
5 | ### 报错一:docker: Error response from daemon: Conflict. The name "/xxx" is already in use by container
6 | #### 解决方案:
7 | $ docker ps -a #找到xxx的container_id
8 | $ docker stop xxx(container_id) # 停止该容器
9 | $ docker rm xxx(container_id) # 删除该容器
10 |
11 | #### 执行过程(如果没有停止就删除容器,会报:you cannot remove a running container错误):
12 | [root@VM_169_236_centos ~]# docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
13 | docker: Error response from daemon: Conflict. The name "/web" is already in use by container cbb2de760d33053ca3a3521757afb83fb3ebaf811171e549f1a65589f4523130. You have to remove (or rename) that container to be able to reuse that name..
14 | See 'docker run --help'.
15 | [root@VM_169_236_centos ~]# docker ps -a
16 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17 | cbb2de760d33 training/webapp "python app.py" 12 minutes ago Up 12 minutes 0.0.0.0:32771->5000/tcp web
18 | 9bb014f2d683 training/postgres "su postgres -c '/usr" About an hour ago Up About an hour 5432/tcp db
19 | 000df6e54733 ubuntu "/bin/bash" 3 hours ago Up 3 hours networktest
20 | a2f0de3946eb errorlife/sinatra:v2 "/bin/bash" 4 hours ago Exited (0) 4 hours ago amazing_roentgen
21 | 1254186ac498 09c56268cc94 "/bin/bash" 5 hours ago Exited (0) 5 hours ago nauseous_pare
22 | 5dbc52edff97 training/sinatra "/bin/bash" 5 hours ago Exited (0) 5 hours ago sick_shirley
23 | 7d47fecc127b training/webapp "python app.py" 45 hours ago Up 28 hours 0.0.0.0:80->5000/tcp kickass_mirzakhani
24 | 351461d3f808 ubuntu "/bin/" 45 hours ago Created elegant_fermat
25 | [root@VM_169_236_centos ~]# docker rm cbb2de760d33
26 | Error response from daemon: You cannot remove a running container cbb2de760d33053ca3a3521757afb83fb3ebaf811171e549f1a65589f4523130. Stop the container before attempting removal or use -f
27 | [root@VM_169_236_centos ~]# docker stop cbb2de760d33
28 | cbb2de760d33
29 | [root@VM_169_236_centos ~]# docker rm cbb2de760d33
30 | cbb2de760d33
31 |
32 | ### 巨坑一:运行tomcat7/8时间非常长
33 | #### 解决方案[英文版](http://stackoverflow.com/questions/26431922/tomcat7-starts-too-late-on-ubuntu-14-04-x64-digitalocean/26432537#26432537) [中文版](https://my.oschina.net/wangnian/blog/687914):
34 | * 在Tomcat环境中解决
35 | 可以通过配置JRE使用非阻塞的Entropy Source。
36 | 在`catalina.sh`中加入这么一行:`-Djava.security.egd=file:/dev/./urandom `即可。
37 | 加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。
38 |
39 | * 在JVM环境中解决
40 | 打开`$JAVA_PATH/jre/lib/security/java.security`这个文件,找到下面的内容
41 | ```
42 | securerandom.source=file:/dev/random
43 | ```
44 | 替换成
45 | ```
46 | securerandom.source=file:/dev/./urandom
47 | ```
48 |
49 | ## Tricks
50 |
51 | ### 技巧一:强制批量删除none的image镜像(强迫症不能忍.jpg)
52 |
53 | docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
54 | docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
55 | docker images|grep none|awk '{print $3 }'|xargs docker rmi
56 |
57 | ### 技巧二:docker images的用法
58 |
59 | https://yeasy.gitbooks.io/docker_practice/content/image/list.html
60 |
61 | ### 技巧三: 清理掉无关文件(Dockerfile)
62 |
63 | --auto-remove $buildDeps
64 |
65 | 很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的最后一定要清理掉无关文件。
66 |
67 | ### 技巧四:批量删除容器/镜像
68 | docker rm $(docker ps -q -a) 一次性删除所有的容器
69 |
70 | docker rmi $(docker images -q) 一次性删除所有的镜像
71 |
72 | ### 技巧五:解决Docker 运行的容器时间不对的问题
73 | 启动容器时候加一下 `-v /etc/localtime:/etc/localtime`,容器里面就会跟host一个时区了
74 | 也可以在Dockerfile里面指定。
75 |
76 |
77 | > 如果觉得我的文章对您有帮助,请随意打赏~
78 |
79 |
80 |
--------------------------------------------------------------------------------
/res/wxmoney.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/errorlife/docker_learn/cce2935c87b29885342d77772a842a39539c24b8/res/wxmoney.jpg
--------------------------------------------------------------------------------