首页 > 其他分享 >Docker镜像构建

Docker镜像构建

时间:2022-09-01 14:11:35浏览次数:73  
标签:11 centos --- 构建 yum 镜像 Docker root

Docker镜像构建

目录

​ Docker镜像可以通过Docker hub或者阿里云等仓库中获取,这些镜像是由官方或者社区人员提供的,对于Docker用户来说并不能满足我们的需求,但是从无开始构建镜像成本大。常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或社区创建的镜像,我们只需要稍作配置就可以直接使用。

​ 使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为Docker的工程师知道如何更好的在容器中运行软件。

​ 当然,某些情况下我们也不得不自己构建镜像,比如找不到现成的镜像,比如自己开发的应用程序,需要在镜像中加入特定的功能。

Docker镜像的三种构建方法:

  1. docker commit命令构建

  2. 基于本地模板导入

  3. 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。

image-20220901115950571

示例:

使用模板导入镜像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

  1. 基本概念

​ Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

​ 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。

​ Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦。

  1. 文本格式

​ 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文件内的指令会逐一运行,构建过程如下:

  1. 下载centos镜像。

  2. 添加镜像构建者信息

  3. 基于centos镜像启动容器,删除并重新配置yum源,安装nginx软件,安装完毕后将容器打包为镜像。

  4. 基于上一步生成的镜像启动容器,将80端口打开,打开后将容器打包为镜像。

  5. 基于上一步生成的镜像启动容器,添加容器启动后需要执行的指令,再打包为镜像。

​ 也就说一条指令就是一层镜像,还可以通过docker history查看镜像的构建过程,这样我们构建的镜像就呈现出透明化,整个构建的过程都可以看到。

  1. 镜像缓存

​ 使用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

相关文章

  • 只需搞定Docker,环境问题再也不是测开路上的『坑』
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取轻量级:因为docker不用虚拟化内核,直接共享宿主机的内核,所以节省了很多资源,在同样的资源下可以......
  • liunx系统docker部署.net core3.1
    此篇文章演示基本的基于docker部署.netcore服务,liunx系统腾讯云ubuntu,.netcore版本3.1。1.安装dockeraptinstalldocker.io2.拉取.netcore依赖镜像dockerpullm......
  • docker教程-常用命令
    背景docker适配的时候命令总是记得很熟,当版本结束了docker命令忘的差不多,这次记录一下docker基本操作获取镜像dockerpullubuntu列出镜像列表dockerimages删除镜......
  • 如何在 Python 中逐步构建 Twitter Bot?
    如何在Python中逐步构建TwitterBot?Twitter允许公司以客户喜爱的简洁、即时的方式与客户进行交流。出于这个原因,许多人依赖Twitter获取新闻、更新以及解决问题的方......
  • 构建网站:前端与后端
    构建网站:前端与后端你需要知道的网站的出现无疑为万维网上的数据和信息的分类、组织和可访问性带来了便利,并且毫无疑问是数字资产。当您在浏览器上单击网站的链接或域地......
  • 构建自定义镜像并优化dockerfile文件
    目录一.系统环境二.前言三.镜像构建步骤四.dockerfile文件常用指令4.1dockerfile文件常用指令4.2RUN、CMD、ENTRYPOINT的区别五.构建centos镜像5.1构建一个可以使用ifco......
  • 创建镜像(alpine版)+alpine
    目录podman用脚本和dockerfile做apache编译安装镜像1.0安装介质2.0特点2.0基础命令3.0模式podman用脚本和dockerfile做apache编译安装镜像[root@localhost~]#mkdir......
  • 使用 Gin 框架在 GoLang 中构建 API 服务
    使用Gin框架在GoLang中构建API服务今天我将向你展示如何在Go中构建一个简单的API服务。我们的项目演示将是一个简单的作者和他们的图书库项目。第一步:首先,我......
  • python + VS code + Docker
    目录1.安装docker2.构建映像3.启动docker4.安装VisualStudioCode并配置5.参考在python项目开发中,经常需要安装依赖包,还要考虑版本兼容问题。尤其是,升级一个python版本,......
  • linux docker安装RabbitMQ记录
    1.使用docker查询rabbitmq的镜像dockersearchrabbitmq 2.安装镜像安装name为rabbitmq的这里是直接安装最新的,如果需要安装其他版本在rabbitmq后面跟上版本号即可dock......