【云原生技术】docker基础-镜像构建与发布

Dockerfile文件解析

Dockerfile 是一个文本文件,其中包含了一系列的指令和参数,用于构建 Docker 镜像。这些指令定义了如何从基础镜像开始,逐步添加或修改文件系统中的内容,最终生成一个新的镜像。Dockerfile 文件遵循一定的语法和规则,使得 Docker 引擎能够按照顺序执行其中的指令来创建镜像。

Dockerfile 文件的基本结构

Dockerfile 文件通常包含以下几类指令:

  1. 基础镜像: 指定从哪个基础镜像开始构建。
  2. 维护者信息: 记录 Dockerfile 的作者信息。
  3. 工作目录: 设置容器内的工作目录。
  4. 复制文件: 将本地文件复制到容器中。
  5. 执行命令: 在容器中执行命令。
  6. 环境变量: 设置容器内的环境变量。
  7. 端口暴露: 指定容器运行时需要暴露的端口。
  8. 入口点: 指定容器启动时运行的默认命令。

Dockerfile 指令详解

FROM
  • 用途: 指定基础镜像,所有后续的指令都将在此基础镜像之上进行。
  • 示例: FROM ubuntu:latest
MAINTAINER
  • 用途: 已经被 LABEL 替代,用于标记 Dockerfile 的作者信息。
  • 示例: MAINTAINER your.name@example.comLABEL maintainer="your.name@example.com"
LABEL
  • 用途: 为镜像添加元数据标签。
  • 示例: LABEL version="1.0" description="My custom image"
RUN
  • 用途: 在镜像中执行命令。可以使用 shell 形式(默认)或 exec 形式。
  • 示例:
    RUN apt-get update && apt-get install -y nginx
    RUN ["echo", "Hello World"]
    
CMD
  • 用途: 指定容器启动时默认执行的命令。可以在启动容器时通过 docker run 命令行参数覆盖。
  • 示例: CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT
  • 用途: 指定容器启动时执行的不可变命令。可以与 CMD 结合使用,CMD 提供默认值,ENTRYPOINT 提供命令本身。
  • 示例: ENTRYPOINT ["python", "app.py"]
ENV
  • 用途: 设置环境变量,可以在后续的 Dockerfile 指令中使用。
  • 示例: ENV MY_VAR=myvalue
EXPOSE
  • 用途: 指定容器运行时需要暴露的端口号。
  • 示例: EXPOSE 80 443
ADD
  • 用途: 从构建上下文目录中添加文件、目录或远程 URL 到镜像中。如果添加的是压缩文件,ADD 指令会自动解压。
  • 示例: ADD requirements.txt /app/requirements.txt
COPY
  • 用途: 从构建上下文目录中复制文件或目录到镜像中。不会自动解压压缩文件。
  • 示例: COPY src /app/src
VOLUME
  • 用途: 指定容器中的某个目录作为挂载点,用于数据持久化。
  • 示例: VOLUME /var/lib/mysql
ARG
  • 用途: 定义构建时的参数,可以在构建镜像时通过 --build-arg 选项传递值。
  • 示例: ARG version=1.0
ONBUILD
  • 用途: 设置触发器指令,当此镜像被用作另一个镜像的基础镜像时,ONBUILD 指令会被触发。
  • 示例: ONBUILD ADD . /app/src
HEALTHCHECK
  • 用途: 定义一个健康检查命令,Docker 会定期执行该命令来确定容器是否健康。
  • 示例:
    HEALTHCHECK --interval=5s --timeout=3s \
    CMD curl --fail http://localhost/ || exit 1
    

示例 Dockerfile

下面是一个简单的 Dockerfile 示例,用于构建一个基于 Python 的 Web 应用:

# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 设置工作目录
WORKDIR /code
# 添加要求文件并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 添加源代码
COPY . .
# 暴露端口
EXPOSE 8080

# 设置启动命令
CMD ["python", "app.py"]

构建镜像

构建镜像时,你需要使用 docker build 命令,并指定 Dockerfile 所在的目录:

docker build -t my_image:tag .

这里的 -t 用于指定镜像的标签,. 表示 Dockerfile 所在的目录。

发布镜像

  • 登录到docker仓库
docker login
  • 推送镜像到仓库
docker push yourusername/your-repo-name:tag
  • 检查镜像状态

注意事项

  • 安全性: 确保你的 Dockerfile 中没有硬编码敏感信息(如密码)。考虑使用环境变量或者秘钥管理服务来处理敏感数据。
  • 镜像大小: 优化你的镜像大小,避免不必要的依赖,这对于提高下载速度和节省存储空间非常重要。
  • 标签: 使用合适的标签可以帮助其他人了解镜像的版本信息。
  • 自动化: 如果你的应用频繁更新,可以设置 CI/CD 流水线来自动构建和推送镜像。

ENTRYPOINT和CMD两者之间的区别

在Dockerfile中,ENTRYPOINTCMD都是用于指定容器启动时执行的命令,但它们的作用和行为有所不同。

CMD指令

CMD指令用于指定容器的默认执行命令。当使用docker run命令启动容器时,如果不指定任何命令,Docker将执行CMD指令中指定的命令。如果有额外的命令传递给docker run,这些命令将覆盖CMD指令中的内容。

CMD可以以以下几种形式出现:

  • 作为交互式shell的形式:CMD ["/bin/bash"]
  • 提供可执行文件的路径:CMD ["executable", "param1", "param2"]
  • 调用shell命令:CMD echo "Hello World"

ENTRYPOINT指令

ENTRYPOINT指令用于配置容器的入口点,即容器启动时执行的第一条命令。与CMD不同,ENTRYPOINT指令通常用于设置一个可执行文件或脚本作为容器的入口点,并且它不会在docker run时被覆盖,除非使用--entrypoint标志。

ENTRYPOINT也可以以多种形式出现:

  • 使用shell形式:ENTRYPOINT command param1 param2
  • 使用exec形式(推荐):ENTRYPOINT ["executable", "param1", "param2"]

两者的区别

  1. 持久性

    • ENTRYPOINT设置的入口点在容器启动时总是被执行,除非使用--entrypoint标志来覆盖它。
    • CMD设置的默认命令可以在docker run时被覆盖。
  2. 参数传递

    • ENTRYPOINT的参数可以在docker run时传递额外的参数来扩展。
    • CMD的命令和参数可以在docker run时完全被替换。
  3. 执行方式

    • ENTRYPOINT在exec形式下执行,意味着它将在一个非shell环境中运行,这有助于环境变量的传递和信号的正确处理。
    • CMD可以在shell中执行,这可能会导致环境变量和信号处理不如exec形式准确。

组合使用

通常,ENTRYPOINTCMD可以组合使用,以提供灵活的容器启动行为。例如:

ENTRYPOINT ["/usr/bin/myapp"]
CMD ["--default"]

在这个例子中,ENTRYPOINT设置了容器的入口点为/usr/bin/myapp,而CMD提供了默认参数--default。在docker run时,可以传递额外的参数给myapp,例如:

docker run myimage --custom

这将启动容器并执行/usr/bin/myapp --custom。如果docker run时没有指定额外的参数,容器将使用CMD中指定的--default参数。

云原生技术中,Docker是一个流行的容器化平台,它使得应用可以在任何环境中快速、可靠地运行。要在阿里云服务器的Linux环境下安装Docker,可以按照以下步骤操作: 1. **安装前检查**: - 确保你的服务器是Linux,比如Ubuntu或CentOS。 - 检查服务器是否已开启防火墙,如有需要,允许TCP端口2375(Docker守护进程)、80和443(用于访问Docker API)。 2. **更新系统**: ``` sudo apt-get update sudo apt-get upgrade ``` 3. **安装依赖**: 对于Ubuntu,使用apt安装依赖包: ``` sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release ``` 4. **添加Docker GPG key**: ``` curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg ``` 5. **设置Docker仓库**: ``` echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ``` 6. **更新apt源**: ``` sudo apt-get update ``` 7. **安装Docker**: ``` sudo apt-get install docker-ce docker-ce-cli containerd.io ``` 8. **启动和启用Docker服务**: ``` sudo systemctl start docker sudo systemctl enable docker ``` 9. **验证安装**: 可以通过运行`docker run hello-world`来测试Docker是否安装成功,并查看镜像容器信息。 至于安装MySQL,可以在Docker构建一个MySQL容器: ``` sudo docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=mysecretpassword -p 3306:3306 -v /path/to/data/mysql:/var/lib/mysql -d mysql:latest ``` 这将创建一个名为`mysql-container`的容器,连接到本地主机的3306端口,并将数据存储在指定路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值