Dockerfile 基础语法和构建镜像流程

什么是 Dockerfile?

  • Dockerfile 是一个用来构建 Docker 镜像的文本文件。
  • 文件内容包含了构建镜像所需的一系列指令和说明。
  • 通过 docker build 命令读取 Dockerfile 内容并生成镜像。

基本 Dockerfile 指令

1. FROM

  • 指定基础镜像。
  • 格式:
    FROM <镜像名称>:<标签>
  • 示例:
    FROM centos
  • 作用:
    • 设置构建镜像所需的基础镜像。

2. LABEL maintainer

  • 指定镜像的作者信息。
  • 格式:
    LABEL maintainer <作者姓名或邮箱>
  • 示例:
    LABEL maintainer John Doe <john.doe@example.com>
  • 作用:
    • 标注镜像的作者或维护者。

3. RUN

  • 执行命令,用于安装软件或执行脚本。
  • 格式:
    RUN <命令>
  • 示例:
    RUN yum install -y wget
    RUN yum install -y nginx
  • 作用:
    • 执行命令并将结果写入镜像。
  • 注意事项:
    • 每个 RUN 指令会生成一层新的镜像层。

4. COPY

  • 将文件从主机复制到镜像中。
  • 格式:
    COPY <源路径> <镜像路径>
  • 示例:
    COPY index.html /usr/share/nginx/html/
  • 作用:
    • 用于在主机和镜像之间传递文件。

5. EXPOSE

  • 声明容器暴露的端口。
  • 格式:
    EXPOSE <端口号>
  • 示例:
    EXPOSE 80
  • 作用:
    • 告知 Docker 运行时该容器监听的端口。

6. CMD

  • 容器启动时执行的命令。
  • 格式:
    CMD ["可执行文件", "参数1", "参数2"]
  • 示例:
    CMD ["nginx", "-g", "daemon off;"]
  • 作用:
    • 定义容器启动时执行的默认命令。
  • 每个 Dockerfile 只能有一个 CMD 指令。

构建一个简单的 Dockerfile 示例

1. 准备工作

  • 创建目录用于存放 Dockerfile 和相关文件:
    mkdir nginx
    cd nginx
  • 创建 index.html 文件:
    vim index.html
    内容:
    <h1>Welcome to My Nginx</h1>

2. 编写 Dockerfile

  • 示例内容
    # 使用 centos 作为基础镜像
    FROM centos
    # 设置维护者信息
    LABEL maintainer="Doe <doe@vi.com>"
    # 删除默认的 YUM 源并添加新的源
    RUN rm -rf /etc/yum.repos.d/*
    COPY CentOS-Base.repo /etc/yum.repos.d/
    # 更新 YUM 缓存并安装必要的软件
    RUN yum clean all && yum makecache
    RUN yum install -y wget nginx
    # 拷贝 index.html 到 Nginx 默认目录
    COPY index.html /usr/share/nginx/html/
    # 声明暴露的端口
    EXPOSE 80
    # 启动 Nginx,保持容器运行
    CMD ["nginx", "-g", "daemon off;"]

3. 准备 YUM 源文件

  • 下载并保存 CentOS-Base.repo 到当前目录:
    curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

构建镜像

1. 构建镜像

  • 使用 docker build 命令构建镜像:
    docker build -t nginx:v1 .
  • 参数说明
    • -t nginx:v1:为新镜像指定名称和版本(如 nginx:v1)。
    • .:表示当前目录下的 Dockerfile 和相关文件。
  • 上述执行会有问题,因为Centos已经EOL了
    • 另外由于国内网络问题,通过测试验证, 使用systemd方式的代理手动拉取镜像没有问题,但是通过docker build是走代理的,所以经过测试,发现可用直接在宿主机上执行代理,然后直接使用docker build进行构建,经过测试时可用成功拉取镜像。

      export http_proxy="http://10.10.9.232:30809"
      export HTTP_PROXY="http://10.10.9.232:30809"
      export https_proxy="http://10.10.9.232:30809"
      export HTTPS_PROXY="http://10.10.9.232:30809"
      export NO_PROXY="localhost,127.0.0.1,10.10.16.0/24,10.244.0.0/16,10.96.0.1"
      直接在命令行上执行上面命令,其中NO_PROXY是可选,看情况执行。

2. 查看镜像

  • 使用命令查看构建的镜像:
    docker images
  • 示例输出:
    REPOSITORY TAG IMAGE ID CREATED SIZE
    nginx v1 abc123def456 10 minutes ago 200MB

运行测试镜像

1. 启动容器

  • 使用新镜像启动容器:
    docker run --name test-nginx -d -p 8080:80 nginx:v1
  • 参数说明
    • --name test-nginx:为容器指定名称。
    • -d:以后台模式运行。
    • -p 8080:80:将主机的 8080 端口映射到容器的 80 端口。
    • nginx:v1:使用刚刚构建的镜像。

2. 验证服务

  • 在浏览器中访问 http://<主机IP>:8080
  • 页面显示:
    Welcome to My Nginx

重要注意事项

1. 关于 YUM 源问题

  • 当前 CentOS 的一些基础镜像可能已经停用默认的 YUM 源。
  • 在 Dockerfile 中使用如下命令更换为阿里云的 YUM 源:
    RUN rm -rf /etc/yum.repos.d/*
    COPY CentOS-Base.repo /etc/yum.repos.d/
    RUN yum clean all && yum makecache

2. CMD 与 ENTRYPOINT 的区别

  • CMD:指定容器启动时的默认命令,但可以被 docker run 的命令参数覆盖。
  • ENTRYPOINT:指定容器启动时的强制命令,不能被覆盖。

3. 文件路径问题

  • COPYADD 指令中的源文件路径是相对于构建上下文(build context)的。
  • 确保文件在 docker build 命令运行时处于同一目录下。

4. 镜像层优化

  • 每条 RUN 指令都会生成一个新的镜像层。
  • 可以通过合并命令减少层数,例如:
    RUN yum install -y wget \
    && yum install -y nginx

总结

通过 Dockerfile 构建镜像的过程主要包括以下步骤:

  1. 选择基础镜像

    • 使用 FROM 指令指定构建镜像的基础。
  2. 安装软件和依赖

    • 使用 RUN 指令安装所需的软件和执行必要的命令。
  3. 复制文件到镜像

    • 使用 COPY 指令将本地文件复制到镜像的指定位置。
  4. 配置运行环境

    • 使用 EXPOSECMD 指令定义容器的端口和启动行为。
  5. 构建镜像并运行测试

    • 使用 docker builddocker run 命令完成构建和运行。

通过这些基础知识,您可以轻松构建自己的定制化镜像,用于不同的应用场景。

posted @   皇帽讲绿帽带法技巧  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示