创建镜像
Dockerfile
Dockerfile 在容器内定义了环境中所执行的操作。在此环境中,对于网络接口和磁盘驱动器等资源的访问是被虚拟化了的,这将独立于系统的其余部分,因此必须将端口映射到外部,并且具体说明要“复制”到环境中的文件。
Dockerfile 指令
- 构建指令:用于构建镜像,其指定的操作不会在运行镜像的容器中执行
- 设置指令:用于设置镜像的属性,其指定的操作会在运行镜像的容器中执行
Dockerfile 指令说明
-
FROM
用于指定基础镜像,在基础镜像的基础上修改数据从而构建新的镜像。基础镜像可以是本地仓库也可以是远程仓库。(构建指令)
FROM <image name>:<tag name>
-
MAINTAINER
将镜像制作者(维护者)的信息写入镜像中,执行docker inspect
是会输出该信息。(构建指令)
MAINTAINER <maintainer name>
-
RUN
RUN可以运行任何被基础镜像支持的命令(即在基础镜像上执行一个进程),可以使用多条指令,指令较长时使用 \ 换行。(构建指令)
指令格式:RUN <command> <param1> <param2> ...
使用此指令相当于在 shell 中运行对应的指令RUN ["<executable>", "<param1>", "<param2>", ...]
使用此指令相当于指定用对应的 终端来执行
-
CMD
用于指定容器启动时的操作,可以是自定义脚本或命令,只会执行一次,若含有多个命令,默认执行最后一个。(设置命令)
该指令有三种格式:CMD ["<executable>", "<param1>", "<param2>", ...]
CMD <command> <param1> <param2> ...
CMD ["<param1>", "<param2>", ...]
此命令格式与 ENTRYPOINT 配合使用,只作为完整命令的参数部分
-
ENTRYPOINT
用于指定容器启动时执行的命令,若设置多次只执行最后一次。(设置命令)
该指令有两种格式:ENTRYPOINT ["<executable>", "<param1>", "<param2>", ...]
该指令形式既可以自己指定参数,也可以和CMD
配合使用,即将 和固定的参数写在 ENTRYPOINT 指令中,将可变参数写在 CMD 中:ENTRYPOINT ["/usr/bin/ls", "-a"] CMD ["-|"]
ENTRYPOINT <command> <param1> <param2> ...
独自使用和 CMD 类似,如果CMD也是完整的命令(即 CMD 命令中包含了对应的 或 ,则会被覆盖(只执行最后一个CMD 或 ENTRYPOINT))
-
USER
设置启动容器的用户(默认为 root 用户)。(设置指令)
USER <user>
-
EXPOSE
将容器中的端口映射为宿主机中的端口。(设置指令)
EXPOSE <container port>
-
ENV
以键值对的形式在镜像中设置环境变量,设置之后 RUN 指令可以使用该环境变量。在容器启动之后,可以使用docker inspect
查看环境变量,使用docker run --env <key>=<value>
设置或修改环境变量。(构建指令)
ENV <key> <value>
-
ADD
复制指定的源文件或目录到容器中的指令路径中,源文件或目录是相对被构建的源目录的相对路径,同时可以是一个远程的 url。 是容器中的绝对路径。(构建指令)- 如果 是一个目录,那么会将该目录下的所有文件添加到容器中,不包括目录。
- 如果 是一个可识别的压缩文件,docker 会进行解压缩。
- 如果 是一个文件且 中不以斜杠结尾,则会将 视为文件, 中的内容会写入到 中。
- 如果 是文件且 中使用斜杠结束,则会将 文件拷贝到 目录下。
ADD <src> <dest>
-
COPY
将宿主机的 复制到 中,目标路径不存在时会自动创建。(构建指令)
COPY <src> <dest>
ADD 命令更加强大,包括自动解压缩、复制远程 URL 文件等,但是更加推荐使用 COPY 命令,因为 ADD 命令在解压缩时可能会出现不自动解压缩的情况(因为压缩格式的原因等)。
-
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用也可以被其他容器使用。(设置指令)
VOLUME ["<mount point>"]
-
WORKDIR
相当于 cd 命令,可以多次切换目录,为RUN,CMD,ENTRYPOINT 配置工作目录。可以使用多个 WORKDIR 命令。(设置命令)
WORKDIR <path>
-
ONBUILD
为所创建的镜像作为其他新创建镜像的基础镜像时执行的操作命令,即在创建本镜像时不运行,当本镜像作为别的基础镜像时再在构建时运行(可认为基础镜像为父镜像,而该命令即在它的子镜像构建时运行,相当于在子镜像构建时多加了一些命令)。
ONBUILD <Dockerfile command>
例如,ONBUILD RUN mkdir /test
表示以当前 Dockerfile 文件构建镜像 image_a 时不执行创建文件夹 test 的操作,但是以 image_a 作为基础镜像再创建子镜像 image_b 时,便会执行创建文件夹的操作。
构建应用
构建应用命令:docker build -t <tag name>:<version>
构建好的镜像存放在本机的 Docker 镜像仓库中,可以通过 docker images
查看。
若没有指定版本号,默认设置为
latest
运行应用
运行应用命令:docker run -p <host port>:<container port> <image name>
Docker 容器在启动的时候,如果不指定端口映射参数,在容器外部无法通过网络访问容器内部的网络应用和服务。上述命令通过将对应的容器端口映射到宿主机指定的端口来运行容器。
标记镜像
标记镜像命令:docker tag <image name> <username>/<repository>:<tag>
重新标记镜像之后会产生一个和原来镜像相同镜像 ID 的一个镜像。若要删除原来重复的镜像,可以使用如下命令:
docker rmi <username>/<repository>:<tag>
如果没有 username,则为
/<repository>:<tag>
发布镜像
发布镜像命令:docker push <username>/<repository>:<tag>
发布镜像之后可以使用 docker run -p <host port>:<container port> <username>/<repository>:<tag>
来运行容器。若本地没有对应的镜像,则会从 Docker Hub 上去拉取。若没有指定 tag,则会默认拉取 latest 标签的镜像 (该镜像不一定是最新的)。