文章目录
一、Docker镜像
1.1:Docker镜像分层
●Dockerfile中的每个指令都会创建一个新的镜像层
●镜像层将被缓存和复用
●当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
●某一层的镜像缓存失效后,它之后的镜像缓存都会失效
●镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
自下而上制作分层:
●From 后面是基础镜像
●ADD run.sh 运行脚本
●VOLUME /data :数据卷;使用宿主机的挂载目录
●CMD[“./run.sh”]:命令执行脚本
1.2:Docker镜像的创建
Docker镜像
●应用发布的标准格式
●支撑一个Docker容器的运行
Docker镜像的创建方法
●基于已有的镜像创建
●基于本地的模板创建
●基于dockerfile创建(核心)
1.2.1:基于已有的镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
Docker commit [选项] 容器ID/名称 仓库名称:[标签]
●-m 说明信息
●-a 作者信息
●-p 生成过程中停止容器的运行
举例:基于现有运行的centos7的容器创建镜像
1.先下载一个centos:7的镜像
[root@localhost ~]# docker pull centos:7
2.基于centos7的镜像创建一个容器,并启动容器
[root@localhost ~]# docker create -it centos:7 /bin/bash
[root@localhost ~]# docker start ddb3f8e0e5b5
3.基于现在已有的centos:7创建镜像
Docker commit -m “描述信息” -a “镜像作者” 容器ID号 镜像作者:镜像标签
[root@localhost ~]# docker commit -m "new" -a "cj" ddb3f8e0e5b5 cj:test
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cj test 9ee2410f7d09 30 seconds ago 296MB
1.2.2:基于本地模板的创建
●通过导入操作系统模板文件生成新的镜像
●使用wget命令导入为本地镜像
Wget
http://download.openvz.org/template/precreated/debian-7.0-×86-minimal.tar.gz
●导入成功后可查看本地镜像信息
Docker images | grep new
举例:
1.这边模板直接用xhell放到/opt目录下,当然也可以在网站上下载
[root@localhost opt]# ls
containerd debian-7.0-x86-minimal.tar.gz nginx nginx_c rh
[root@localhost opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - cj:aaa
sha256:90e9ce9f59fa9a5d21ee31ff800e1a20339d21de24e5c8d42de36146ad1d9b0e
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cj aaa 90e9ce9f59fa 7 seconds ago 215MB
1.2.3:基于Dockerfile创建
●Dockerfile是由一组指令组成的文件
●Dockerfile结构四部分
●基础镜像信息
●维护者信息
●镜像操作指令
●容器启动时执行指令
●Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释
●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 | 健康检查 |
举例:Dockerfile创建httpd镜像,并启动
1.在/opt目录下创建一个apache服务的目录
[root@localhost opt]# mkdir apache
[root@localhost opt]# cd apache/
[root@localhost apache]# vim Dockerfile ##创建一个Dockerfile(必须是这个名字)
FROM centos:7 ##基于基础镜像centos:7
MAINTAINER THIS IS test ##维护镜像的用户信息
RUN yum -y update ##这两条是镜像操作指令安装apache软件
RUN yum -y install httpd
EXPOSE 80 ##开启80端口
ADD index.html /var/www/html/index.html ##复制网站首页文件
ADD run.sh /run.sh ##这两条是将执行脚本复制到镜像中
RUN chmod 755 /run.sh
CMD ["/run.sh"] ##启动容器时执行脚本
2.写入镜像服务启动脚本
[root@localhost apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/ * ##原有容器中要是开启了服务就将文件删除
exec /usr/sbin/apachectl -D FOREGROUND
3.写入网站页面信息
[root@localhost apache]# vim index.html
<h1>this is ky03 web</h1>
4.生成镜像
[root@localhost apache]# docker build -t httpd:centos . ##注意:centos .中间有空格
5.查看生成过程
6.新镜像运行容器 8080:外部端口 80:内部服务端口
[root@localhost apache]# docker run -d -p 8080:80 httpd:centos 注意映射的外部端口不能是被占用的
a5004e41c40434c93f05a19fcc9b906accfc69afb22d8548b12506bd539d7504
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5004e41c404 httpd:centos "/run.sh" 6 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp mystifying_nobel
7.打开客户端输入地址加映射的端口号访问服务,这个服务是运行在容器里面不是宿主机里面
二、Docker的数据管理
数据管理操作
●方便查看容器内产生的数据
●多容器实现数据共享
两种管理方式
●数据卷:是用来实现容器和宿主机系统之间的数据共享
宿主机与容器之间共享数据,想给容器中添加东西,直接在宿主机中添加
创建数据卷
docker run -d -v /data1 -v /data2 --name web -it httpd:centos /bin/bash
●数据卷容器:是容器和容器之间的数据共享
容器与容器之间共享数据,想更新某一服务只需更新一个容器
docker run --name web11 -v /data1 -v /data2 -it httpd:centos /bin/bash
新容器挂载数据卷容器
docker run -it --volumes-from web11 --name web11-1 -it httpd:centos /bin/bash
三、建立私有仓库
下载registry镜像
[root@docker opt]# docker pull registry
客户端设置daemon.json文件,指定私有仓库位置
[root@docker opt]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.100.129:5000"],
"registry-mirrors": ["https://阿里云镜像加速地址"]
}
[root@docker opt]# systemctl restart docker.service
生成registry容器,开放5000端口
[root@docker opt]# docker create -it registry /bin/bash
4db6840d6b4eb2c12a8fdf8da1656420ad9e47b849fe3540e484d6da9c2ebc38
[root@docker opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4db6840d6b4e registry "/entrypoint.sh /bin…" 8 seconds ago Created peaceful_keldysh
[root@docker opt]# docker start 4db6840d6b4e
[root@docker opt]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
镜像打标签
[root@docker opt]# docker tag nginx:latest 192.168.100.129:5000/nginx
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.129:5000/nginx latest 75d1250240a9 17 hours ago 480MB
上传镜像,docker push
[root@localhost docker]# docker push 192.168.100.129:5000/nginx
The push refers to repository [192.168.100.129:5000/nginx]
获取私有仓库列表
[root@localhost docker]# curl -XGET http://192.168.100.129:5000/v2/_catalog
{"repositories":["nginx"]}
下载镜像,docker pull
[root@localhost docker]# docker pull 192.168.100.129:5000/nginx
Using default tag: latest
四、端口映射
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因此我们需要手动进行设置端口映射
'-P(大p):随机指定端口号'
[root@localhost docker]# docker run -d -P 192.168.100.129:5000/nginx
20395c8943e2906703c78e16568613f16901e44b1f68554a3704b052bf366796
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20395c8943e2 192.168.100.129:5000/nginx "/run.sh" 7 seconds ago Up 5 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp youthful_mestorf
'-p(小p):手动设置端口号'
[root@docker opt]# docker run -d -p 44366:80 httpd:centos
五、容器互联
创建并运行web10容器,端口号自动映射
[root@docker opt]# docker run -itd -P --name web10 centos:7 /bin/bash
创建并运行web20容器,连接到web10和其通信,端口号自动映射
[root@docker opt]# docker run -itd -P --name web20 --link web10:web10 centos:7 /bin/bash
测试,进入web20,ping web10
[root@40223199da2a /]# ping web10
PING web10 (172.17.0.5) 56(84) bytes of data.
64 bytes from web10 (172.17.0.5): icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from web10 (172.17.0.5): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from web10 (172.17.0.5): icmp_seq=3 ttl=64 time=0.097 ms
64 bytes from web10 (172.17.0.5): icmp_seq=4 ttl=64 time=0.044 ms
64 bytes from web10 (172.17.0.5): icmp_seq=5 ttl=64 time=0.118 ms
^C
--- web10 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.044/0.076/0.118/0.030 ms