什么是docker镜像
docker镜像是用来启动容器的构建基石,docker中镜像的结构如下所示,一个镜像放在另一个镜像顶部,当从一个镜像启动容器时,docker会在该镜像的最顶层加载一个读写文件系统。
当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,比如想要修改一个文件,首先会从该读写层下面的只读层复制到该读写层,该文件的只读版本仍然存在,只是被读写层的副本多隐藏,这种机制被称为写时复制(copy on write)。
写时复制:每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,docker会构建出一个镜像栈,并在栈顶端添加一个读写层。这个读写层再加上下面的镜像层及一些数据构成了一个容器。
镜像相关操作
列出镜像
可以通过docker images
命令列出镜像列表
apple@appledeMacBook-Pro ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
拉取镜像
使用docker pull
命令可以拉取镜像到本地,如下所示。
apple@appledeMacBook-Pro ~ % docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
0f5f78cccacb: Pull complete
623a5dae2b42: Pull complete
Digest: sha256:beba993cc5720da07129078d13441745c02560a2a0181071143e599ad9c497fa
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
apple@appledeMacBook-Pro ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 94dff5fab37f 37 hours ago 541MB
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
查找镜像
通过docker search
命令可以查找所欲Docker Hub上公共的可以用镜像,如下所示:
apple@appledeMacBook-Pro ~ % docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8178 [OK]
bitnami/redis Bitnami Redis Docker Image 145 [OK]
sameersbn/redis 80 [OK]
...
- NAME:仓库名
- DESCRIPTION:镜像描述
- STARS:获得stars的数量(受欢迎程度)
- OFFICIAL:是否官方
- AUTOMATED:表示这个镜像是由Docker Hub自动构建流程创建的
构建镜像
主要记录使用dockerfile构建镜像,dockerfile使用DSL语法的指令来构建一个docker镜像,之后使用docker build
构建一个新的镜像。
新建一个Dockerfile文件,如下所示:
# Version: 0.0.1
FROM ubuntu
MAINTAINER Ma Ning "maning_star@126.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'hi, hello world' \
>/usr/share/nginx/html/index.html
EXPOSE 80
该Dockerfile文件由一系列指令和参数组成,每条指令必须为大写字母,且后面要跟随一个参数,指令是从上到下执行,每条指令都会创建一个新的镜像层并对镜像进行提交。
- 每个Dockerfile的第一条指令都应该是FROM,其指定一个已经存在的镜像,后续指令均基于该镜像,这个镜像被称为基础镜像
- MAINTAINER指令用于标注镜像所有者及联系方式
- 接下来的三条RUN指令用于在当前镜像中运行指定的命令
- 接着EXPOSE指令告诉docker容器内的应用程序会使用容器的指定端口
接下来就是构建镜像,如下所示:
apple@appledeMacBook-Pro dockerfile_study % docker build -t maning:v1.0 .
Sending build context to Docker daemon 14.85kB
Step 1/6 : FROM ubuntu
---> 1d622ef86b13
Step 2/6 : MAINTAINER MA Ning "maning_star@126.com"
---> Using cache
---> 1d845767272e
Step 3/6 : RUN apt-get update
---> Running in 0e189e8c645c
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [35.7 kB]
Get:4 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [9726 B]
Get:5 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [1079 B]
Get:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [95.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-updates InRelease [107 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal-backports InRelease [98.3 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:12 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [9726 B]
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [1079 B]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [164 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [88.4 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [2903 B]
Fetched 13.8 MB in 3min 15s (71.0 kB/s)
Reading package lists...
Removing intermediate container 0e189e8c645c
---> 41f6d7db95a0
Step 4/6 : RUN apt-get install -y nginx
---> Running in 27c3ae37a573
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2
libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66
libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter
libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream
libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data
libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12
nginx-common nginx-core tzdata ucf
Suggested packages:
iproute2-doc libgd-tools fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2
libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66
libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter
libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream
libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data
libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12 nginx
nginx-common nginx-core tzdata ucf
0 upgraded, 40 newly installed, 0 to remove and 4 not upgraded.
Need to get 15.8 MB of archives.
After this operation, 60.8 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libbsd0 amd64 0.10.0-1 [45.4 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2 amd64 1:2.32-1 [15.9 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 libelf1 amd64 0.176-1.1build1 [44.0 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 libmnl0 amd64 1.0.4-2 [12.3 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libxtables12 amd64 1.8.4-3ubuntu2 [28.4 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2-bin amd64 1:2.32-1 [26.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal/main amd64 iproute2 amd64 5.5.0-1ubuntu1 [858 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 libatm1 amd64 1:2.5.1-4 [21.8 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 libexpat1 amd64 2.2.9-1build1 [73.3 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 tzdata all 2020a-0ubuntu0.20.04 [293 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/main amd64 libicu66 amd64 66.1-2ubuntu2 [8520 kB]
命令为docker build
,使用-t
参数为新镜像设置了名称及版本号,一定不要忽略最后的".",其表示在当前路径下的Dockerfile文件。
Dockerfile指令
- CMD
该指令用于指定一个容器启动时要运行的命令,类似RUN,区别在于RUN是指定镜像被构建时要运行的命令,而CMD时指定容器启动时要运行的命令。
docker run -it mysql /bin/true
// 等效于
CMD ["/bin/true"]
- ENTRYPOINT
ENTRYPOINT与CMD非常类似,不同之处在晕docker run命令行会覆盖CMD,而对于ENTRYPOINT,docker run命令行的指定参数会被当做参数传递给ENTRYPOINT指令中指定的命令
- WORKDIR
该指令用来从镜像创建一个新容器时,在容器内部设置一个工作目录
- ENV
该指令用来在镜像构建国产中设置环境变量
- USER
该指令用来指定镜像会以什么样的用户去运行
- VOLUME
该指令用来向基于镜像创建的容器添加卷
- ADD
ADD指令用来构建环境下的文件和目录复制到镜像中,如下所示
ADD xxx /opt/application/xxx
此处会将构建目录下的文件复制到镜像中的/opt/application/位置
- COPY
COPY类似ADD,该指令复制本地文件