Docker容器技术之镜像制作

这篇具有很好参考价值的文章主要介绍了Docker容器技术之镜像制作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker容器技术之镜像制作

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

一、docker commit命令

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

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

  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命令重新生成我们需要的镜像。
    退出容器之后就可以进行重新保存镜像了。
    Docker容器技术之镜像制作保存完镜像之后可以看出我们保存后的镜像已经显示出来。
    利用这个方法制作镜像非常的简单,但是有下面几个缺点:
  • 这是穿手工制作镜像,容易出错;
  • 这种制作的镜像没法检测镜像的制作过程以及来源,无法进行审计,存在安全隐患;
  • 无法移植,如果改变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文件,上面的命令没有都用到。
    Docker容器技术之镜像制作

这个就是全部的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容器技术之镜像制作我们制作的镜像已经显示出来。
以上就是制作docker镜像的两种方法。文章来源地址https://www.toymoban.com/news/detail-447816.html

到了这里,关于Docker容器技术之镜像制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 根据自己修改后的容器制作镜像并上传docker hub

    要将自己的镜像上传到Docker Hub,可以按照以下步骤进行操作: 首先,确保已经在本地构建好了需要上传的 Docker 镜像。如果还没有构建,可以使用 docker build 命令来创建镜像。 登录到 Docker Hub 账号。打开终端或命令提示符,运行以下命令并输入相应的用户名和密码: docker

    2024年01月21日
    浏览(64)
  • Docker容器学习:Dockerfile制作Web应用系统nginx镜像

    目录 编写Dockerfile 1.文件内容需求: 2.编写Dockerfile: 3.开始构建镜像  4.现在我们运行一个容器,查看我们的网页是否可访问 推送镜像到私有仓库 1.把要上传的镜像打上合适的标签 2.登录harbor仓库 3.上传镜像 1.文件内容需求: 基于centos基础镜像。 指定作者信息。 安装nginx服

    2024年02月11日
    浏览(80)
  • Docker容器与虚拟化技术:Docker架构、镜像操作

    目录 一、理论 1.Doker概述 2.Docker核心概念 3.Docker安装 4.Docker的镜像管理命令 二、实验 1.Docker安装 2.查看Docker信息 3.Docker的镜像管理命令 三、问题 1.如何注册Docker账号  2.如何设置Docker公共存储库 四、总结 (1) IT架构 裸金属 → 虚拟机 → 容器→ 函数化、代码化 云计算涌现出很

    2024年02月10日
    浏览(54)
  • Docker容器与虚拟化技术:Docker架构、镜像管理

    目录 一、理论 1.Doker概述 2.Docker核心概念 3.Docker安装 4.Docker的镜像管理命令 二、实验 1.Docker安装 2.查看Docker信息 3.Docker的镜像管理命令 三、问题 1.如何注册Docker账号  2.如何设置Docker公共存储库 四、总结 (1) IT架构 裸金属 → 虚拟机 → 容器→ 函数化、代码化 云计算涌现出很

    2024年02月13日
    浏览(52)
  • Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

    目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像(基于SSH镜像) 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像(基于SSH镜像) 三、问题 1.nginx网页打不开  2.Apache容器启动一直为Ex

    2024年02月12日
    浏览(67)
  • Windows环境下清华ChatGLM3+docker-desktop镜像制作和配置GPU环境docker容器本地运行

    (1)下载或git拉取ChatGLM3镜像   拉取镜像,配置环境在此文就不多赘述   git clone https://github.com/THUDM/ChatGLM3.git (2)docker-desktop的安装 这里引用这位大佬的文章,讲的很详细

    2024年02月19日
    浏览(64)
  • Selenium技术在CentOS6.8系统的腾讯云服务器上的docker镜像的Ubuntu容器里的相关使用(Linux环境下)

    一开始看标题,我知道你们会很懵,我当初完成的时候,我自己也很懵,主要是想在Linux环境下使用Selenium技术来完成一些工作,本来打算用docker创建一个Anaconda的容器来用Selenium技术的,但发现无法通过chrome驱动来驱动谷歌浏览器,所以我又用docker创建了一个Ubuntu容器来使用

    2024年02月03日
    浏览(103)
  • 容器编排学习(二)镜像制作和私有仓库介绍

    commit的局限 很容易制作简单的镜像,但碰到复杂的情况就十分不方便例如碰到下面的情况 需要设置默认的启动命令 需要设置环境变量 需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方法 Dockerfile是一种更强大的镜像制作方式 编写类似脚本的 Dockerfile 文件,通

    2024年02月09日
    浏览(47)
  • docker 保存镜像、容器与导入镜像容器

    可以通过以下步骤将Docker镜像导出到另一台计算机上: 在本地计算机上使用以下命令将Docker镜像保存为tar文件: 其中,image-name是要导出的Docker镜像的名称。 将保存的tar文件传输到另一台计算机上,可以使用scp命令或其他文件传输工具。 在目标计算机上使用以下命令将tar文

    2024年02月13日
    浏览(46)
  • docker导出镜像、容器打镜像

    有两种方法,一种是通过容器,一种是通过镜像 1 首先使用 docker ps -a 查看本机上的所有容器 2 导出镜像 使用 docker export 命令根据容器 id 将镜像导成一个文件 上面命令执行之后,我们便可以通过 ls 命令在当前目录下发现 image.tar 3 导入镜像 使用 docker import 命令将这个镜像导

    2024年02月03日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包