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"]
目录
相关文章
|
19天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
704 29
|
1月前
|
缓存 监控 持续交付
|
15天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
21天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
100 2
|
22天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
48 1
|
24天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
28天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
48 1
|
1月前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
826 2
|
1月前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
968 1
|
15天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
51 0
下一篇
无影云桌面