目录导航
- 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
准备工作:
- 下载centos镜像
docker pull centos
- 查看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
- 交互式运行centos容器:
docker run -it centos
该命令运行后,即进入centos容器中。
运行后发现,官方提供的centos镜像中并没有提供vim工具。对centos镜像增添vim工具,最后生成我们自定义的镜像
- centos容器中安装vim工具
yum install -y vim
安装完成后,使用以下命令检测是否安装成功
vim
出现此图说明安装成功,按 ESC
后,输入 :q
再按 Enter
退出界面。
- 退出centos交互式程序
exit
现在我们就有了一个经过我们自定义的container
[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
- 根据自定义的centos容器生成镜像
docker commit 09fe my/centos
- 现在我们就有了安装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是更推荐的方式,这样可以让使用者更清晰地看到这个镜像的制作细节
- 创建对应的目录
mkdir centos-vim
- 编写dockerfile文件
vi dockerfile
- 输入以下内容后,保存退出。
FROM centos:7
RUN yum install -y vim
- 使用docker build 命令构建镜像
docker build -t my/centos-2 .
注意: 不要忘记最后那个点。
报错1:
- 过程解析
使用镜像
生成容器
,通过容器
生成自定义镜像
,最后删除容器
。
2.1 dockerfile 介绍
dockerfile由一行行的命令语句组成,并且支持用 # 开头作为注释。
一般来说,dockerfile分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行的指令
2.2 dockerfile 命令
source: 抄袭波神很全面的总结
- COPY
复制本地主机的 <src> ( 为 dockerfile 所在目录的相对路径)到容器中的 <dest> (当使用本地目录为源目录时,推荐使用 COPY)
Usage:COPY [source directory or URL] [destination directory]
COPY /folder1 /folder2
- ADD
ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。
Usage: ADD [source directory or URL] [destination directory]
ADD /folder1 /folder2
- CMD
和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
Usage: CMD application “argument”, “argument”, …
CMD "echo" "Hello docker!"
- 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
- ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。
Usage: ENV key value
ENV SERVER_WORKS 4
- EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
Usage: EXPOSE [port]
EXPOSE 8080
- FROM
FROM命令可能是最重要的Dockerfile命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
Usage: FROM [image name]
FROM centos
- MAINTAINER
我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。
Usage: MAINTAINER [name]
MAINTAINER authors_name
- RUN
RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
Usage: RUN [command]
RUN yum install -y vim
- USER
USER命令用于设置运行容器的UID。
Usage: USER [UID]
USER 751
- VOLUME
VOLUME命令用于让你的容器访问宿主机上的目录。
Usage: VOLUME ["/dir_1", “/dir_2” …]
VOLUME ["/my_files"]
- 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"]