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. 文件路径问题
COPY
和ADD
指令中的源文件路径是相对于构建上下文(build context)的。- 确保文件在
docker build
命令运行时处于同一目录下。
4. 镜像层优化
- 每条
RUN
指令都会生成一个新的镜像层。 - 可以通过合并命令减少层数,例如:
RUN yum install -y wget \ && yum install -y nginx
总结
通过 Dockerfile 构建镜像的过程主要包括以下步骤:
-
选择基础镜像:
- 使用
FROM
指令指定构建镜像的基础。
- 使用
-
安装软件和依赖:
- 使用
RUN
指令安装所需的软件和执行必要的命令。
- 使用
-
复制文件到镜像:
- 使用
COPY
指令将本地文件复制到镜像的指定位置。
- 使用
-
配置运行环境:
- 使用
EXPOSE
和CMD
指令定义容器的端口和启动行为。
- 使用
-
构建镜像并运行测试:
- 使用
docker build
和docker run
命令完成构建和运行。
- 使用
通过这些基础知识,您可以轻松构建自己的定制化镜像,用于不同的应用场景。
迷茫的人生,需要不断努力,才能看清远方模糊的志向!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?