Docker详细使用教程(二)Dockerfile指令

Docker开发过程

开发过程其实和传统开发一样,也就是说,开发Docker 应用的方式与开发非Docker应用的方式类似。二者的主要区别在于,开发 Docker 应用程序时,是在本地环境中的Docker容器中部署和测试,该容器可以是Linux容器或Windows 容器。

一般情况下,我们搭建好框架代码之后,就需要针对需求进行开发,以满足业务为目的,也就是这个开发过程并没有什么改变,这里我们假设所有代码均已就绪,开始下一步。

创建Dockerfile

虽然我们可以通过docker commit命令来手动创建镜像,但是通过Dockerfile文件,可以帮助我们自动创建镜像,并且能够自定义创建过程。本质上,Dockerfile就是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它简化了从头到尾的构建流程并极大的简化了部署工作。使用dockerfile构建镜像有以下好处:

1.像编程一样构建镜像,支持分层构建以及缓存;

2.可以快速而精确地重新创建镜像以便于维护和升级;

3.便于持续集成;

4.可以在任何地方快速构建镜像

Dockerfile指令

Dockerfile 指令为 Docker 引擎提供了创建容器映像所需的步骤。这些指令按顺序逐一执行。以下是有关一些基本 Dockerfile 指令的详细信息。

1.FROM
FROM 指令用于设置在新映像创建过程期间将使用的容器映像。

示例:

FROM nginx

FROM microsoft/dotnet:2.1-aspnetcore-runtime

2.RUN
RUN 指令指定将要运行并捕获到新容器映像中的命令。 这些命令包括安装软件、创建文件和目录,以及创建环境配置等。

示例:

RUN apt-get update

RUN mkdir -p /usr/src/redis

RUN apt-get update && apt-get install -y libgdiplus

RUN [“apt-get”,“install”,"-y",“nginx”]

注意:每一个指令都会创建一层,并构成新的镜像。当运行多个指令时,会产生一些非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。因此,在很多情况下,我们可以合并指令并运行,例如:RUN apt-get update && apt-get install -y libgdiplus。在命令过多时,一定要注意格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。使用换行符时,可能会遇到一些问题,具体可以参阅下节的转义字符。

3.COPY
COPY 指令将文件和目录复制到容器的文件系统。文件和目录需位于相对于 Dockerfile 的路径中。

如果源或目标包含空格,请将路径括在方括号和双引号中。

示例:

COPY . .

COPY nginx.conf /etc/nginx/nginx.conf

COPY . /usr/share/nginx/html

COPY hom* /mydir/

4.ADD
ADD 指令与 COPY 指令非常类似,但它包含更多功能。除了将文件从主机复制到容器映像,ADD 指令还可以使用 URL 规范从远程位置复制文件。

示例:

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

此示例会将 Python for Windows下载到容器映像的 c:\temp 目录。

5.WORKDIR
WORKDIR 指令用于为其他 Dockerfile 指令(如 RUN、CMD)设置一个工作目录,并且还设置用于运行容器映像实例的工作目录。

示例:

WORKDIR /app

6.CMD
CMD指令用于设置部署容器映像的实例时要运行的默认命令。例如,如果该容器将承载 NGINX Web 服务器,则 CMD 可能包括用于启动Web服务器的指令,如 nginx.exe。 如果 Dockerfile 中指定了多个CMD 指令,只会计算最后一个指令。
示例:

CMD [“c:\Apache24\bin\httpd.exe”, “-w”]

CMD c:\Apache24\bin\httpd.exe -w

7.ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。

示例:

ENTRYPOINT [“dotnet”, “Magicodes.Admin.Web.Host.dll”]

8.ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

示例:

ENV VERSION=1.0 DEBUG=on \

NAME=“Magicodes”

9.EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

示例:

EXPOSE 80

发布了41 篇原创文章 · 获赞 8 · 访问量 1951

猜你喜欢

转载自blog.csdn.net/big_white_py/article/details/103451099