Docker容器技术之镜像制作
上篇文章说到过,作为用户是不需要制作镜像的,因为几乎所有常用的数据局库、应用软件、中间件在Docker Hub 里面可以找到,但是如果到了万不得已的时候我们还是要自己制作镜像,比如给自己编写的软件制作镜像。
制作镜像有两种方法:
1.docker commit命令
2.编写Dockerfile利用docker build制作镜像
一、docker commit命令
利用docker commit命令制作镜像非常的简单,主要有三个步骤:
-
运行容器
在这个例子中我们以ubuntu:22.04为例进行制作镜像,我们首先要运行以这个镜像为基础的镜像:
这个图片展示了运行容器之后的效果。 -
修改容器
我们可以在容器两面进行所需的修改操作,我们以安装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标志不能忘记。
创建镜像的过程如下:文章来源:https://www.toymoban.com/news/detail-447816.html
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镜像的两种方法。文章来源地址https://www.toymoban.com/news/detail-447816.html
到了这里,关于Docker容器技术之镜像制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!