关于使用 Dockerfile 创建 Nginx 镜像的完整教程,并提到了 Dockerfile 的基本写法和一些关键指令,尤其是如何让服务在容器启动时正常运行的重点。以下是对整个内容的梳理和总结:
1. 为什么学习 Dockerfile
- Dockerfile 是构建镜像的重要工具,通过编写 Dockerfile,可以将公司内部项目打包成镜像,供 Kubernetes(K8S)等工具使用。
- 在 Kubernetes 部署 Pod 时,镜像是必要的,因此学习如何使用 Dockerfile 是第一步。
2. 创建 Nginx 镜像的步骤
准备工作
-
登录到 Docker 机器:
- 确保你的环境中已经装好了 Docker,并且可以正常使用。
-
创建所需的目录和文件:
- 创建一个专门用于存放 Dockerfile 的目录,例如:
mkdir /root/dkts/ubuntu3 -p cd /root/dkts/ubuntu3/
- 在该目录下创建
Dockerfile
文件和一个静态 HTML 文件(index.html
)。
- 创建一个专门用于存放 Dockerfile 的目录,例如:
3. 编写 Dockerfile
以下是 Nginx 镜像所需的 Dockerfile 示例:
# 1. 使用基础镜像
FROM ubuntu:22.04# 2. 添加镜像的维护者信息
LABEL maintainer="cntf@qq.com"# 3. 安装 Nginx 和所需软件
RUN apt-get install -y wget nginx# 4. 复制静态页面到 Nginx 默认目录
COPY index.html /usr/share/nginx/html/# 5. 暴露容器的 80 端口
EXPOSE 80# 6. 指定容器启动时执行的命令,让 Nginx 前台运行
CMD ["nginx", "-g", "daemon off;"]
4. 编写静态页面
在与 Dockerfile
同目录下,创建一个 index.html
文件,作为 Nginx 的首页内容:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Welcome</title>
</head>
<body><h1>Hello, there :VI ,this is ubuntu test3</h1><p>This is a test page created with Dockerfile.</p>
</body>
</html>
5. 构建镜像
使用以下命令构建镜像:
docker build -t xianchao-nginx:v1 .
- 命令解析:
docker build
:构建镜像。-t cntf-nginx:v1
:为镜像指定名称和版本号。.
:指定当前目录为上下文路径(含 Dockerfile 和index.html
)。
注意:
- 构建过程中,Docker 会读取
Dockerfile
并按照指令逐步创建镜像。 - 如果
COPY
等指令出错,确保文件路径正确,尤其是index.html
需要位于当前目录。
6. 查看生成的镜像
构建完成后,可以使用以下命令查看镜像:
docker images
- 输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE cntf-nginx v1 123456789abc 5 seconds ago 180MB
7. 启动容器
使用刚刚构建好的镜像启动容器:
docker run -d -p 8080:80 --name nginx-container cntf-nginx:v1
- 参数解析:
-d
:让容器在后台运行。-p 8080:80
:将宿主机的 8080 端口映射到容器的 80 端口。--name nginx-container
:为容器命名。xianchao-nginx:v1
:使用刚刚构建的镜像启动容器。
8. 验证服务是否正常运行
-
查看容器运行状态:
docker ps
确认容器是否处于
Up
状态。 -
通过浏览器访问:
- 打开浏览器,访问
http://<宿主机IP>:8080
。 - 你应该能看到之前写在
index.html
中的内容,例如:Hello, there :VI ,this is ubuntu test3
- 打开浏览器,访问
9. 重要的 Dockerfile 指令说明
FROM
- 指定要使用的基础镜像。
- 示例:
FROM ubuntu:22.04
LABEL
- 添加镜像的元信息(例如作者、版本等)。
- 示例:
LABEL maintainer="cntf@qq.com"
RUN
- 在镜像构建时运行命令。
- 示例:
RUN apt-get install -y wget nginx
COPY
- 将本地文件复制到镜像。
- 示例:
COPY index.html /usr/share/nginx/html/
EXPOSE
- 声明容器的端口。
- 示例:
EXPOSE 80
CMD
- 指定容器启动时执行的命令。
- 示例:
CMD ["nginx", "-g", "daemon off;"]
- 这里的
daemon off;
是关键,表示让 Nginx 以前台方式运行,否则容器会自动退出。
10. 常见问题和注意事项
-
容器启动后 Nginx 没有运行?
- 原因:
CMD
未正确配置,导致容器内服务没有前台运行。 - 解决:在 Dockerfile 中添加
CMD ["nginx", "-g", "daemon off;"]
。
- 原因:
-
文件路径问题:
COPY
或ADD
指令中的文件路径必须相对于Dockerfile
所在目录。- 解决:确保所有需要的文件与
Dockerfile
位于同一目录。
-
端口映射问题:
- 如果未正确映射端口,外部无法访问容器内服务。
- 解决:运行容器时使用
-p
参数映射端口,例如-p 8080:80
。
-
镜像体积过大?
- 使用较小的基础镜像,例如
alpine
。 - 示例:
FROM nginx:alpine
- 使用较小的基础镜像,例如