docker镜像制作
docker镜像
- 是应用发布的标准格式
- 可支撑一个docker容器的运行
docker镜像的分层
(1)Dockerfile中的每个指令都会创建一个新的镜像层
(2)镜像层将被缓存和复用
(3)当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对用的镜像缓存就会失效
(4)某一层的镜像缓存失效后,它之后的镜像缓存都会失效
(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
构建镜像的方式
(1)Dockerfile:类似于DIY
(2)基于已有的容器进行创建镜像
(3)基于本地模板创建
基于Dockerfile创建镜像
(1)Dockerfile是由一组指令组成的文件
(2)Dockerfile结构部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
(3)Dockerfile操作指令
(4)通过Dockerfile创建镜像
[root@docker ~]# mkdir /aaa
[root@docker ~]# cd /aaa/
[root@docker aaa]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER this is test httpd
#基于基础镜像安装软件
RUN yum -y update
RUN yum -y install httpd
#开启端口
EXPOSE 80
#复制首页到指定站点
ADD index.html /var/www/html/index.html
#复制启动脚本到镜像中
ADD run.sh /run.sh
#设置run.sh执行权限
RUN chmod 755 /run.sh
#启动容器时执行操作
CMD ["/run.sh"]
[root@docker aaa]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
[root@docker aaa]# echo "this is test web" > index.html
#创建镜像
[root@docker aaa]# docker build -t httpd:centos . //此处的"."不能漏掉,指定本地文件夹
#每执行一条Dockerfile指令时,系统会自动创建一个临时文件,指令完成后会自动删除
#镜像创建完成后,只会存在镜像,不会有容器存在
[root@docker aaa]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos 6d9362242673 About a minute ago 524MB
centos 7 5e35e350aded 5 months ago 203MB
#创建镜像
[root@docker aaa]# docker run -d -P httpd:centos
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e088487b3f73 httpd:centos "/run.sh" 4 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp happy_poincare
使用本地浏览器,访问http://192.168.7.168:32768
基于已有的镜像容器进行创建
#先制作一个容器
[root@docker ~]# docker create -it centos:7 /bin/bash
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49b6c163a548 centos:7 "/bin/bash" 8 seconds ago Created flamboyant_tereshkova
#将容器制作为镜像
[root@docker ~]# docker commit -m "new" -a "centos" 49b6c163a548 centos:test
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos test fcf3f1eb383c 19 seconds ago 203MB
基于本地模板创建
#先下载一个模板,上传至虚拟机内
[root@docker opt]# ls
debian-7.0-x86-minimal.tar.gz
#制作镜像
[root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian new 7af22147c1ad 8 seconds ago 215MB
私有仓库建立
私有仓库的配置步骤
(1)下载registry镜像,在字符终端
(2)客户端设置daemon.json文件,指定私有仓库位置
(3)生成registry容器,开放5000端口
(4)镜像打标签:docker tag 原镜像名 仓库IP:端口/镜像名
(5)上传镜像:docker push 仓库IP:端口/镜像名
(6)下载镜像:docker pull 仓库IP:端口/镜像名(使用docker images查看)
- 执行步骤
[root@docker ~]# docker pull registry
[root@docker ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.7.168:5000"], //不同参数选项之间使用","相隔
"registry-mirrors": ["https://syy5204b.mirror.aliyuncs.com"]
}
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker run -d -p 5000:5000 -v /data/registry:/tpm/registry registry
#宿主机中的/data/registry会自动创建挂载容器中的/tpm/registry
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e3029f01510 registry "/entrypoint.sh /etc…" 4 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp eager_northcutt
[root@docker ~]# docker pull nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e791337790a6 About an hour ago 127MB
[root@docker ~]# docker tag nginx:latest 192.168.7.168:5000/nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.7.168:5000/nginx latest e791337790a6 2 hours ago 127MB
[root@docker ~]# docker push 192.168.7.168:5000/nginx
#获取私有仓库的列表
curl -XGET http://192.168.7.168:5000/v2/_catalog
{"repositories":["nginx"]}
[root@docker ~]# docker rmi 192.168.7.168:5000/nginx:latest
[root@docker ~]# docker pull 192.168.7.168:5000/nginx
Using default tag: latest
latest: Pulling from nginx
Digest: sha256:6b3b6c113f98e901a8b1473dee4c268cf37e93d72bc0a01e57c65b4ab99e58ee
Status: Downloaded newer image for 192.168.7.168:5000/nginx:latest
192.168.7.168:5000/nginx:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.7.168:5000/nginx latest e791337790a6 2 hours ago 127MB
docker数据卷
数据卷:挂载宿主系统的存储空间
[root@docker ~]# docker pull centos
#宿主机目录/var/www/挂载容器中的/data1
#这些目录不需要自己手动创建,系统会自动创建
[root@docker ~]# docker run -v /var/www:/data1 --name test1 -it centos /bin/bash
[root@3ea73938c9b5 /]# cd /data1/
[root@3ea73938c9b5 data1]# touch test123
#返回宿主机进行查看
[root@docker ~]# ls /var/www/
test123
数据卷容器
数据卷容器:挂载容器的存储空间
#创建数据卷容器
[root@docker ~]# docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
[root@44c8fbe8e01a /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
#新容器挂载数据卷容器web100
[root@docker ~]# docker run -it --volumes-from web100 --name db1 centos /bin/bash
[root@9b0b7f686192 /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
#在新容器创建文件,到数据卷容器可以查看到相同的内容
端口映射
- -P:指定随机映射端口
- -p:在固定的IP地址映射
#不指定端口
[root@docker ~]# docker run -d -P nginx
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6dd91cea1325 nginx "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:1234->80/tcp eager_mclean
#指定端口
[root@docker ~]# docker run -d -p 1234:80 nginx
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd952499c2c5 nginx "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp infallible_beaver
容器互联
#创建并运行容器取名web1,端口号自动映射
[root@docker ~]# docker run -itd -P --name web1 centos /bin/bash
#创建并运行容器取名web2,关联web1
[root@docker ~]# docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
#在web2可以直接ping通web1
[root@docker ~]# docker exec -it 3c0d72923de3 /bin/bash
[root@3c0d72923de3 /]# ping web1
PING web1 (172.17.0.5) 56(84) bytes of data.
64 bytes from web1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.200 ms
64 bytes from web1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.110 ms