Docker学习6-Dockerfile定制镜像2
Docker 停止一个运行的容器
docker stop <id>
1 2 3 4 5 6 7 db5c8940e5a tomcat "catalina.sh run" 29 minutes ago Up 29 minutes 0.0.0.0: 8081 ->8080 /tcp dreamy_moore[root@MyCentOS ]~ 898 [root@MyCentOS ]~ 7 db[root@MyCentOS ]~
自己配置镜像
这个是用户经常操作的目录所有把文件存放在这里,所有和docker相关的都在里面
1 2 3 4 5 6 7 [root@MyCentOS] ~# cd /usr/local [root@MyCentOS] /usr/local # [root@MyCentOS] /usr/local # mkdir docker [root@MyCentOS] /usr/local # cd docker [root@MyCentOS] /usr/local /docker# mkdir tomcat [root@MyCentOS] /usr/local /docker# cd tomcat [root@MyCentOS] /usr/local /docker/tomcat# vi Dockerfile
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN
Dockerfile脚本开始
1 2 3 4 5 FROM tomcatRUN echo '<h1>Hello, Docker!</h1>' > /usr/local /tomcat/webapps/ROOT/index.jsp ~ ~ ~
FROM指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
RUN 执行命令
RUN执行命令行命令的命令
所有的Dockerfile第一行都必须是FROM命令,RUN 指令在定制镜像时是最常用的指令之一
shell格式:RUN
就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
1 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.jsp
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式
既然 RUN 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样:
Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。
而上面的这种写法,创建了 7 层镜像。这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学 Docker 的人常犯的一个错误。
Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。
1 2 3 4 5 6 7 8 9 FROM debian:jessieRUN apt-get updateRUN apt-get install -y gcc libc6-dev makeRUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" RUN mkdir -p /usr/src/redisRUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components =1RUN make -C /usr/src/redisRUN make -C /usr/src/redis install
上面的 Dockerfile 正确的写法应该是这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 FROM debian:jessie RUN buildDeps='gcc libc6-dev make' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \ && mkdir -p /usr/ src/redis \ && tar -xzf redis.tar.gz -C /u sr/src/ redis --strip-components=1 \ && make -C /usr/ src/redis \ && make -C /u sr/src/ redis install \ && rm -rf /var/ lib/apt/ lists/* \ && rm redis.tar.gz \ && rm -r /u sr/src/ redis \ && apt-get purge -y --auto-remove $buildDeps
以交互的方式启动一条命令
~ sudo docker run -it --rm tomcat bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ➜ ~ sudo docker run -it --rm tomcat bash root@14630cb2f338:/usr/local/tomcat# ls -al total 160 drwxr-sr-x 1 root staff 4096 Aug 22 00 :26 . drwxrwsr-x 1 root staff 4096 Aug 15 05 :20 .. -rw-r--r-- 1 root root 19534 Aug 14 22 :27 BUILDING.txt -rw-r--r-- 1 root root 5407 Aug 14 22 :27 CONTRIBUTING.md -rw-r--r-- 1 root root 57011 Aug 14 22 :27 LICENSE -rw-r--r-- 1 root root 1726 Aug 14 22 :27 NOTICE -rw-r--r-- 1 root root 3255 Aug 14 22 :27 README.md -rw-r--r-- 1 root root 7139 Aug 14 22 :27 RELEASE-NOTES -rw-r--r-- 1 root root 16262 Aug 14 22 :27 RUNNING.txt drwxr-xr-x 2 root root 4096 Aug 22 00 :26 bin drwxr-sr-x 2 root root 4096 Aug 14 22 :27 conf drwxr-sr-x 2 root staff 4096 Aug 22 00 :26 include drwxr-xr-x 2 root root 4096 Aug 22 00 :26 lib drwxrwxrwx 2 root root 4096 Aug 14 22 :24 logs drwxr-sr-x 3 root staff 4096 Aug 22 00 :26 native-jni-lib drwxr-xr-x 2 root root 4096 Aug 22 00 :26 temp drwxr-xr-x 7 root root 4096 Aug 14 22 :24 webapps drwxrwxrwx 2 root root 4096 Aug 14 22 :24 work root@14630cb2f338:/usr/local/tomcat# cd webapps/ROOT/ root@14630cb2f338:/usr/local/tomcat/webapps/ROOT# ls RELEASE-NOTES.txt bg-button.png bg-upper.png tomcat-power.gif tomcat.png WEB-INF bg-middle.png favicon.ico tomcat.css tomcat.svg asf-logo-wide.svg bg-nav.png index.jsp tomcat.gif root@14630cb2f338:/usr/local/tomcat/webapps/ROOT# root@14630cb2f338:/usr/local/tomcat/webapps/ROOT# pwd /usr/local/tomcat/webapps/ROOT
查看脚本
1 2 3 4 [root@MyCentOS]/usr/ local/docker/ tomcat FROM tomcat RUN echo '<h1>Hello, Docker!</h1>' > /usr/ local/tomcat/ webapps/ROOT/i ndex.html
构建镜像
在 Dockerfile 文件所在目录执行:
docker build [选项] <上下文路径/URL/->
docker build -t <name> .
docker build -t <name> <Dockerfile>
1 2 3 4 5 6 7 8 9 10 11 [root@MyCentOS] /usr/local /docker/tomcat# docker build -t mytomcatdocker . Sending build context to Docker daemon 2.048 kB Step 1 /2 : FROM tomcat ---> 96 c4e536d0eb Step 2 /2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/local /tomcat/webapps/ROOT/index.html ---> Running in 5 d88c8eacd22 Removing intermediate container 5 d88c8eacd22 ---> 12 aa14e2403d Successfully built 12 aa14e2403d Successfully tagged mytomcatdocker:latest [root@MyCentOS] /usr/local /docker/tomcat#
RUN指令启动了一个容器 5d88c8eacd22 执行了所要求的命令,并最后提交了这一层 12aa14e2403d 随后删除了 5d88c8eacd22
1 2 3 4 5 6 7 8 ➜ ~ sudo docker images [sudo] password for ziming: REPOSITORY TAG IMAGE ID CREATED SIZE mytomcatdocker latest 12aa14e2403d 6 minutes ago 506MB 1.16 .1 latest 97423576f288 3 weeks ago 126MB tomcat latest 96c4e536d0eb 4 weeks ago 506MB nginx 1.16 .1 41e97992fcd8 5 weeks ago 126MB ubuntu 16.04 5e13f8dd4c1a 8 weeks ago 120MB
1 2 ~ sudo docker run -it mytomcatdocker bash root@8de78a99decd :/usr/local/tomcat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 root@8de78a99decd:/usr/local/tomcat# ls -al total 160 drwxr-sr-x 1 root staff 4096 Aug 22 00 :26 . drwxrwsr-x 1 root staff 4096 Aug 15 05 :20 .. -rw-r--r-- 1 root root 19534 Aug 14 22 :27 BUILDING.txt -rw-r--r-- 1 root root 5407 Aug 14 22 :27 CONTRIBUTING.md -rw-r--r-- 1 root root 57011 Aug 14 22 :27 LICENSE -rw-r--r-- 1 root root 1726 Aug 14 22 :27 NOTICE -rw-r--r-- 1 root root 3255 Aug 14 22 :27 README.md -rw-r--r-- 1 root root 7139 Aug 14 22 :27 RELEASE-NOTES -rw-r--r-- 1 root root 16262 Aug 14 22 :27 RUNNING.txt drwxr-xr-x 2 root root 4096 Aug 22 00 :26 bin drwxr-sr-x 2 root root 4096 Aug 14 22 :27 conf drwxr-sr-x 2 root staff 4096 Aug 22 00 :26 include drwxr-xr-x 2 root root 4096 Aug 22 00 :26 lib drwxrwxrwx 2 root root 4096 Aug 14 22 :24 logs drwxr-sr-x 3 root staff 4096 Aug 22 00 :26 native-jni-lib drwxr-xr-x 2 root root 4096 Aug 22 00 :26 temp drwxr-xr-x 1 root root 4096 Aug 14 22 :24 webapps drwxrwxrwx 2 root root 4096 Aug 14 22 :24 work
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 root@8de78a99decd:/usr/local/tomcat# cd webapps/ROOT/ root@8de78a99decd:/usr/local/tomcat/webapps/ROOT# root@8de78a99decd:/usr/local/tomcat/webapps/ROOT# ls -al total 196 drwxr-xr-x 1 root root 4096 Sep 20 01 :34 . drwxr-xr-x 1 root root 4096 Aug 14 22 :24 .. -rw-r--r-- 1 root root 7139 Aug 14 22 :27 RELEASE-NOTES.txt drwxr-xr-x 2 root root 4096 Aug 22 00 :26 WEB-INF -rw-r--r-- 1 root root 27235 Aug 14 22 :27 asf-logo-wide.svg -rw-r--r-- 1 root root 713 Aug 14 22 :24 bg-button.png -rw-r--r-- 1 root root 1918 Aug 14 22 :24 bg-middle.png -rw-r--r-- 1 root root 1401 Aug 14 22 :24 bg-nav.png -rw-r--r-- 1 root root 3103 Aug 14 22 :24 bg-upper.png -rw-r--r-- 1 root root 21630 Aug 14 22 :24 favicon.ico -rw-r--r-- 1 root root 24 Sep 20 01 :34 index.html -rw-r--r-- 1 root root 12208 Aug 14 22 :27 index.jsp -rw-r--r-- 1 root root 2376 Aug 14 22 :24 tomcat-power.gif -rw-r--r-- 1 root root 5581 Aug 14 22 :27 tomcat.css -rw-r--r-- 1 root root 2066 Aug 14 22 :24 tomcat.gif -rw-r--r-- 1 root root 5103 Aug 14 22 :24 tomcat.png -rw-r--r-- 1 root root 67795 Aug 14 22 :27 tomcat.svg
index.html存在了
1 2 root@8de78a99decd :/usr/local/tomcat/webapps/ROOT <h1>Hello, Docker!</h1>
删除index.jsp
但是我不想要index.jsp,所以需要在dockerfile脚本中删除ROOT下所有的东西这样,我暴露8081端口的时候只能看到index.html中的内容
1 2 3 4 ➜ ~ cd /usr/local/docker/tomcat ➜ tomcat ls Dockerfile ➜ tomcat
1 2 3 4 5 FROM tomcatRUN cd /usr/local /tomcat/webapps/ROOT/ RUN rm -fr * RUN echo '<h1>Hello, Docker!</h1>' > /usr/local /tomcat/webapps/ROOT/index.html
重复先前的操作
删除掉原先创建的镜像
sudo docker image rm 12a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ➜ tomcat sudo docker build -t mydocker . Sending build context to Docker daemon 2.048 kB Step 1 /4 : FROM tomcat Step 2 /4 : RUN cd /usr/local /tomcat/webapps/ROOT/ Removing intermediate container 582 adfa700d2 Step 3 /4 : RUN rm -fr * Removing intermediate container 0637 d8d5df11 Step 4 /4 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/local /tomcat/webapps/ROOT/index.html /bin/sh: 1 : cannot create /usr/local /tomcat/webapps/ROOT/index.html: Directory nonexistent The command '/bin/sh -c echo ' <h1 >Hello , Docker !</h1 >' > /usr/local/tomcat/webapps/ROOT/index.html' returned a non-zero code : 2 ➜ tomcat docker images Got permission denied while trying to connect to the Docker daemon socket at unix: ➜ tomcat sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none > <none > 137 fe42507bf About a minute ago 506 MB 1.16 .1 latest 97423576 f288 3 weeks ago 126 MBtomcat latest 96 c4e536d0eb 4 weeks ago 506 MB nginx 1.16 .1 41e97992 fcd8 5 weeks ago 126 MB ubuntu 16.04 5e13 f8dd4c1a 8 weeks ago 120 MB ➜ tomcat
在创建过程中RUN rm -rf *
连着ROOT也一起删除了所有会报错,所以新的镜像成为了虚悬镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # Dockerfile脚本开始 FROM tomcat WORKDIR /usr/local/tomcat/webapps/ROOT/ RUN rm -fr * RUN echo '<h1>Hello, Docker!</h1>' > /usr/local/tomcat/webapps/ROOT/index.html ➜ tomcat sudo docker build -t mydocker . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM tomcat ---> 96c4e536d0eb Step 2/4 : WORKDIR /usr/local/tomcat/webapps/ROOT/ ---> Running in 57f471bc028d Removing intermediate container 57f471bc028d ---> 9350deb03d0d Step 3/4 : RUN rm -fr * ---> Running in dbaf4d7ad1d1 Removing intermediate container dbaf4d7ad1d1 ---> f6814fab3fe4 Step 4/4 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/local/tomcat/webapps/ROOT/index.html ---> Running in 91aa52622c26 Removing intermediate container 91aa52622c26 ---> 4691fd38efff Successfully built 4691fd38efff Successfully tagged mydocker:latest ➜ tomcat sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE mydocker latest 4691fd38efff 34 seconds ago 506MB <none> <none> 137fe42507bf 6 minutes ago 506MB 1.16.1 latest 97423576f288 3 weeks ago 126MB tomcat latest 96c4e536d0eb 4 weeks ago 506MB nginx 1.16.1 41e97992fcd8 5 weeks ago 126MB ubuntu 16.04 5e13f8dd4c1a 8 weeks ago 120MB ➜ tomcat sudo docker run -it 4691 bash root@33d9191d7b3b:/usr/local/tomcat/webapps/ROOT# ls index.html root@33d9191d7b3b:/usr/local/tomcat/webapps/ROOT# cat index.html <h1>Hello, Docker!</h1>
** notice 各个相同源镜像的空间是公用的 **
docker image prune
删除虚悬镜像
1 ➜ tomcat sudo docker run -p 8081:8080 4691
查看网页是否成功
docker的又一大特性出现了,与运行环境无关,真正做到了一次构建,到处运行.