Docker镜像构建
目录 Docker镜像可以通过Docker hub或者阿里云等仓库中获取,这些镜像是由官方或者社区人员提供的,对于Docker用户来说并不能满足我们的需求,但是从无开始构建镜像成本大。常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或社区创建的镜像,我们只需要稍作配置就可以直接使用。
使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为Docker的工程师知道如何更好的在容器中运行软件。
当然,某些情况下我们也不得不自己构建镜像,比如找不到现成的镜像,比如自己开发的应用程序,需要在镜像中加入特定的功能。
Docker镜像的三种构建方法:
-
docker commit
命令构建 -
基于本地模板导入
-
Dockerfile
Docker commit
docker commit
命令可以基于容器创建镜像,简而言之就是先使用官方或者其他渠道的镜像创建容器,然后在容器内搭建自己需要的服务,然后使用docker commit
将容器打包成镜像。
示例:
在centos镜像创建的容器内安装vim并重新打包成镜像
[root@rh3 ~]# docker images #查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 11 months ago 231MB
[root@rh3 ~]# docker run -dit --name centos1 centos:latest #使用centos镜像创建容器并运行
da074832b6f841cd1e5641b46fb92512025ed5462926ae0858af869ab8f2a773
[root@rh3 ~]# docker exec -it centos1 /bin/bash #进入容器
[root@da074832b6f8 /]# cd /etc/yum.repos.d/ #进入yum仓库重新配置网络仓库,这里使用阿里云仓库
[root@da074832b6f8 yum.repos.d]# rm -rf *
[root@da074832b6f8 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2495 100 2495 0 0 3757 0 --:--:-- --:--:-- --:--:-- 3751
[root@da074832b6f8 /]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@da074832b6f8 /]# yum -y install vim
[root@da074832b6f8 /]# rpm -qa | grep vim
vim-minimal-8.0.1763-15.el8.x86_64
vim-common-8.0.1763-16.el8.x86_64
vim-filesystem-8.0.1763-16.el8.noarch
vim-enhanced-8.0.1763-16.el8.x86_64
[root@rh3 ~]# docker commit centos1 centos:1 #退出容器之后使用commit命令打包容器为centos:1镜像
sha256:9816a0389ee69795e71b0ae7ca919a85dd3d7e3e3ad03a7d36c7bb76e7a8191b
[root@rh3 ~]# docker images #查看镜像,下次使用centos:1镜像创建容器时vim就已经安装好了
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 9816a0389ee6 15 seconds ago 298MB
centos latest 5d0da3dc9764 11 months ago 231MB
这样一个新的镜像就完成了,就是在原有镜像的基础上创建一个新的镜像。
然而,Docker并不建议用户通过这种方式构建镜像。这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。更重要的,使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。
基于本地模板导入
用户可以直接从一个操作系统模板文件导入一个镜像,主要使用docker [container] import
命令
命令格式:
docker [image] import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]
要直接导入一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导入的镜像模板来创建。OpenVZ 模板的下载地址为 http://openvz.org/Download/templates/precreated。
示例:
使用模板导入镜像debian7
[root@rh3 ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86_64-minimal.tar.gz #下载模板
[root@rh3 ~]# ls
debian-7.0-x86_64-minimal.tar.gz
[root@rh3 ~]# cat debian-7.0-x86_64-minimal.tar.gz | docker import - debian7 #基于模板导入镜像debian7
sha256:0cf6059cb4b91b3ca466f6ac3cfebfe5d8777f03fead179bc739866c03ff58ac
[root@rh3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian7 latest 0cf6059cb4b9 15 seconds ago 220MB
Dockerfile
- 基本概念
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦。
- 文本格式
Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如ADD指令。每执行一条ADD指令,镜像添加新的一层,并提交;最后是CMD指令,来指明运行容器时的操作命令。
示例:
基于centos镜像创建一个默认运行nginx的镜像
首先创建Dockerfile文件,编辑文件内容:删除镜像内原有yum源,重新配置网络源,然后安装nginx
[root@rh3 ~]# vim Dockerfile
#第一行必须指定基于的基础镜像
FROM centos:latest
#维护者信息
MAINTAINER [email protected]
#镜像操作指令
RUN rm -rf /etc/yum.repos.d/*
RUN yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
RUN sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
RUN sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y nginx
EXPOSE 80
#容器启动时默认要执行的指令
CMD ["/usr/sbin/nginx","-g","daemon off;"]
开始构建镜像
[root@rh3 ~]# docker build -t centos:nginx .
Sending build context to Docker daemon 107.9MB
Step 1/11 : FROM centos:latest
---> 5d0da3dc9764
Step 2/11 : MAINTAINER [email protected]
---> Running in 0fb3c857b7b2
Removing intermediate container 0fb3c857b7b2
---> f44dbd8ce98f
Step 3/11 : RUN rm -rf /etc/yum.repos.d/*
---> Running in e8b049d26706
Removing intermediate container e8b049d26706
---> 27599e88205e
Step 4/11 : RUN yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
---> Running in 43cc912349e4
epel-release-latest-8.noarch.rpm 52 kB/s | 24 kB 00:00
***省略***
Successfully built b999803d89d8
Successfully tagged centos:nginx
查看构建好的镜像
[root@rh3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos nginx b999803d89d8 10 minutes ago 390MB
通过以上镜像的构建过程可以看出,Dockerfile文件内的指令会逐一运行,构建过程如下:
-
下载centos镜像。
-
添加镜像构建者信息
-
基于centos镜像启动容器,删除并重新配置yum源,安装nginx软件,安装完毕后将容器打包为镜像。
-
基于上一步生成的镜像启动容器,将80端口打开,打开后将容器打包为镜像。
-
基于上一步生成的镜像启动容器,添加容器启动后需要执行的指令,再打包为镜像。
也就说一条指令就是一层镜像,还可以通过docker history
查看镜像的构建过程,这样我们构建的镜像就呈现出透明化,整个构建的过程都可以看到。
- 镜像缓存
使用Dockerfile文件构建完镜像以后,Docker会把构建过程中的每一层临时镜像进行缓存。在构建新镜像时,可以直接使用之前缓存的镜像层,这样能加速镜像的构建。
示例:
重新构建一遍镜像,重新编辑一个镜像名
[root@rh3 ~]# docker build -t centos:v2 .
Sending build context to Docker daemon 107.9MB
Step 1/11 : FROM centos:latest
---> 5d0da3dc9764
Step 2/11 : MAINTAINER [email protected]
---> Using cache
---> f44dbd8ce98f
Step 3/11 : RUN rm -rf /etc/yum.repos.d/*
---> Using cache
---> 27599e88205e
Step 4/11 : RUN yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
---> Using cache
---> e6014cb5b67f
Step 5/11 : RUN sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
---> Using cache
---> 97e2d0d1bcc6
Step 6/11 : RUN sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
---> Using cache
---> 5c9adf3bf1d0
Step 7/11 : RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
---> Using cache
---> b6c924ee05e9
Step 8/11 : RUN sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
---> Using cache
---> 62784141c7da
Step 9/11 : RUN yum install -y nginx
---> Using cache
---> c0a78f47a6a0
Step 10/11 : EXPOSE 80
---> Using cache
---> f330399dc69b
Step 11/11 : CMD ["/usr/sbin/nginx","-g","daemon off;"]
---> Using cache
---> b999803d89d8
Successfully built b999803d89d8
Successfully tagged centos:v2
可以看到重复的步骤都使用了缓存(Using cache)如果希望在构建镜像时不使用缓存,可以在docker build命令中加上--no-cache参数。
标签:11,centos,---,构建,yum,镜像,Docker,root From: https://www.cnblogs.com/Archer-x/p/16646310.html