• Docker-04: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 ")
      -c, --change list      Apply Dockerfile instruction to the created image
      -m, --message string   Commit message
      -p, --pause            Pause container during commit (default true)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 执行命令工具,看到返回一个新的镜像标识。
    
    docker commit boot-app clone-boot
    
    
    • 1
    • 2
    • 3

    20220827202641

    • 使用构建的镜像来创建容器
    
    docker run -di --name clone-boot -p 19091:19090 clone-boot
    
    
    • 1
    • 2
    • 3

    4.2. 运行容器

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

    
    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
    
    • 1
    • 2
    • 3
    名称描述备注
    -d以守护进程运行
    -e设置环境变量
    -i保持 STDIN 打开,即使没有连接
    -tTTY 模式
    -u用户
    -w容器内的工作目录
    • 进入容器
    
    docker exec -it clone-boot /bin/bash
    
    
    • 1
    • 2
    • 3
    • 查看JDk版本
    
    java -version
    
    
    • 1
    • 2
    • 3

    20220827204110

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

    20220827204602

    4.3. 打包

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

    
    docker save -o /data/clone-boot.tar clone-boot
    
    
    • 1
    • 2
    • 3

    4.4. 导入

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

    • -i, --input string 从 tar 文件中读取
    • -q, --quiet 以静默的方式完成导入
    
    docker load -i /data/clone-boot.tar
    
    
    • 1
    • 2
    • 3

    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 [])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    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 ... 
    
    
    • 1
    • 2
    • 3
    5.2.5. WORKDIR

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

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

    
    WORKDIR /usr/local/
    
    
    • 1
    • 2
    • 3
    5.2.6. VOLUME

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

    • 使用方式1:该 Dockerfile 生成镜像容器,/data/mysql 目录中的数据在容器关闭后,里面的数据还存在
    
    FROM base
    VOLUME ["/data/mysql"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 使用方式2:将该目录共享给其他容器,此容器 $Source_Container/data/mysql 共享给 $Target_Container
    
    docker run ‐t ‐i ‐rm ‐volumes‐from $Source_Container $Target_Container bash
    
    
    • 1
    • 2
    • 3
    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"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    虚幻引擎5:增强输入的使用方法
    深度神经网络时与协方差矩阵
    原神服务器服务端多人联机教程
    用户前台页面设计与实现——基于SpringBoot和Vue的后台管理系统项目系列博客(十九)
    【Linux】【创建文件】Linux系统下在命令行中创建文件的方法
    Docker 搭建 mysql8 遇到的问题
    做自媒体视频需要怎么做才能年收入一百万?
    【Javaweb】会话跟踪技术Cookie&Session
    数据结构-堆排序Java实现
    Kerberos环境下 命令行连接kafka 和zk
  • 原文地址:https://blog.csdn.net/rothchil/article/details/126563645