目录导航

  • create a docker image
  • 一、方法1:docker commit
  • 1.1 docker commit 命令补充
  • 二、方法2:dockerfile
  • 2.1 dockerfile 介绍
  • 2.2 dockerfile 命令
  • 2.3 dockerfile 命令 实例:


create a docker image


本文是参照原文进行搭建的过程记录
虚拟机环境:

系统版本:CentOS-7-x86_64-DVD-1708
Docker version 1.13.1, build b2f74b2/1.13.1

一、方法1:docker commit

准备工作:

  1. 下载centos镜像
docker pull centos
  1. 查看centos镜像是否下载成功
docker container ls -a
[root@cent opt]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
47087e59143b        centos              "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                      admiring_shockley
  1. 交互式运行centos容器:
docker run -it centos

该命令运行后,即进入centos容器中。

docker hutool Snowflake生成id重复 docker image id一样_docker


运行后发现,官方提供的centos镜像中并没有提供vim工具。对centos镜像增添vim工具,最后生成我们自定义的镜像

docker hutool Snowflake生成id重复 docker image id一样_vim_02

  1. centos容器中安装vim工具
yum install -y vim

安装完成后,使用以下命令检测是否安装成功

vim

docker hutool Snowflake生成id重复 docker image id一样_centos_03


出现此图说明安装成功,按 ESC 后,输入 :q 再按 Enter 退出界面。

  1. 退出centos交互式程序
exit

docker hutool Snowflake生成id重复 docker image id一样_centos_04


现在我们就有了一个经过我们自定义的container

docker hutool Snowflake生成id重复 docker image id一样_centos_05

[root@cent opt]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                              NAMES
09fe20581736        centos              "/bin/bash"              4 hours ago         Exited (127) 4 hours ago                                                      laughing_jennings
  1. 根据自定义的centos容器生成镜像
docker commit 09fe my/centos
  1. 现在我们就有了安装vim后的centos镜像

    使用docker inspect命令来查看新创建的镜像的详细信息
docker inspect my/centos

1.1 docker commit 命令补充

source
可以在提交镜像时指定更多的数据(包括标签)来详细描述所做的修改。

docker commit -m="A new custom image" --author="zhangsan" b437ffe4d630 test/apache2:webserver

这条命令里,我们指定了更多的信息选项:

  • -m 用来指定创建镜像的提交信息;
  • –author 用来列出该镜像的作者信息;
  • 最后在test/apache2后面增加了一个webserver标签。

二、方法2:dockerfile

使用dockerfile是更推荐的方式,这样可以让使用者更清晰地看到这个镜像的制作细节

  1. 创建对应的目录
mkdir centos-vim
  1. 编写dockerfile文件
vi dockerfile
  • 输入以下内容后,保存退出。
FROM centos:7
  RUN yum install -y vim

docker hutool Snowflake生成id重复 docker image id一样_vim_06

  1. 使用docker build 命令构建镜像
docker build -t my/centos-2 .

注意: 不要忘记最后那个点。

docker hutool Snowflake生成id重复 docker image id一样_vim_07


报错1:

docker hutool Snowflake生成id重复 docker image id一样_docker_08

  1. 过程解析
    使用镜像生成容器,通过容器生成自定义镜像,最后删除容器

2.1 dockerfile 介绍

dockerfile由一行行的命令语句组成,并且支持用 # 开头作为注释。
一般来说,dockerfile分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行的指令

2.2 dockerfile 命令

source: 抄袭波神很全面的总结

  1. COPY
    复制本地主机的 <src> ( 为 dockerfile 所在目录的相对路径)到容器中的 <dest> (当使用本地目录为源目录时,推荐使用 COPY)
    Usage:COPY [source directory or URL] [destination directory]
COPY /folder1 /folder2
  1. ADD
    ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。
    Usage: ADD [source directory or URL] [destination directory]
ADD /folder1 /folder2
  1. CMD
    和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
    Usage: CMD application “argument”, “argument”, …
CMD "echo" "Hello docker!"
  1. ENTRYPOINT
    配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
    ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。
    Usage: ENTRYPOINT application “argument”, “argument”, …
    Remember: arguments are optional. They can be provided by CMD or during the creation of a container.
ENTRYPOINT echo

Usage example with CMD:
Arguments set with CMD can be overridden during *run*

CMD "Hello docker!"
 ENTRYPOINT echo
  1. ENV
    ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。
    Usage: ENV key value
ENV SERVER_WORKS 4
  1. EXPOSE
    EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
    Usage: EXPOSE [port]
EXPOSE 8080
  1. FROM
    FROM命令可能是最重要的Dockerfile命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
    Usage: FROM [image name]
FROM centos
  1. MAINTAINER
    我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。
    Usage: MAINTAINER [name]
MAINTAINER authors_name
  1. RUN
    RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
    Usage: RUN [command]
RUN yum install -y vim
  1. USER
    USER命令用于设置运行容器的UID。
    Usage: USER [UID]
USER 751
  1. VOLUME
    VOLUME命令用于让你的容器访问宿主机上的目录。
    Usage: VOLUME ["/dir_1", “/dir_2” …]
VOLUME ["/my_files"]
  1. WORKDIR
    WORKDIR命令用于设置CMD指明的命令的运行目录。
    Usage: WORKDIR /path
WORKDIR ~/

2.3 dockerfile 命令 实例:

source

# Use an official Python runtime as a base image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]