Docker-04:Docker制作镜像

简介: 利用Docker命令构建镜像或者制作镜像的两种常见的方式

1. 目录

Docker

2. 制作镜像的方式

Docker 构建镜像的方式有两种,分别为 使用 docker commit 命令的方式以及利用 Dockerfile 方式。

3. 环境准备

我通过在 Windows 10 操作系统的虚拟机,安装的 CentOS 7.0CentOS 是最小安装版,安装后需要将服务器内核和补丁全部更新一遍。

CentOS 安装 Docker 后,可以查看 Docker 版本为 20.10.17 ,截止当前是 Docekr 社区版当中的最新版本。

  • Windows 10 Home 64bit
  • VMware Workstation Pro 16
  • CentOS 7.0
  • docker 20.10.17

我用一个自己写的 SpringBoot Web 项目,已经运行的 boot-app 作为源镜像,通过它再制作一个镜像名为 clone-boot

Web容器

4. docker commit命令的方式

docker commit 制作镜像,步骤可分为:运行容器脚本、镜像打包、导入镜像三个部分。

4.1. 命令详解

docker commit 的参数有四个,按照顺序,它们的含义分别是:指定作者、将 Dockerfile 指令应用于创建的镜像、提交的描述信息、以及提交期间暂停容器。

Flag shorthand -h has been deprecated, please use --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

  • 执行命令工具,看到返回一个新的镜像标识。

docker commit boot-app clone-boot

20220827202641

  • 使用构建的镜像来创建容器

docker run -di --name clone-boot -p 19091:19090 clone-boot

4.2. 运行容器

使用的命令为 docker exec ,具体用法如下表,此处也把它所有包含的命令罗列出来。


docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
名称 描述 备注
-d 以守护进程运行
-e 设置环境变量
-i 保持 STDIN 打开,即使没有连接
-t TTY 模式
-u 用户
-w 容器内的工作目录
  • 进入容器

docker exec -it clone-boot /bin/bash
  • 查看JDk版本

java -version

20220827204110

我在容器里头,更新 yum 命令,并且最后安装了 vim 文本,当然实际上还可以做自己想做的任何事情。

20220827204602

4.3. 打包

利用 docker save [OPTIONS] IMAGE [IMAGE...] 将运行中的容器打包,通过 -o 输出到某个磁盘路径中。


docker save -o /data/clone-boot.tar clone-boot

4.4. 导入

有了镜相报,我们导入docker load [OPTIONS] ,它只有两个参数

  • -i, --input string 从 tar 文件中读取
  • -q, --quiet 以静默的方式完成导入

docker load -i /data/clone-boot.tar

5. docker builder

Dockerfile 使用基本的基于 DSL 指令,构建一个 Docker 镜像,而后我们直接使用 docker builder 命令基于该 Dockerfile 中的指令构建一个新的镜像。

5.1. docker builder命令详解


Flag shorthand -h has been deprecated, please use --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string          Set the networking mode for the RUN instructions during build (default
                                "default")
      --no-cache                Do not use cache when building the image
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful build (default true)
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

5.2. Dockerfile语法

Dockerfile

5.2.1. FROM<必选>

用于指定 基础镜像 ,写在 Dockerfile 文件首行。后续所有指令都依赖指定的 基础镜像FROM 指令指定的 基础镜像 可以是官方远程仓库的,也可以位于私有仓库或者本地仓库。

由于是必选,所以在使用上遇到需要多个镜像过程中,可以指定多个 FROM 指令。

实际使用中该指令有两种书写格式:

  • FROM $IMAGE : 指定 基础镜像 为该镜像的最后修改的版本,我们经常默认不屑,即版本截止镜像使用时的 latest
  • FROM $IMAGE:$TAG : 为该 基础镜像 指定其在镜像分支版本

5.2.2. MAINTAINER

这个指令指定这个镜像创建者的基本信息,镜像创造者对这个镜像的标记。

  • MAINTAINER $Desc

5.2.3. RUN

当仓库中的镜像不能满足我们的要求,我们需要在构建镜像过程中安装定制的软件。常见的我们需要在镜像中安装 RUN yum install ‐y vim

实际使用中该指令有两种书写格式:

  • RUN $COMMAND
  • RUN ["executable", "param1", "param2" ... ]]

5.2.4. ADD/COPY

ADDCOPY 这两个指令比较类似,作用都是复制宿主机上的文件到目标镜像中。使用上的区别主要在于 ADD 还支持使用 tar 文件和 URL 路径。


ADD/COPY <src>... <dest>

5.2.5. WORKDIR

WORKDIR 指令,用于在镜像中,切换所在的工作目录,类似于 cd 命令。

注意:通过 WORKDIR 设置工作目录后, Dockerfile 中其后的命令 RUNCMDENTRYPOINTADDCOPY 等命令都会在该目录下执行。但是在使用 docker run 运行容器时,可以通过 -w 参数覆盖构建时所设置的工作目录。


WORKDIR /usr/local/

5.2.6. VOLUME

VOLUME 指令用于指定容器中需要持久化目录,防止因容器关闭造成容器中的更改出现丢失。但是它只能在指定容器内的路径,不能指定宿主机的路径。

  • 使用方式1:该 Dockerfile 生成镜像容器,/data/mysql 目录中的数据在容器关闭后,里面的数据还存在

FROM base
VOLUME ["/data/mysql"]
  • 使用方式2:将该目录共享给其他容器,此容器 $Source_Container/data/mysql 共享给 $Target_Container

docker run ‐t ‐i ‐rm ‐volumes‐from $Source_Container $Target_Container bash

5.2.7. EXPOSE

EXPOSE 指令,声明该容器的端口映射会到宿主机的端口,默认是 tcp 方式,还有 udp 使用上需要注意下。

  • 首先在 Dockerfile 使用 EXPOSE 设置需要映射的容器端口。
  • 其次在运行容器的时候指定 ‐P 参数,加上 EXPOSE 设置的端口,这样 EXPOSE 设置的端口号会被随机映射成宿主机高阶端口。此处的 ‐P 是大写

如果 EXPOSE 暴露的端口确定要和宿主机端口之间建立映射关系,一定要用到 docker run -p 此处的 ‐p 是小写

5.2.8. CMD

CMD 指令指定启动容器的默认要运行的程序,也就是 PID1 的进程命令,且其运行结束后容器也会终止。如果不指定,默认是 bash。该指令只能在 Dockerfile 文件中存在一次,如果有多个,则只执行最后一条。

实际使用中该指令有三种书写格式:

  • RCMDUN ["executable","param1","param2"]
  • CMD command param1 param2
  • CMD ["param1","param2"]

5.2.9. ENTRYPOINT

ENTRYPOINT 指令指定启动容器的默认要运行的程序,与 CMD 较为类似。但是 ENTRYPOINT 只能使用 JSON 方式指定执行命令,而不能指定参数,这一点需要和 CMD 配合来使用。

实际使用中该指令有两种书写格式:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2

在执行方式上: ENTRYPOINT 单独执行,如果此时还有 CMD ,则 CMD 和 ENTRYPOINT 会互相覆盖,只有最后一个 CMD 或 ENTRYPOINT 有效。

5.2.10. USER

USER 指令,设置启动容器的用户,默认是 root 用户。

5.3. Dockerfile样例

以下样例我是将我本地磁盘一个 JavaWeb 文件打包为一个镜像,并指定了运行参数,这是最简单一个样例。


FROM openjdk:8
ADD  demo-will.jar /demo.jar
ENTRYPOINT ["java", "-jar", "demo.jar"]
目录
相关文章
|
6天前
|
Docker 容器
【Docker】掌握 Docker 镜像操作:从基础到进阶
【Docker】掌握 Docker 镜像操作:从基础到进阶
|
6天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
6天前
|
Docker 容器
docker从指定repo拉取镜像
docker从指定repo拉取镜像
|
4天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
6天前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
25 2
如何删除 Docker 镜像、容器和卷?
|
6天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
6天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
110 0
|
6天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
6天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
6天前
|
数据库 Docker 容器
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
【5月更文挑战第8天】Dockerfile是构建Docker镜像的关键,它包含一系列指令,用于描述应用运行环境及所需软件包。通过自动化构建,能提高效率、保证可重复性并提升灵活性。确定基础镜像、安装依赖、设置环境后,执行Dockerfile生成镜像,用于应用程序部署。虽然需要熟悉Docker技术和应用细节,但其带来的益处使其成为现代软件开发和部署的重要工具。
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像