Docker

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 会自动解压文件到目标路径。
  • 支持 URLADD 可以从远程 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

解释:

  1. **-d**:以后台模式运行容器。
  2. **-p 0:80**:将容器的 80 端口映射到宿主机的一个随机端口。0:80 语法会自动分配一个随机端口来映射容器的 80 端口。
  3. **--name nginx-container**:为容器指定一个名称(nginx-container)。
  4. **-v /path/to/your/local/directory:/usr/share/nginx/html**:将本地目录 /path/to/your/local/directory 挂载到容器内的 /usr/share/nginx/html 目录。这样,Nginx 会使用本地文件作为其网页内容。
  5. **nginx**:使用官方的 Nginx 镜像启动容器。

检查容器的端口映射

你可以使用以下命令来查看容器的随机端口:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值