Docker是什么
Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行
Dockerfile
在 Dockerfile
中,常见的指令(命令)有很多,每个指令都有特定的作用,帮助我们定义 Docker 镜像的构建过程。以下是一些最常见和最重要的 Dockerfile
指令:
1. FROM
FROM
指令指定基础镜像,它是 Dockerfile 中必须的第一行。每个 Dockerfile
都必须以 FROM
开头,指定镜像的基础。
FROM <image_name>:<tag>
<image_name>
:指定基础镜像的名称。<tag>
:指定镜像的标签(默认是latest
)。
示例:
FROM ubuntu:20.04
2. LABEL
LABEL
用于为镜像添加元数据(例如镜像的作者、版本等)。这种信息通常用于镜像的标识和管理。
LABEL key="value"
示例:
LABEL maintainer="example@example.com" LABEL version="1.0"
3. RUN
RUN
指令在构建镜像过程中执行命令。它用于安装软件包、执行 shell 脚本或进行其他设置,命令执行完成后会将结果保存到镜像中。
RUN <command>
示例:
RUN apt-get update && apt-get install -y python3
4. COPY
COPY
将文件或目录从构建上下文复制到镜像中的指定路径。
COPY <src> <dest>
<src>
:要复制的文件或目录路径(相对于 Dockerfile 的上下文路径)。<dest>
:复制到镜像中的路径。
示例:
COPY ./app /usr/src/app
5. ADD
ADD
类似于 COPY
,但是 ADD
更强大,它支持自动解压 .tar
文件和从 URL 下载文件。
ADD <src> <dest>
示例:
ADD ./app.tar.gz /usr/src/app
6. CMD
CMD
指定一个默认的命令或参数,该命令会在容器启动时运行。如果容器启动时未指定其他命令,CMD
定义的命令将被执行。
CMD ["executable", "param1", "param2"]
- 如果使用 shell 形式:
CMD echo "Hello, World!"
- 如果使用 JSON 数组形式:
CMD ["echo", "Hello, World!"]
示例:
CMD ["python3", "app.py"]
7. ENTRYPOINT
ENTRYPOINT
用于设置容器的启动命令。与 CMD
不同,ENTRYPOINT
不能被 docker run
命令替代。如果 ENTRYPOINT
和 CMD
都指定了,则 CMD
提供默认参数给 ENTRYPOINT
。
ENTRYPOINT ["executable", "param1", "param2"]
示例:
ENTRYPOINT ["python3", "app.py"]
8. EXPOSE
EXPOSE
指定容器应暴露的端口。它仅仅是一个说明,Docker 不会自动将端口映射到主机上。实际的端口映射需要使用 docker run
或 docker-compose
配置。
EXPOSE <port>
示例:
EXPOSE 8080
9. ENV
ENV
设置环境变量,可以在容器运行时使用。
ENV <key>=<value>
示例:
ENV APP_HOME=/usr/src/app
10. VOLUME
VOLUME
指定一个或多个匿名卷,这些卷会在容器启动时创建。卷可以用于持久化存储数据。
VOLUME ["/data"]
示例:
VOLUME ["/data", "/config"]
11. WORKDIR
WORKDIR
设置工作目录。如果指定的目录不存在,WORKDIR
会自动创建。
WORKDIR <path>
示例:
WORKDIR /usr/src/app
12. USER
USER
指定在容器中运行命令时的用户。它是一个非常重要的安全措施,防止容器以 root 用户身份运行应用程序。
USER <username>
示例:
USER nobody
13. ARG
ARG
定义了在构建时可用的构建参数。与环境变量不同,ARG
只在构建阶段有效,构建完成后不可用。
ARG <name>[=<default_value>]
示例:
ARG VERSION=1.0
14. SHELL
SHELL
指定在 RUN
指令中使用的 shell 类型和参数。
SHELL ["executable", "parameters"]
示例:
SHELL ["powershell", "-Command"]
例子
FROM artifacth.sail-cloud.com/saicmotorcv/java:8
MAINTAINER wanghuapeng <wanghuapeng@saicmotor.com>
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY /yl-lease-service/target/yl-lease-service-0.0.1.jar /app/app.jar
COPY /yl-lease-service/start.sh /app
COPY /yl-lease-service/skywalking-agent /app/agent
COPY /yl-lease-service/json /app/json
COPY /yl-lease-service/sitHttps /app/sitHttps
COPY /yl-lease-service/prdHttps /app/prdHttps
EXPOSE 8080
ENTRYPOINT ["/bin/bash","/app/start.sh"]
Dockerfile 中,COPY
和 ADD
在 Dockerfile 中,COPY
和 ADD
都用于将文件和目录从主机复制到 Docker 镜像中的指定位置,但它们之间有一些细微的区别。
1. COPY
命令
COPY
命令是最基本的文件复制命令,用于将本地文件或目录复制到 Docker 镜像中的指定路径。
语法:
COPY <src> <dest>
<src>
:指定源文件或目录(相对于 Dockerfile 所在路径)。<dest>
:指定目标路径(在容器内的路径)。
主要特点:
- 简单:只会复制本地文件到镜像中,不会对文件进行解压或处理。
- 没有额外的功能:
COPY
不支持从远程 URL 下载文件,也不支持自动解压文件。
示例:
COPY ./local-file.txt /app/local-file.txt
将本地的 local-file.txt
文件复制到镜像中的 /app/
目录下。
2. ADD
命令
ADD
命令比 COPY
更为复杂,功能更强大。它不仅可以像 COPY
一样复制本地文件和目录,还具有额外的功能。
语法:
ADD <src> <dest>
<src>
:指定源文件或目录,可以是本地文件/目录,也可以是一个 URL。<dest>
:指定目标路径(在容器内的路径)。
主要特点:
- 解压:如果源文件是一个压缩包(如
.tar
、.tar.gz
、.zip
等格式),ADD
会自动解压文件到目标路径。 - 支持 URL:
ADD
可以从远程 URL 下载文件并将其添加到镜像中。
示例:
ADD ./local-file.tar.gz /app/
如果 local-file.tar.gz
是一个压缩文件,ADD
会自动解压文件到 /app/
目录。
ADD https://example.com/file.tar.gz /app/
ADD
可以直接从远程 URL 下载文件并将其添加到镜像中。
3. 区别总结
特性 | COPY |
ADD |
---|---|---|
功能 | 仅将文件或目录复制到镜像中 | 除了复制文件外,还支持解压文件,支持 URL 下载 |
支持解压 | 不支持 | 支持自动解压 .tar 格式文件 |
支持 URL | 不支持 | 支持通过 URL 下载文件 |
4. 使用建议
- **优先使用
COPY
**:对于简单的文件复制操作,推荐使用COPY
,因为它更为明确和简单,也能提升构建速度。 - 使用
ADD
仅在需要时:只有在你需要从 URL 下载文件或自动解压压缩文件时,才考虑使用ADD
。对于其他情况,尽量避免使用ADD
,以减少不必要的复杂性。
示例对比:
使用 COPY
复制文件:
COPY ./file.txt /app/
使用 ADD
解压文件:
ADD ./file.tar.gz /app/
ADD
会解压 file.tar.gz
到 /app/
目录中。
启动一个 Nginx 容器,使用随机端口映射,并且挂载本地文件目录到容器的 HTML 目
要启动一个 Nginx 容器,使用随机端口映射,并且挂载本地文件目录到容器的 HTML 目录,您可以使用以下命令:
docker run -d -p 0:80 --name nginx-container -v /path/to/your/local/directory:/usr/share/nginx/html nginx
解释:
- **
-d
**:以后台模式运行容器。 - **
-p 0:80
**:将容器的 80 端口映射到宿主机的一个随机端口。0:80
语法会自动分配一个随机端口来映射容器的 80 端口。 - **
--name nginx-container
**:为容器指定一个名称(nginx-container
)。 - **
-v /path/to/your/local/directory:/usr/share/nginx/html
**:将本地目录/path/to/your/local/directory
挂载到容器内的/usr/share/nginx/html
目录。这样,Nginx 会使用本地文件作为其网页内容。 - **
nginx
**:使用官方的 Nginx 镜像启动容器。
检查容器的端口映射
你可以使用以下命令来查看容器的随机端口:<