Docker镜像
应用发布的标准格式
支撑一个Docker容器的运行
Docker镜像分层
- FROM centso:7.4
- ADD run.sh/
- VOLUME /data
- CMD ["./run.sh"]
1、Dockerfile中的每个指令都会创建一个新的镜像层
2、镜像层将被缓存和复用
3、当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
4、某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
5、镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
Docker镜像的创建方法
1、基于已有镜像创建
命令格式:docker commit -m "newcentos7" -a "abc" 容器ID号 新建镜像名称
-m说明信息
-a作者信息
-p生成过程中停止容器的运行
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 30 hours ago 133MB
centos 7 8652b9f0cb4c 12 days ago 204MB
[root@docker ~]# docker create -it centos:7 /bin/bash
f3b0b5f3320f910f2bf03e2aebf2b0964635288e1c4bc10c9bddefb917413d2e
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3b0b5f3320f centos:7 "/bin/bash" 5 seconds ago Created charming_lewin
[root@docker ~]# docker commit -m "newcentos" -a "dacker" f3b0b5f3320f newcentos:7.4
sha256:acc3556d12c01845f0af34a07a93c4bb81bdcc2aa09aa412f7220a53176fbf25
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
newcentos 7.4 acc3556d12c0 10 seconds ago 204MB
nginx latest bc9a0695f571 30 hours ago 133MB
centos 7 8652b9f0cb4c 12 days ago 204MB
2、基于本地模板创建
[root@docker ~]#wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
[root@docker ~]# cat debian-7.0-x86-minimal.tar.gz |docker import - abc:123
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abc 123 4e5fb0151452 31 seconds ago 215MB
newcentos 7.4 acc3556d12c0 9 minutes ago 204MB
nginx latest bc9a0695f571 30 hours ago 133MB
centos 7 8652b9f0cb4c 12 days ago 204MB
[root@docker ~]#
3、基于Dockerfile创建
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。 |
MAINTAINER名字 | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD[“要运行的程序“,”参数1,“参数2“] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
EXPOSE端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV环境变量变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY 源文件/目录目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME[“目录“] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
3.1、查看当前镜像
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 8652b9f0cb4c 12 days ago 204MB
3.2、创建一个目录用于放Dockerfile文件
[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
#基于已有的镜像名称
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache
#镜像操作指令安装apache软件
#更新yum源
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"]
[root@docker apache]# vim index.html
<h1>This is apache</h1>
[root@docker apache]# vim run.sh
#!/bin/bash
rm -fr /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
3.3、生成镜像
[root@docker apache]# docker build -t httpd:web . #注意末尾有.
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd web 514fe4b186c1 6 seconds ago 476MB
centos 7 8652b9f0cb4c 12 days ago 204MB
3.4、创建键容器并运行容器
[root@docker apache]# docker run -d -p 1356:80 httpd:web
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
519670c8a252 httpd:web "/run.sh" 13 seconds ago Up 11 seconds 0.0.0.0:1356->80/tcp inspiring_shaw
3.5、测试
创建私有仓库
1、拉取registry镜像
[root@docker ~]# docker pull registry
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 2d4f4b5309b1 5 months ago 26.2MB
2、添加私有仓库地址
[root@docker ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["20.0.0.10:5000"], #增加
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"] #阿里云加速地址,可以登录自己的阿里云账号查看
}
3、重启docker
[root@docker ~]# systemctl restart docker.service
4、创建registry容器
[root@docker ~]# docker create -it registry /bin/bash
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ddfce6acd6f registry "/entrypoint.sh /bin…" 7 seconds ago Created jovial_bartik
5、开启registry容器
[root@docker ~]# docker start 2ddfce6acd6f
6、设置目录挂载到容器中
[root@docker ~]# docker run -d -p 20.0.0.10:5000:5000 -v /data/registry:/tmp/registry registry
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-d: 后台运行容器,并返回容器ID
--volume , -v: 绑定一个卷
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f16c352d187 registry "/entrypoint.sh /etc…" 39 seconds ago Up 38 seconds 20.0.0.10:5000->5000/tcp tender_edison
2ddfce6acd6f registry "/entrypoint.sh /bin…" 2 minutes ago Exited (127) 2 minutes ago jovial_bartik
7、设置镜像标签用于上传仓库
[root@docker ~]# docker pull nginx #下载一个nginx测试上传,也可以使用本地镜像上传
[root@docker ~]# docker tag nginx:latest 20.0.0.10:5000/nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
20.0.0.10:5000/nginx latest bc9a0695f571 32 hours ago 133MB
nginx latest bc9a0695f571 32 hours ago 133MB
registry latest 2d4f4b5309b1 5 months ago 26.2MB
8、上传镜像到仓库
[root@docker ~]# docker push 20.0.0.10:5000/nginx
9、获取仓库列表
[root@docker ~]# curl -XGET http://20.0.0.10:5000/v2/_catalog
{"repositories":["nginx"]}
10、下载私有仓库镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 2d4f4b5309b1 5 months ago 26.2MB
[root@docker ~]# docker pull 20.0.0.10:5000/nginx #ip地址为本地仓库ip地址由于我是一台服务器所有就使用本机ip地址
Using default tag: latest
latest: Pulling from nginx
852e50cd189d: Pull complete
571d7e852307: Pull complete
addb10abd9cb: Pull complete
d20aa7ccdb77: Pull complete
8b03f1e11359: Pull complete
Digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49
Status: Downloaded newer image for 20.0.0.10:5000/nginx:latest
20.0.0.10:5000/nginx:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
20.0.0.10:5000/nginx latest bc9a0695f571 32 hours ago 133MB
registry latest 2d4f4b5309b1 5 months ago 26.2MB
Docker数据卷
宿主机《-----------》容器(实现主机和容器挂载目录直接的同步)
1、下载一个centos进行测试
[root@docker ~]# docker pull cetos
2、将宿主机目录/var/www 目录挂载到容器/data1
[root@docker ~]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash #进入容器里面
[root@3b2e696e7596 /]# ls
bin data1 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
3、进入data1目录创建文件去主机目录测试
[root@3b2e696e7596 /]# cd data1/
[root@3b2e696e7596 data1]# echo "vszjv" > a.txt
[root@3b2e696e7596 data1]# echo "vszjv" > b.txt
[root@3b2e696e7596 data1]# ls
a.txt b.txt
4、进入主机/var/www目录创查看是否有文件生成
[root@docker ~]# cd /var/www/
[root@docker www]# ll
总用量 8
-rw-r--r-- 1 root root 6 11月 26 17:21 a.txt
-rw-r--r-- 1 root root 6 11月 26 17:21 b.txt
[root@docker www]# cat a.txt
vszjv
数据容器卷
容器《-----------》容器(实现容器之间数据同步)创建数据卷容器(将/data1和/data2共享出来)
[root@docker ~]# docker run --name web-1 -v /data1 -v /data2 -it centos /bin/bash
-name="nginx-lb": 为容器指定一个名称;
[root@7757e295152c /]# ls
bin data1 data2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7757e295152c /]# cd data1
[root@7757e295152c data1]# echo "csjav">a.txt
[root@7757e295152c data1]# echo "csjav">b.txt
[root@7757e295152c data1]# cd ..
[root@7757e295152c /]# cd /data2
[root@7757e295152c data2]# echo "cskvjjsz">1.txt
[root@7757e295152c data2]# echo "cskvjjsz">2.txt
创建新容器并将数据卷容器的共享目录挂载到自己上面
[root@docker ~]# docker run -it --volumes-from web-1 --name /data centos /bin/bash
[root@02b9d457c2e8 /]# ls
bin data1 data2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@02b9d457c2e8 /]# cd data1
[root@02b9d457c2e8 data1]# ls
a.txt b.txt
[root@02b9d457c2e8 data1]# cd ..
[root@02b9d457c2e8 /]# cd data2
[root@02b9d457c2e8 data2]# ls
1.txt 2.txt
端口映射
1、随机端口映射(端口号:32768开始))
[root@docker ~]# docker run -d -P nginx:latest
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44f29a0c974e nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp strange_panini
2、指定端口映射
[root@docker ~]# docker run -d -p 32769:80 nginx:latest
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e9b98cee2b2a nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32769->80/tcp laughing_mclean
44f29a0c974e nginx:latest "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 0.0.0.0:32768->80/tcp strange_panini
02b9d457c2e8 centos "/bin/bash" 38 minutes ago Up 32 minutes data
7757e295152c centos "/bin/bash" 2 hours ago Exited (0) 33 minutes ago web-1
3b2e696e7596 centos "/bin/bash" 2 hours ago Exited (0) 2 hours ago web1
8f16c352d187 registry "/entrypoint.sh /etc…" 3 hours ago Up 3 hours 20.0.0.10:5000->5000/tcp tender_edison
2ddfce6acd6f registry "/entrypoint.sh /bin…" 3 hours ago Exited (127) 3 hours ago jovial_bartik
容器互连
1、创建一个容器使用随机端口自动映射
[root@docker ~]# docker run -itd -P --name nginx1 centos /bin/bash
2、创建另个容器使用随机端口自动映射
[root@docker ~]# docker run -itd -P --name nginx2 --link nginx1:nginx1 centos:latest /bin/bash
--link: 添加链接到另一个容器;
3、进入nginx2容器ping nginx1
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5a73beb7a21 centos:latest "/bin/bash" 6 minutes ago Up 5 minutes nginx2
52e310c2607f centos "/bin/bash" 11 minutes ago Up 11 minutes nginx1
e9b98cee2b2a nginx:latest "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:32769->80/tcp laughing_mclean
44f29a0c974e nginx:latest "/docker-entrypoint.…" 26 minutes ago Up 26 minutes 0.0.0.0:32768->80/tcp strange_panini
8f16c352d187 registry "/entrypoint.sh /etc…" 3 hours ago Up 3 hours 20.0.0.10:5000->5000/tcp tender_edison
2ddfce6acd6f registry "/entrypoint.sh /bin…" 3 hours ago Exited (127) 3 hours ago jovial_bartik
[root@docker ~]# docker exec -it b5a73beb7a21 /bin/bash
[root@b5a73beb7a21 /]# ping nginx1
PING nginx1 (172.17.0.6) 56(84) bytes of data.
64 bytes from nginx1 (172.17.0.6): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from nginx1 (172.17.0.6): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from nginx1 (172.17.0.6): icmp_seq=3 ttl=64 time=0.068 ms
```