Docker镜像解析与创建方法 建立私有库 容器卷与数据卷 关联容器


Docker镜像的分层

  • Dockerfile中的每个指令都会创建一个新的镜像层
  • 镜像层将被缓存和复用
  • 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
    镜像-
  • 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
  • 镜像层是不可变的,如果在某一层中添加—个文件,然后在下一层中册除它,则镜像中依然会包含该文件

在这里插入图片描述
Docker镜像的创建

Docker镜像

  • 应用发布的标准格式
  • 支撑一个Docker容器的运行Docker镜像的创建方法
    ●基于已有镜像创建
    ●基于本地模板创建
    ●基于Dockerfile创建

在这里插入图片描述

创建的基础命令

基于已有镜像创建

将容器里面运行的程序及运行环境打包生成新的镜像

docker commit [选项] 容器lID/名称 仓库名称:[标签]

-m说明信息
-a作者信息
-p生成过程中停止容器的运行

基于本地模板创建

  • 通过导入操作系统模板文件生成新的镜像
  • 使用wget命令导入为本地镜像
wget
http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
  • 导入成功后可查看本地镜像信息
docker images | grep new

基于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
    健康检查

案例环境

构建各类Docker镜像服务案例环境
主机 服务器
操作系统 Centos 7.4 x86-64
IP地址 20.0.0.18
版本 Docker 19.03.13

需求描述
●基于容器(现有镜像)创建镜像服务
●基于模板创建镜像服务
●基于Dockerfile 创建常用基础服务

基于现有镜像创建案例

[root@server1 ~] docker images #查看本地镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   8652b9f0cb4c        12 days ago         204MB
docker create -it centos:7 /bin/bash #创建本地容器
docker ps -a  #查看本地容器的id
docker commit -m "first" -a "lol" c107483776e5 fir_docker:centos7 #基于容器创建本地镜像
[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
fir_docker          centos7             9da393da38fd        6 minutes ago       204**加粗样式**MB
centos              7                   8652b9f0cb4c        12 days ago         204MB

基于本地模板创建

先将模板上传至宿主机再进行操作
或者可以使用wget命令获取

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minim.tar.gz

获取完成后

[root@server1 ~] cat debian-7.0-x86-minimal.tar.gz | docker import - debian:jin
sha256:becee52554ca7d2e3eda84dd62d41e5363ef4bd1439ceaef1d760fef52a9880a
[root@server1 ~] docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              jin                 becee52554ca        7 seconds ago       215MB
fir_docker          centos7             9da393da38fd        20 minutes ago      204MB
centos              7                   8652b9f0cb4c        12 days ago         204MB

使用Dockerfile文件创建镜像

[root@server1 /] mkdir http #创建单个dockerfile的独立目录
[root@server1 /] cd http/
[root@server1 http] vi Dockerfile 在目录下创建Dockerfile文件 D一定要大写
FROM centos:7 #定义要使用的镜像 可以不是本地的 公共库的会自动下载
MAINTAINER first dockerfile #定义说明
RUN yum -y update #更新容器的yum库
RUN yum -y install httpd #安装httpd服务
EXPOSE 80 #开启80端口
ADD index.html /var/www/html/index.html #将当前目录下的index.html文件 挂载到容器的/var/www/html/下
ADD run.sh /run.sh #同上
RUN chmod 755 /run.sh #为脚本文件添加执行权限
CMD ["/run.sh"] #定义容器创建完成后执行的操作
保存退出
[root@server1 http] vim run.sh #编辑脚本文件
#!/bin/bash
rm -rf /run/httpd/* #删除run下的httpd进程文件
exec /usr/sbin/apachectl -D FOREGROUND #开启httpd服务
保存退出
[root@server1 http] vi index.html #定义http网页文件内容
this is first dockerfile web
[root@server1 http] docker build -t httpd:centos7 . #创建基于dockerfile的镜像
[root@server1 http] netstat -anptu | grep 4399 #查看本地要使用的端口是否开启
[root@server1 http] docker run -d -p 4399:80 httpd:centos7 #创建并执行一个容器 并映射容器的80端口到宿主机的4399端口
b2a86b6299fcc82ac35e6b8b42472562cf7d815f127d420ee9c897113cd06795

验证web是否成功开启
在这里插入图片描述

创建私有镜像库

docker pull registry #下载私有库镜像
vim /etc/docker/daemon.json #定义私有库的地址和端口
{
  "insecure-registries": ["20.0.0.18:5000"],
  "registry-mirrors": ["https://h73*****.mirror.aliyuncs.com"]

}
保存退出
docker create -it registry /bin/bash #创建私有库容器
docker ps -a
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry #开启私有库容器 并将宿主机的/data/registry挂载到/tmp/registry registry下
docker tag nginx:latest 20.0.0.18:5000/nginx #重命名镜像名称为私有库地址+端口/镜像名
docker push 20.0.0.18:5000/nginx #上传
curl -XGET http://20.0.0.18:5000/v2/_catalog #查看私有库的日志文件 是否上传成功
curl -XGET http://20.0.0.18:5000/v2/_catalog
{"repositories":["nginx"]}
docker rmi 20.0.0.18:5000/nginx:latest #删除本地镜像 以便验证下载
docker pull 20.0.0.18:5000/nginx #下载镜像
docker images 
[root@server1 http]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
httpd                  centos7             42fdcbd2f4c5        About an hour ago   476MB
debian                 jin                 becee52554ca        2 hours ago         215MB
fir_docker             centos7             9da393da38fd        2 hours ago         204MB
20.0.0.18:5000/nginx   latest              bc9a0695f571        33 hours ago        133MB
完成

创建docker数据卷

docker数据卷是将宿主机的目录挂载到容器下 实现文件共享

[root@server1 http]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
[root@90f0c0845a14 /]# cd /data1/
[root@90f0c0845a14 data1]# touch a.txt
[root@90f0c0845a14 data1]# ls
a.txt
[root@90f0c0845a14 data1]# exit
exit
[root@server1 http]# cd /var/www/
[root@server1 www]# ll
总用量 0
-rw-r--r--. 1 root root 0 11月 26 17:19 a.txt

创建容器卷

容器卷理论上是容器与容器之间共享一个目录

docker ps -a
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
[root@937b3f947ab4 /]# ls
anaconda-post.log  data2  home   media  proc  sbin  tmp
bin                dev    lib    mnt    root  srv   usr
data1              etc    lib64  opt    run   sys   var

创建关联容器

创建2个互相关联的容器

[root@server1 www]# docker run -itd -P --name web4 centos:7 /bin/bashcc5fa2f0e9b346d6aca3e19146c5d552a2a7497bb7354231d38ca0df0f512d58
[root@server1 www]# docker run -itd -P --name web5 --link web4:web4 centos:7 /bin/bash
feff2e61bbb065ed8ae747fa29b6c0f27612614a35fabf36e3389cb7af6188e8
[root@server1 www]# docker exec -it web5 bash
[root@feff2e61bbb0 /]# ping web4
PING web4 (172.17.0.3) 56(84) bytes of data.
64 bytes from web4 (172.17.0.3): icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from web4 (172.17.0.3): icmp_seq=2 ttl=64 time=0.039 ms
^C
--- web4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.039/0.048/0.057/0.009 ms
完成

端口映射

-P是随机分配映射端口 -p是指定端口
随机端口是从32768开始每次递增

[root@server1 www]# docker run -d -P httpd:centos7 
7abd6c347c797acdb4546a8d46ca3940daaf7251c9d061a94a26cffd318c46b7
[root@server1 www]# docker ps -a | grep http
7abd6c347c79        httpd:centos7       "/run.sh"                5 seconds ago       Up 5 seconds                  0.0.0.0:32768->80/tcp    hopeful_shamir
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值