Docker容器技术之镜像制作

Docker容器技术之镜像制作

上篇文章说到过,作为用户是不需要制作镜像的,因为几乎所有常用的数据局库、应用软件、中间件在Docker Hub 里面可以找到,但是如果到了万不得已的时候我们还是要自己制作镜像,比如给自己编写的软件制作镜像。
制作镜像有两种方法:
1.docker commit命令
2.编写Dockerfile利用docker build制作镜像

一、docker commit命令

利用docker commit命令制作镜像非常的简单,主要有三个步骤:

  1. 运行容器
    在这个例子中我们以ubuntu:22.04为例进行制作镜像,我们首先要运行以这个镜像为基础的镜像:
    在这里插入图片描述
    这个图片展示了运行容器之后的效果。

  2. 修改容器
    我们可以在容器两面进行所需的修改操作,我们以安装apache为例进行安装。

root@77bdc44519a9:/# sed -ri 's/archive.ubuntu/mirrors.huaweicloud/g' /etc/apt/sources.list          
root@77bdc44519a9:/# apt update && apt install apache2
#省略
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser ufw bzip2-doc gdbm-l10n
  libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap
  libsasl2-modules-otp libsasl2-modules-sql perl-doc libterm-readline-gnu-perl
  | libterm-readline-perl-perl make libtap-harness-archive-perl
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils bzip2 ca-certificates file libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libbrotli1 libcurl4 libexpat1 libgdbm-compat4 libgdbm6
  libicu70 libjansson4 libldap-2.5-0 libldap-common liblua5.3-0 libmagic-mgc libmagic1 libnghttp2-14
  libperl5.34 libpsl5 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0 libssh-4
  libxml2 mailcap media-types mime-support netbase openssl perl perl-modules-5.34 publicsuffix
  ssl-cert xz-utils
0 upgraded, 43 newly installed, 0 to remove and 9 not upgraded.
Need to get 25.6 MB of archives.
After this operation, 111 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 perl-modules-5.34 all 5.34.0-3ubuntu1 [2975 kB]
Get:2 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libgdbm6 amd64 1.23-1 [33.9 kB]
Get:3 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libgdbm-compat4 amd64 1.23-1 [6606 B]
Get:4 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libperl5.34 amd64 5.34.0-3ubuntu1 [4809 kB]
Get:5 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 perl amd64 5.34.0-3ubuntu1 [232 kB]
Get:6 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libapr1 amd64 1.7.0-8build1 [107 kB]
Get:7 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libexpat1 amd64 2.4.7-1 [90.7 kB]       
Get:8 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libaprutil1 amd64 1.6.1-5ubuntu4 [92.4 kB]
Get:9 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libsqlite3-0 amd64 3.37.2-2 [643 kB]    
Get:10 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libaprutil1-dbd-sqlite3 amd64 1.6.1-5ubuntu4 [11.3 kB]
Get:11 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libsasl2-modules-db amd64 2.1.27+dfsg2-3ubuntu1 [20.8 kB]
Get:12 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libsasl2-2 amd64 2.1.27+dfsg2-3ubuntu1 [53.9 kB]
Get:13 http://mirrors.huaweicloud.com/ubuntu jammy-updates/main amd64 libldap-2.5-0 amd64 2.5.12+dfsg-0ubuntu0.22.04.1 [184 kB]
Get:14 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libaprutil1-ldap amd64 1.6.1-5ubuntu4 [9162 B]
Get:15 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libbrotli1 amd64 1.0.9-2build6 [315 kB]
Get:16 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libnghttp2-14 amd64 1.43.0-1build3 [76.3 kB]
Get:17 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 libpsl5 amd64 0.21.0-1.2build2 [58.4 kB]
Get:18 http://mirrors.huaweicloud.com/ubuntu jammy/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2build4 [58.2 kB]
eb ...
untu4) ...
Selecting previously unselected package libbrotli1:amd64.
Preparing to unpack .../14-libbrotli1_1.0.9-2build6_amd64.deb ...
Unpacking libbrotli1:amd64 (1.0.9-2build6) ...
Selecting previously unselected package libnghttp2-14:amd64.
Preparing to unpack .../15-libnghttp2-14_1.43.0-1build3_amd64.deb ...
Unpacking libnghttp2-14:amd64 (1.43.0-1build3) ...
Selecting previously unselected package libpsl5:amd64.
Preparing to unpack .../16-libpsl5_0.21.0-1.2build2_amd64.deb ...
Unpacking libpsl5:amd64 (0.21.0-1.2build2) ...
#省略
Selecting previously unselected package netbase.
Preparing to unpack .../33-netbase_6.3_all.deb ...
Unpacking netbase (6.3) ...
Selecting previously unselected package libmagic-mgc.
Preparing to unpack .../34-libmagic-mgc_1%3a5.41-3_amd64.deb ...
Unpacking libmagic-mgc (1:5.41-3) ...

Enabling module mpm_event.
Enabling module authz_core.
Enabling module authz_host.
Enabling module authn_core.
Enabling module auth_basic.
Enabling module access_compat.
Enabling module authn_file.
Enabling module authz_user.
Enabling module alias.
Enabling module dir.
Enabling module autoindex.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module filter.
Enabling module deflate.
Enabling module status.
Enabling module reqtimeout.
Enabling conf charset.
Enabling conf localized-error-pages.
Enabling conf other-vhosts-access-log.
Enabling conf security.
Enabling conf serve-cgi-bin.
Enabling site 000-default.
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.35-0ubuntu3) ...
Processing triggers for ca-certificates (20211016) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

此过程就是修改镜像的过程。

  • 将容器保存为新的镜像
    镜像修改完毕之后我们可以利用docker commit命令重新生成我们需要的镜像。
    退出容器之后就可以进行重新保存镜像了。
    在这里插入图片描述保存完镜像之后可以看出我们保存后的镜像已经显示出来。
    利用这个方法制作镜像非常的简单,但是有下面几个缺点:
  • 这是穿手工制作镜像,容易出错;
  • 这种制作的镜像没法检测镜像的制作过程以及来源,无法进行审计,存在安全隐患;
  • 无法移植,如果改变base镜像,所有的过程必须重新来一遍,非常麻烦。

二、Dockerfile制作镜像

这种方法制作镜像相比上面的方法有很大的灵活性,并且有很大的移植性。

Dockerfile是一个文本文件,记录了镜像构建的所有步骤。
首先介绍常用的指令:

  • FROM 制定base镜像
  • MAINTAINER 设置镜像的作者,可以是任何字符
  • COPY 将文件从build context复制到镜像。COPY支持两种形式: COPY src dest与COPY [“src”,“dest”]。注意:src只能指定build context中的文件或目录。
  • ADD 与COPY类似,从build context复制文件到镜像。不同的是,如果src是归档文件(tar、zip、tgz、xz等),文件会被自动解压到dest。
  • ENV 设置环境变量,环境变量可被后面的指令使用。
  • EXPOSE 指定容器中的进程会监听某个端口,Docker可以将该端口暴露出来。
  • VOLUME 跟运行容器时的docker managed volume效果一样。
  • WORKDIR 为后面的RUN、CMD、ENTRYPOINT、ADD或COPY指令设置镜像中的当前工作目录。
  • CMD 容器启动时运行指定的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run之后的参数替换。
  • RUN 在容器中运行指定的命令
  • ENTRYPOINT 设置容器启动时运行的命令。Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效。CMD或docker run之后的参数会被当作参数传递给ENTRYPOINT。
    上面这些指令时编写Dockerfile文件常用的指令,每个指令的作用大家要牢记,可以灵活运用达到建立高质量镜像的目的。
    下面展示作者编写的一个基于ubuntu22.04制作apache2应用程序的镜像的Dockerfile文件,上面的命令没有都用到。
    在这里插入图片描述

这个就是全部的Dockerfile文件。
注意,以#开头的行为注释行
编写完Dockerfile文件之后,然后利用docker build命令进行创建。

helmer@Hanssen:~/scripts/apache_ubuntu$ docker build -t apache_dockerfile:v.1 .
#注意:1.后面的点指示了上下文环境;2-t标志不能忘记。

创建镜像的过程如下:

helmer@Hanssen:~/scripts/apache_ubuntu$ docker build -t apache_dockerfile:v.1 .
Sending build context to Docker daemon   2.56kB
Step 1/6 : FROM ubuntu:22.04
 ---> 27941809078c
Step 2/6 : MAINTAINER Helmer Hanssen <helmer_hanssen@139.com>
 ---> Running in c7eb54e56ff0
Removing intermediate container c7eb54e56ff0
 ---> 3ed97ab2be00
Step 3/6 : RUN sed -ri 's/archive.ubuntu/mirrors.huaweicloud/g' /etc/apt/sources.list && apt-get update && apt-get install -y apache2 && apt-get clean
 ---> Running in 831a4c596eb7
#省略更新软件列表和安装软件的过程
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.35-0ubuntu3) ...
Processing triggers for ca-certificates (20211016) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Removing intermediate container 831a4c596eb7
 ---> cdc9756b7834
Step 4/6 : ENV APACHE_LOG_DIR /var/log/apache2
 ---> Running in a1a1b61131a8
Removing intermediate container a1a1b61131a8
 ---> 18d93ab7bbd8
Step 5/6 : EXPOSE 80
 ---> Running in 4a137ace98af
Removing intermediate container 4a137ace98af
 ---> 144c35395468
Step 6/6 : ENTRYPOINT ["/usr/sbin/apache2ctl","-D","FOREGROUND"]
 ---> Running in 95219bc60eab
Removing intermediate container 95219bc60eab
 ---> 735f44eda4db
Successfully built 735f44eda4db
Successfully tagged apache_dockerfile:v.1
helmer@Hanssen:~/scripts/apache_ubuntu$ 

在这里插入图片描述我们制作的镜像已经显示出来。
以上就是制作docker镜像的两种方法。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helmer_hanssen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值