Docker容器技術(shù)之鏡像制作
上篇文章說(shuō)到過(guò),作為用戶(hù)是不需要制作鏡像的,因?yàn)閹缀跛谐S玫臄?shù)據(jù)局庫(kù)、應(yīng)用軟件、中間件在Docker Hub 里面可以找到,但是如果到了萬(wàn)不得已的時(shí)候我們還是要自己制作鏡像,比如給自己編寫(xiě)的軟件制作鏡像。
制作鏡像有兩種方法:
1.docker commit命令
2.編寫(xiě)Dockerfile利用docker build制作鏡像
一、docker commit命令
利用docker commit命令制作鏡像非常的簡(jiǎn)單,主要有三個(gè)步驟:
-
運(yùn)行容器
在這個(gè)例子中我們以u(píng)buntu:22.04為例進(jìn)行制作鏡像,我們首先要運(yùn)行以這個(gè)鏡像為基礎(chǔ)的鏡像:
這個(gè)圖片展示了運(yùn)行容器之后的效果。 -
修改容器
我們可以在容器兩面進(jìn)行所需的修改操作,我們以安裝apache為例進(jìn)行安裝。
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.
此過(guò)程就是修改鏡像的過(guò)程。
- 將容器保存為新的鏡像
鏡像修改完畢之后我們可以利用docker commit命令重新生成我們需要的鏡像。
退出容器之后就可以進(jìn)行重新保存鏡像了。保存完鏡像之后可以看出我們保存后的鏡像已經(jīng)顯示出來(lái)。
利用這個(gè)方法制作鏡像非常的簡(jiǎn)單,但是有下面幾個(gè)缺點(diǎn): - 這是穿手工制作鏡像,容易出錯(cuò);
- 這種制作的鏡像沒(méi)法檢測(cè)鏡像的制作過(guò)程以及來(lái)源,無(wú)法進(jìn)行審計(jì),存在安全隱患;
- 無(wú)法移植,如果改變base鏡像,所有的過(guò)程必須重新來(lái)一遍,非常麻煩。
二、Dockerfile制作鏡像
這種方法制作鏡像相比上面的方法有很大的靈活性,并且有很大的移植性。
Dockerfile是一個(gè)文本文件,記錄了鏡像構(gòu)建的所有步驟。
首先介紹常用的指令:
- FROM 制定base鏡像
- MAINTAINER 設(shè)置鏡像的作者,可以是任何字符
- COPY 將文件從build context復(fù)制到鏡像。COPY支持兩種形式: COPY src dest與COPY [“src”,“dest”]。注意:src只能指定build context中的文件或目錄。
- ADD 與COPY類(lèi)似,從build context復(fù)制文件到鏡像。不同的是,如果src是歸檔文件(tar、zip、tgz、xz等),文件會(huì)被自動(dòng)解壓到dest。
- ENV 設(shè)置環(huán)境變量,環(huán)境變量可被后面的指令使用。
- EXPOSE 指定容器中的進(jìn)程會(huì)監(jiān)聽(tīng)某個(gè)端口,Docker可以將該端口暴露出來(lái)。
- VOLUME 跟運(yùn)行容器時(shí)的docker managed volume效果一樣。
- WORKDIR 為后面的RUN、CMD、ENTRYPOINT、ADD或COPY指令設(shè)置鏡像中的當(dāng)前工作目錄。
- CMD 容器啟動(dòng)時(shí)運(yùn)行指定的命令。Dockerfile中可以有多個(gè)CMD指令,但只有最后一個(gè)生效。CMD可以被docker run之后的參數(shù)替換。
- RUN 在容器中運(yùn)行指定的命令
- ENTRYPOINT 設(shè)置容器啟動(dòng)時(shí)運(yùn)行的命令。Dockerfile中可以有多個(gè)ENTRYPOINT指令,但只有最后一個(gè)生效。CMD或docker run之后的參數(shù)會(huì)被當(dāng)作參數(shù)傳遞給ENTRYPOINT。
上面這些指令時(shí)編寫(xiě)Dockerfile文件常用的指令,每個(gè)指令的作用大家要牢記,可以靈活運(yùn)用達(dá)到建立高質(zhì)量鏡像的目的。
下面展示作者編寫(xiě)的一個(gè)基于ubuntu22.04制作apache2應(yīng)用程序的鏡像的Dockerfile文件,上面的命令沒(méi)有都用到。
這個(gè)就是全部的Dockerfile文件。
注意,以#開(kāi)頭的行為注釋行
編寫(xiě)完Dockerfile文件之后,然后利用docker build命令進(jìn)行創(chuàng)建。
helmer@Hanssen:~/scripts/apache_ubuntu$ docker build -t apache_dockerfile:v.1 .
#注意:1.后面的點(diǎn)指示了上下文環(huán)境;2-t標(biāo)志不能忘記。
創(chuàng)建鏡像的過(guò)程如下:文章來(lái)源:http://www.zghlxwxcb.cn/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
#省略更新軟件列表和安裝軟件的過(guò)程
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$
我們制作的鏡像已經(jīng)顯示出來(lái)。
以上就是制作docker鏡像的兩種方法。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-447816.html
到了這里,關(guān)于Docker容器技術(shù)之鏡像制作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!