半小时带你熟悉Docker镜像的构建方式

2024-01-21 22:40

本文主要是介绍半小时带你熟悉Docker镜像的构建方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 

摘要

一、Docker镜像的分层

二、Docker镜像的创建

2.1、Docker镜像

2.1.1、应用发布的标准格式

2.1.2、支撑一个Docker容器的运行

2.2、Docker镜像的创建方法

2.2.1、基于已有镜像创建

2.2.2、基于本地模板创建

2.2.3、基于Dockerfile创建

2.3、基于已有镜像创建

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

2.3.2、操作步骤

2.4、基于本地模板创建

2.5、基于Dockerfile创建

2.5.1、Dockerfile是由一组指令组成的文件

2.5.2、Dockerfile结构四部分

2.5.3、Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释

2.5.4、Dockerfile操作指令

2.5.5、Dockerfile创建

测试apache网页是否能正常访问

三、私有仓库建立

3.1、下载私有仓库

3.2、添加私有仓库的IP和对应端口

3.3、挂载

3.4、更改标记并上传

3.5、从私有库下载

四、Docker数据卷

-v 会自动进行创建目录进行挂载(宿主机与容器之间挂载)

五、端口映射

六、容器互联


摘要

在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议。

采用docker commit生成的镜像实际上是容器内的文件系统进行修改在进行提交,而运行的容器实际上是在镜像的文件系统顶层添加了一层读写层,所都的修改都是基于这一层,当生成镜像时会将这一层数据保存,所以每次使用commit提交镜像时候都会比原来多一层,这样会使得镜像越来越大并且不易维护。同时,对于镜像使用者来说完全不透明,使用者不清楚该镜像怎么样构建的,是否安全等,这种方式及其不推荐。

而使用Dockerfile构建镜像,对于使用者来说完全透明,构建镜像的每一个步骤都在Dockerfile文件中描述的清清楚楚,同时当需要对镜像修改时候,只需修改Dockerfile文件中的指令,维护镜像只需要维护一个Dockerfile,这也是镜像构建的最佳方式。当然,要使用Dockerfile就必须明白Dockerfile的语法和各个指令,以下将作详细介绍

一、Docker镜像的分层

 

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

二、Docker镜像的创建

2.1、Docker镜像

2.1.1、应用发布的标准格式

2.1.2、支撑一个Docker容器的运行

2.2、Docker镜像的创建方法

2.2.1、基于已有镜像创建

2.2.2、基于本地模板创建

2.2.3、基于Dockerfile创建

2.3、基于已有镜像创建

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

docker create -it 镜像 /bin/bash
docker commit [选项] 容器ID/名称 仓库名称:[标签]
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行

2.3.2、操作步骤

[root@server1 ~]#  docker commit -m "new" -a "yun" 356c7fa47764 centos:xu
sha256:1c0bd2acf2df664b2fa516e352bb6640568d1fc2ba9c5a64935a9cb45e92c158
[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              xu                  1c0bd2acf2df        35 seconds ago      204MB
centos              7                   8652b9f0cb4c        12 days ago         204MB

2.4、基于本地模板创建

导入本地镜像debian-7.0-x86-minimal.tar.gz
[root@server1 ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - docker:yun
sha256:cb190951edfb4274dd4933d34ffe36f11fbe985629cd274fb297d092a314362e
[root@server1 ~]# docker images     #查看是否导入成功
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker              yun                 cb190951edfb        10 seconds ago      215MB

2.5、基于Dockerfile创建

2.5.1、Dockerfile是由一组指令组成的文件

2.5.2、Dockerfile结构四部分

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

2.5.3、Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释

2.5.4、Dockerfile操作指令

指令

含义

FROM 镜像

指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令

MAINTAINER 名字

说明新镜像的维护人信息

RUN 命令

在所基于的镜像上执行命令,并提交到新的镜像中

CMD [“要运行的程序”,“参数”]

指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行

EXPOSE 端口号

指定新镜像加载到Docker时要开启的端口

ENV 环境变量 变量值

设置一个环境变量的值,会被后面的RUN使用

ADD 源文件/目录 目标文件/目录

将主机的文件拷贝到容器中,源文件要与Dockerfile位于相同目录中,或者是一个URL

COPY 源文件/目录 目标文件/目录

将容器中的文件拷贝到容器的其他目录中

VOLUME [“目录”]

再容器中创建一个挂载点

USER 用户名/UID

指定运行容器时的用户

WORKDIR 路径

为后续的RUN、CMD、ENTRYPOINT指定工作目录

ONBUILD 命令

指定所生成的镜像作为一个基础镜像时所要运行的命令

HEALTHCHECK

健康检查

2.5.5、Dockerfile创建

创建环境:
[root@server1 ~]# mkdir Dockerfile
[root@server1 ~]# cd Dockerfile/
准备环境:
[root@server1 Dockerfile]# vim Dockerfile
FROM centos:7                            ###基于的基础镜像
MAINTAINER this is porject               ###维护镜像的用户信息
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"]                          ###启动容器时执行脚本
制作网页:
[root@server1 Dockerfile]# vim index.html   ###编辑网页用于测试<h1>this is yun web</h1>
制作脚本:
#!/bin/bash
rm - rf /eun/httpd/*                        ###还原apache环境
exec /usr/sbin/apachectl -D FOREGROUND      ###启动apache
[root@server1 Dockerfile]# docker build -t httpd:centos .   ###生成镜像(注意末尾有 .),如果没有改镜像文件则会自动下载。
Sending build context to Docker daemon  4.096kB
Step 1/9 : FROM centos:7---> 8652b9f0cb4c
Step 2/9 : MAINTAINER this is porject---> Running in 34bd82aa6673
Removing intermediate container 34bd82aa6673---> 3755fedb11a0
Step 3/9 : RUN yum -y update---> Running in 98ce317dc57b
Loaded plugins: fastestmirror, ovl
.......
[root@server1 Dockerfile]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              156224687ee8        54 seconds ago      476MB
[root@server1 Dockerfile]# docker run -d -p 1216:80 httpd:centos   ###新景象运行容器,开放端口
2a12b1df8720537830234194f11643387bba44f7c3829f6e941828b8654c33b0
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
2a12b1df8720        httpd:centos        "/run.sh"           About a minute ago   Up About a minute   0.0.0.0:1216->80/tcp   vigorous_thompson

测试apache网页是否能正常访问

三、私有仓库建立

3.1、下载私有仓库

[root@server1 Dockerfile]# docker pull registty

3.2、添加私有仓库的IP和对应端口

[root@server1 Dockerfile]# vim /etc/docker/daemon.json
{"insecure-registries": ["192.168.206.10:5000"],  ###添加,私有仓库的IP和对应端口(私有仓库端口号必须为5000)"registry-mirrors": ["https://whqvkexq.mirror.aliyuncs.com"]
}
[root@server1 Dockerfile]# systemctl restart docker  ###重启容器
[root@server1 Dockerfile]# docker create -it registry /bin/bash  ###创建私有仓库容器
2689fc06b74aff5c369d0e752eed630543e566ec5b9342a0a8fcb4d477c3da95
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                            PORTS               NAMES
2689fc06b74a        registry            "/entrypoint.sh /bin…"   About a minute ago   Created                                               eager_herschel

3.3、挂载

[root@server1 Dockerfile]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
1878a65906829e1de7d3652219b0d80cc5854a5e13a98f7831b4a2363baddb89
宿主机的/data/registry自动创建挂载容器中的/tmp/registry
-v自动创建挂载目录

3.4、更改标记并上传

[root@server1 Dockerfile]# docker tag httpd:centos 192.168.206.10:5000/httpd    ###更改镜像名
[root@server1 Dockerfile]# docker push 192.168.206.10:5000/httpd   ###上传镜像至私有仓库
The push refers to repository [192.168.206.10:5000/httpd]
f02747fcff65: Pushed 
d6c78c677b78: Pushed 
f825568f2398: Pushed 
21e2a5ab4395: Pushed 
1fe4b51e1368: Pushed 
174f56854903: Pushed 
latest: digest: sha256:f21bce184cccec0a257efa32c89db7df9c67dd362b7af714c992047bdf6b1aad size: 1574
[root@server1 Dockerfile]# curl -XGET http://192.168.206.10:5000/v2/_catalog             ###查看私有仓库日志是否上传成功
{"repositories":["httpd"]}

3.5、从私有库下载

[root@server1 Dockerfile]# docker pull 192.168.206.10:5000/httpd   ###从私有库下载镜像
Using default tag: latest
latest: Pulling from httpd
2d473b07cdd5: Already exists 
aeccfc090adc: Pull complete 
d774628e1410: Pull complete 
881f2f80d1a9: Pull complete 
7d317a21df31: Pull complete 
c5ecc453c9ea: Pull complete 
Digest: sha256:f21bce184cccec0a257efa32c89db7df9c67dd362b7af714c992047bdf6b1aad
Status: Downloaded newer image for 192.168.206.10:5000/httpd:latest
192.168.206.10:5000/httpd:latest
[root@server1 Dockerfile]# docker images                          ###查看是否下载成功
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.206.10:5000/httpd   latest              156224687ee8        38 minutes ago      476MB

四、Docker数据卷

-v 会自动进行创建目录进行挂载(宿主机与容器之间挂载)

[root@server1 Dockerfile]# docker pull centos           ###基于centos镜像
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@server1 Dockerfile]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash       将宿主机目录/var/www挂载到容器中的/data1
[root@cf8e3dbf0cc7 /]# ls 
bin    dev  home  lib64       media  opt   root  sbin  sys  usr
data1  etc  lib   lost+found  mnt    proc  run	 srv   tmp  var
[root@cf8e3dbf0cc7 /]# cd /data1
[root@cf8e3dbf0cc7 data1]# echo "yun111" > yun.txt
[root@server1 Dockerfile]# ls /var/www
yun.txt
在容器中创建文件,宿主机中查看
[root@server1 Dockerfile]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bas    ###创建数据卷容器,容器中含两个数据卷提供使用
[root@5387638eee26 /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[root@5387638eee26 /]# cd data1
[root@5387638eee26 data1]# echo "yun111" > yun.txt
[root@5387638eee26 data1]# cd ..
[root@5387638eee26 /]# cd data2
[root@5387638eee26 data2]# echo "yun222" > ming.txt
[root@server1 Dockerfile]# docker run -it --volumes-from web100 --name db1 centos:7 /bin/bash    ###创建另一台容器并关联web100,数据卷使用的为web100,名字为db1
[root@6f5be8a60fd2 /]# ll
total 12
-rw-r--r--.   1 root root 12114 Nov 13 01:55 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Nov 13 01:53 bin -> usr/bin
drwxr-xr-x.   2 root root    21 Nov 26 09:28 data1
drwxr-xr-x.   2 root root    22 Nov 26 09:29 data2
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
6f5be8a60fd2        centos:7            "/bin/bash"              About a minute ago   Exited (0) 7 seconds ago                             db1
5387638eee26        centos:7            "/bin/bash"              9 minutes ago        Exited (0) 2 minutes ago                             web100
实现容器与容器之间数据共享

五、端口映射

[root@server1 Dockerfile]# docker run -d -P 192.168.206.10:5000/httpd  #P随机端口号,从32768开始
4f3fb7c10d610b68386c9e374e79671ea2e60a16eb5a2f0107d626ac153fe3bc  
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED              STATUS                      PORTS                    NAMES
4f3fb7c10d61        192.168.206.10:5000/httpd   "/run.sh"                About a minute ago   Up About a minute           0.0.0.0:32768->80/tcp    pedantic_mayer
[root@server1 Dockerfile]# docker run -d -p 42520:80 192.168.206.10:5000/httpd       #p指定端口号
c50bf47c41ae6b062369360e76e7a7fd31875efbd6cde3901a0758d8b7a3925d   
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                      PORTS                    NAMES
c50bf47c41ae        192.168.206.10:5000/httpd   "/run.sh"                47 seconds ago      Up 46 seconds               0.0.0.0:42520->80/tcp    clever_grothendieck

六、容器互联

创建并运行容器取名web3,端口号自动映射
[root@server1 Dockerfile]# docker run -itd -P --name web3 centos:7 /bin/bash
c1bf9916cab7921ce1ddcd0306c3af57b8da44785d5821665762dff51d773540--name 指定容器名称创建并运行容器取名web4
[root@server1 Dockerfile]# docker run -itd -P --name web4 --link web3:web3 centos:7 /bin/bash
1bc5e55147fa18756398cc77e54bd15098da0d57434115e9e785b05c952107d9--link 关联进web4容器ping web3
[root@server1 Dockerfile]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                      PORTS                    NAMES
1bc5e55147fa        centos:7                    "/bin/bash"              2 minutes ago       Up 2 minutes                                         web4
c1bf9916cab7        centos:7                    "/bin/bash"              4 minutes ago       Up 4 minutes                                         web3
[root@server1 Dockerfile]# docker exec -it 1bc5e55147fa /bin/bash
[root@1bc5e55147fa /]# ping web3
PING web3 (172.17.0.5) 56(84) bytes of data.
64 bytes from web3 (172.17.0.5): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from web3 (172.17.0.5): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from web3 (172.17.0.5): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from web3 (172.17.0.5): icmp_seq=4 ttl=64 time=0.037 ms
64 bytes from web3 (172.17.0.5): icmp_seq=5 ttl=64 time=0.042 ms
64 bytes from web3 (172.17.0.5): icmp_seq=6 ttl=64 time=0.038 ms
64 bytes from web3 (172.17.0.5): icmp_seq=7 ttl=64 time=0.039 ms
64 bytes from web3 (172.17.0.5): icmp_seq=8 ttl=64 time=0.038 ms
^C
--- web3 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7002ms
rtt min/avg/max/mdev = 0.037/0.052/0.108/0.025 ms安装net工具
[root@1bc5e55147fa /]# yum -y install net-tools
[root@1bc5e55147fa /]# ifconfig     #查询网址信息
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.6  netmask 255.255.0.0  broadcast 172.17.255.255  #第一个创建的容器地址是172.17.0.2,以此类推ether 02:42:ac:11:00:06  txqueuelen 0  (Ethernet)RX packets 1625  bytes 11022891 (10.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 1612  bytes 90769 (88.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

这篇关于半小时带你熟悉Docker镜像的构建方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631047

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +