Docker基本管理:下篇(镜像创建和数据管理)

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值