前言:docker镜像的分层
-
dockerfile中的指令都会创建一个新的镜像层
-
镜像层将被缓存和复用
-
当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
-
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
-
镜像层是不可变的,如果在某一层中添加了一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
docker镜像
- 是应用发布的标准格式
- 可支撑一个docker容器的运行
一:docker镜像的创建方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于Dockerfile创建
dockerfile用的多,其次基于已有镜像创建
二:基于Dockerfile创建
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分
- 基础镜像信息——FROM
- 维护者信息———MAINTAINER
- 镜像操作指令——ENV、EXPOSE、RUN、ADD、COPY、VOLUME、USER、WORKDIR、ONBUILD、HEALTHCHECK
- 容器启动时执行指令——CMD
维护者信息没啥用,起到说明作者之意
其他的部分都很重要
2.1 Dockerfile指令
指令 | 含义 | 概述 | |
---|---|---|---|
1 | FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM 指令 | 指定基础镜像 |
2 | MAINTAINER 名字 | 说明新镜像的相关信息,比如维护人员、作者 | 指定新镜像的作者 |
3 | RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中,每一条RUN都会产生一个镜像层,生成一个临时容器,命令完成后会自动移除 | 相当于在基础镜像上命令的运行,生成一个缓存层,并提交到新的镜像中 |
4 | CMD [ “要运行的程序”, “参数1,参数2” ] | 指定容器时要运行的命令或脚本,Dockerfile只能有一条CMD指令,若是指定多条,只会执行最后一条 | 指定启动容器时要运行的命令或脚本,比如/bin/bash,dockerfile只能由一条CMD命令,只会执行最后一条CMD命令 |
5 | EXPOSE 端口号 | 制定新镜像加载到Docker时要开启的端口 | 指定新镜像要开启的端口 |
6 | ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 | 指定环境变量,会被后面的RUN所使用 |
7 | ADD 源文件/目录 目标文件/目录 | 将宿主机内的源文件复制到容器内的目标文件处,源文件要与Dockerfile位于相同目录上,或者是一个URL | 复制源文件到目标文件, |
8 | COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 | |
9 | VOLUME [ “目录” ] | 在容器内创建一个挂载点 | 在容器中创建一个挂载点 |
ADD可以自动解压归档文件
copy不行
2.2 实操演示
2.2.1 首先需要新创建一个目标目录,在里面写入Dockerfile文件
备注:要注意大小写,固定格式
[root@gsy ~]# mkdir apache
[root@gsy ~]# ls
anaconda-ks.cfg apache perl5
[root@gsy ~]# cd apache/
2.2.2 先写一个在容器内开启httpd的脚本
[root@gsy apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
2.2.3 编写Dockerfile
[root@gsy apache]# vim Dockerfile
#指定基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER GSY
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
2.2.4 创建web的index首页
[root@gsy apache]# echo "gsy" > index.html
[root@gsy apache]# ls
Dockerfile index.html run.sh
备注:Dockerfile中的文件路径填写相对路径,即都在Dockerfile的同级目录下
2.2.5 准备就绪后,开始生成镜像,注意末尾有.
构建名为httpd:cetnos的镜像
[root@gsy apache]# docker build -t httpd:cetnos .
Sending build context to Docker daemon 4.096kB
Step 1/9 : FROM centos
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
---> 470671670cac
Step 2/9 : MAINTAINER GSY
---> Running in 0272728c2b6e
Removing intermediate container 0272728c2b6e
---> 39d32b194362
Step 3/9 : RUN yum -y update
---> Running in 94d735d297c9
Install 9 Packages
Upgrade 22 Packages
Removing intermediate container 94d735d297c9
---> 9b7c08a2560b
Step 4/9 : RUN yum -y install httpd
---> Running in 9bffc91ec4b6
Installed:
httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64
apr-util-bdb-1.6.1-6.el8.x86_64
apr-util-openssl-1.6.1-6.el8.x86_64
apr-1.6.3-9.el8.x86_64
apr-util-1.6.1-6.el8.x86_64
centos-logos-httpd-80.5-2.el8.noarch
httpd-filesystem-2.4.37-16.module_el8.1.0+256+ae790463.noarch
httpd-tools-2.4.37-16.module_el8.1.0+256+ae790463.x86_64
mod_http2-1.11.3-3.module_el8.1.0+213+acce2796.x86_64
brotli-1.0.6-1.el8.x86_64
mailcap-2.1.48-3.el8.noarch
Complete!
Removing intermediate container 9bffc91ec4b6
---> 6845e32561e1
Step 5/9 : EXPOSE 80
---> Running in 99c541c14acf
Removing intermediate container 99c541c14acf
---> 18c976d4bcb9
Step 6/9 : ADD index.html /var/www/html/index.html
---> 60b68132a651
Step 7/9 : ADD run.sh /run.sh
---> 74b95e01ec1b
Step 8/9 : RUN chmod 755 /run.sh
---> Running in 11e640edb736
Removing intermediate container 11e640edb736
---> ee1977be4c19
Step 9/9 : CMD ["/run.sh"]
---> Running in caedba37de5e
Removing intermediate container caedba37de5e
---> 38d2d5159957
Successfully built 38d2d5159957
Successfully tagged httpd:cetnos
2.2.6 查看镜像
[root@gsy apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd cetnos 38d2d5159957 3 minutes ago 434MB
centos latest 470671670cac 3 months ago 237MB
centos 7 5e35e350aded 5 months ago 203MB
2.2.7 新镜像运行容器
-p 1216:80 端口映射,1216指的时宿主机端口,80指容器端口 小写字母
-P代表随机指定端口,用的少 大写字母
[root@gsy apache]# docker run -d -p 1216:80 httpd:cetnos
c75a2b3d2ad854bedc357572c1ca4cb2c1912db37e5b3b002130cc2bad786860
[root@gsy apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c75a2b3d2ad8 httpd:cetnos "/run.sh" 6 seconds ago Up 5 seconds 0.0.0.0:1216->80/tcp focused_torvalds
2.2.8 在客户机登录测试
三:基于已有的镜像容器进行创建
3.1 首先查看当前已有镜像
[root@gsy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd cetnos 38d2d5159957 10 hours ago 434MB
centos latest 470671670cac 3 months ago 237MB
centos 7 5e35e350aded 5 months ago 203MB
3.2 然后基于镜像创建容器
[root@gsy ~]# docker create -it centos:7 /bin/bash
01a0c8bbb34c028239a5d0ad82350f151f7a031a3b3d691e550865a8435cc4be
[root@gsy ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01a0c8bbb34c centos:7 "/bin/bash" 8 seconds ago Created exciting_hawking
c75a2b3d2ad8 httpd:cetnos "/run.sh" 10 hours ago Up 10 hours 0.0.0.0:1216->80/tcp focused_torvalds
3.3 基于创建的容器去创建镜像,并查看结果
[root@gsy ~]# docker commit --help
用法:docker 提交 [选项] 容器 [库[:TAG]]
根据容器的更改创建新映像
选项
-a,—author字符串 作者(例如,“John Hannibal Smith hannibal@a-team.com”)
-c, --change list 将Dockerfile指令应用于创建的映像
-m, --message string 提交消息
-p, --pause 提交期间暂停容器(默认为true)
[root@gsy ~]# docker commit -m "new" -a "gsy" 01a0c8bbb34c gsy:centos
sha256:9b6a848ec969142bdf411fed5fe46b03ef2cb29a7ec4f16638d811579e053ff1
[root@gsy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gsy centos 9b6a848ec969 7 seconds ago 203MB
httpd cetnos 38d2d5159957 10 hours ago 434MB
centos latest 470671670cac 3 months ago 237MB
centos 7 5e35e350aded 5 months ago 203MB
3.4 查看容器状态,顺便测试一波指定容器名字创建
[root@gsy ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01a0c8bbb34c centos:7 "/bin/bash" About a minute ago Created exciting_hawking
c75a2b3d2ad8 httpd:cetnos "/run.sh" 10 hours ago Up 10 hours 0.0.0.0:1216->80/tcp focused_torvalds
[root@gsy ~]# docker create -it --name 965483 centos:7 /bin/bash
419b15d05dc196bf577f93c0181c7eecf1d29c14210ce09cce5dc37126936449
[root@gsy ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
419b15d05dc1 centos:7 "/bin/bash" 3 seconds ago Created 965483
01a0c8bbb34c centos:7 "/bin/bash" 2 minutes ago Created exciting_hawking
c75a2b3d2ad8 httpd:cetnos "/run.sh" 10 hours ago Up 10 hours 0.0.0.0:1216->80/tcp focused_torvalds
[root@gsy ~]# docker commit -m "new" -a "shl" 965483 shl:centos
sha256:b24563c2d9623c1b9962910859451cb1cb713001e2bf8b3336fa6bd24dff28f7
[root@gsy ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
419b15d05dc1 centos:7 "/bin/bash" 55 seconds ago Created 965483
01a0c8bbb34c centos:7 "/bin/bash" 2 minutes ago Created exciting_hawking
c75a2b3d2ad8 httpd:cetnos "/run.sh" 10 hours ago Up 10 hours 0.0.0.0:1216->80/tcp focused_torvalds
[root@gsy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shl centos b24563c2d962 14 seconds ago 203MB
gsy centos 9b6a848ec969 About a minute ago 203MB
httpd cetnos 38d2d5159957 10 hours ago 434MB
centos latest 470671670cac 3 months ago 237MB
centos 7 5e35e350aded 5 months ago 203MB
四:基于本地模板创建
4.1 这种方法首先需要在本地已经有一个模板(这里我是从网上下载的)
[root@gsy ~]# which wget
/usr/bin/which: no wget in (/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@gsy ~]# yum install wget -y
[root@gsy ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
[root@gsy ~]# ls -lh
total 85M
-rw-------. 1 root root 1.6K Mar 22 18:56 anaconda-ks.cfg
drwxr-xr-x. 2 root root 56 Apr 19 23:05 apache
-rw-r--r--. 1 root root 85M Apr 20 09:55 debian-7.0-x86-minimal.tar.gz
drwxr-xr-x. 2 root root 6 Apr 6 14:51 perl5
4.2 然后导入到镜像中
[root@gsy ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - gsy:shl
sha256:c1814f2b86169fa73414408b95193d0c079ab89f6bf6803fbd2ef715accfd69d
[root@gsy ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gsy shl c1814f2b8616 14 seconds ago 215MB
shl centos b24563c2d962 47 minutes ago 203MB
gsy centos 9b6a848ec969 48 minutes ago 203MB
httpd cetnos 38d2d5159957 11 hours ago 434MB
centos latest 470671670cac 3 months ago 237MB
centos 7 5e35e350aded 5 months ago 203MB
完成