Docker系列-4.构建镜像
创建镜像的既可以在已有的镜像上修改创建,也可以从头开始构建一个全新的镜像。
使用 docker commit
命令可以在已有的镜像上修改创建出新的镜像,创建之前首先要理解docker分层的概念
Docker镜像分层
每个镜像都是由多个镜像层组成的,镜像层中每一层都是只读的,以栈的方式组合在一起组成容器的根文件系统。而在
使用docker history
查看image的各个layer
[root@localhost ~]# docker history ubuntu
IMAGE CREATED CREATED BY SIZE COMMENT
1e4467b07108 8 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 8 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
<missing> 8 days ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 1.01MB
<missing> 8 days ago /bin/sh -c #(nop) ADD file:65a1cc50a9867c153… 72.9MB
[root@localhost ~]# docker images
使用dive工具查看image分层
持久化容器生成镜像
通过 docker commit
命令可以提交对容器作出的修改,并创建一个新镜像,这有点像为容器保存一个快照。
实例化镜像并修改
[root@localhost ~]# docker run -it ubuntu /bin/bash
root@c8feedc715e6:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
......
Fetched 14.3 MB in 19s (747 kB/s)
Reading package lists... Done
root@c8feedc715e6:/# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8feedc715e6 ubuntu "/bin/bash" About a minute ago Exited (0) 13 seconds ago practical_curran
d0058bbeea30 httpd "httpd-foreground" 5 days ago Exited (0) 5 days ago sharp_hoover
e40604d8e4cd nginx "/docker-entrypoint.…" 5 days ago Created focused_kirch
4a10d126524f ubuntu "bash" 5 days ago Exited (255) About an hour ago brave_goldwasser
8fb045bce0da hello-world "/hello" 5 days ago Exited (0) 5 days ago flamboyant_lichterman
提交容器变更到镜像文件
##提交容器变更到镜像文件
[root@localhost ~]# docker commit c8feedc715e6 ubuntu:update
sha256:3c7832c9920b1d9aec4bbab7e7638e119a6da0570c700a2a055c9a958f435768
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu update 3c7832c9920b 22 seconds ago 96.4MB
ubuntu latest 1e4467b07108 8 days ago 73.9MB
httpd latest 9d2a0c6e5b57 10 days ago 166MB
nginx latest 8cf1bfb43ff5 11 days ago 132MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
[root@localhost ~]# docker history 3c7832c9920b
IMAGE CREATED CREATED BY SIZE COMMENT
3c7832c9920b 13 minutes ago /bin/bash 22.6MB
1e4467b07108 8 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 8 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 811B
<missing> 8 days ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 1.01MB
<missing> 8 days ago /bin/sh -c #(nop) ADD file:65a1cc50a9867c153… 72.9MB
此时就可以基于刚创建的 ubuntu:update 镜像启动新的容器。
使用Dockerfile创建镜像
Dockerfile
Dockerfile是自动化创建新镜像的指令脚本文件,采用YML格式,由docker build执行。
Dockerfile指令
Dockerfile指令即Dockerfile文件中的关键字,每一条指令执行后都会产生一个分层。
Docker build
[root@localhost ~]# docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
在Dockerfile文件所在目录下执行docker build -t imageName:tag .
构建Redis镜像
[root@localhost redis]# cat Dockerfile
FROM centos
RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-4.0.14.tar.gz .
WORKDIR /usr/local/redis-4.0.14/src
RUN make && make install
WORKDIR /usr/local/redis-4.0.14
ADD redis-7000.conf .
EXPOSE 7000
CMD ["redis-server","redis-7000.conf"]
[root@localhost redis]# docker build -t redis:4.0.14_man .
Sending build context to Docker daemon 1.745MB
Step 1/10 : FROM centos
---> 831691599b88
Step 2/10 : RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
---> Running in 759cd5943ce6
Removing intermediate container 759cd5943ce6
---> fd38bdc0ae61
Step 3/10 : WORKDIR /usr/local
Removing intermediate container c80c5dd3a4a4
---> dc55a6f5baa4
Step 4/10 : ADD redis-4.0.14.tar.gz .
---> 2695590345d1
Step 5/10 : WORKDIR /usr/local/redis-4.0.14/src
Removing intermediate container e6090aec2eb4
---> 3d23c6fa17c2
Step 6/10 : RUN make && make install
---> Running in b2b0db9554ff
Removing intermediate container b2b0db9554ff
---> c719401c0f14
Step 7/10 : WORKDIR /usr/local/redis-4.0.14
Removing intermediate container 43376035527b
---> 2d9d3d7bf714
Step 8/10 : ADD redis-7000.conf .
---> fa5a5f6c0f0c
Step 9/10 : EXPOSE 7000
---> Running in 5cdd65243ad7
Removing intermediate container 5cdd65243ad7
---> 4aa95d591516
Step 10/10 : CMD ["redis-server","redis-7000.conf"]
---> Running in c9db88798322
Removing intermediate container c9db88798322
---> 508b9f6e5405
Successfully built 508b9f6e5405
Successfully tagged redis:4.0.14_man
验证镜像
[root@localhost redis]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 4.0.14_man 508b9f6e5405 6 minutes ago 497MB
ubuntu update 3c7832c9920b 2 hours ago 96.4MB
ubuntu latest 1e4467b07108 9 days ago 73.9MB
httpd latest 9d2a0c6e5b57 10 days ago 166MB
nginx latest 8cf1bfb43ff5 11 days ago 132MB
centos latest 831691599b88 6 weeks ago 215MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
[root@localhost ~]# docker history redis:4.0.14_man
IMAGE CREATED CREATED BY SIZE COMMENT
508b9f6e5405 26 minutes ago /bin/sh -c #(nop) CMD ["redis-server" "redi… 0B
4aa95d591516 26 minutes ago /bin/sh -c #(nop) EXPOSE 7000 0B
fa5a5f6c0f0c 26 minutes ago /bin/sh -c #(nop) ADD file:5655994a11abcd7dd… 23B
2d9d3d7bf714 26 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local/redis-4… 0B
c719401c0f14 26 minutes ago /bin/sh -c make && make install 103MB
3d23c6fa17c2 28 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local/redis-4… 0B
2695590345d1 28 minutes ago /bin/sh -c #(nop) ADD file:72d62441fd447fe67… 7.19MB
dc55a6f5baa4 28 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
fd38bdc0ae61 28 minutes ago yum install -y gcc gcc-c++ net-tools make 172MB
831691599b88 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:84700c11fcc969ac0… 215MB
验证容器
[root@localhost ~]# docker run -it redis:4.0.14_man /bin/bash
[root@be61a506b62f redis-4.0.14]# pwd
/usr/local/redis-4.0.14
[root@be61a506b62f redis-4.0.14]# ls
00-RELEASENOTES CONTRIBUTING INSTALL Makefile deps redis.conf runtest-cluster sentinel.conf tests
BUGS COPYING MANIFESTO README.md redis-7000.conf runtest runtest-sentinel src utils
[root@be61a506b62f redis-4.0.14]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@localhost ~]# docker run -itd redis:4.0.14_man
9728f3469133f5b0c574ee7568c68c7a088dbf06cfd965c0c717f89c31222558
[root@localhost ~]# ps -ef |grep redis
root 12385 12374 0 12:06 pts/0 00:00:00 redis-server 0.0.0.0:7000