Dockerfile 和 docker-compose.yml 介绍
Dockerfile 和 docker-compose.yml 是 Docker 技术栈中两个非常重要的组件,它们各自扮演着不同的角色。让我们逐一深入了解。
Dockerfile
Dockerfile 是一个文本文件,它包含了一系列的命令和参数,这些命令被 Docker 用来自动构建镜像。简而言之,Dockerfile 定义了创建 Docker 镜像所需的环境、文件添加、命令执行等步骤。
基本结构和命令
- FROM: 指定基础镜像。所有 Dockerfile 都必须从一个基础镜像开始,这个镜像可以是官方的,也可以是自己创建的。
- RUN: 执行命令。在构建镜像的过程中,
RUN
命令用于执行任何被认为在镜像中需要的命令。 - CMD: 提供容器默认执行的命令。不同于
RUN
,CMD
不会在构建镜像时执行,而是在容器启动时执行。 - EXPOSE: 指示容器监听的端口。
- ENV: 设置环境变量。
- COPY 和 ADD: 将本地文件添加到镜像中。
COPY
更受推荐,因为它更透明;ADD
除了复制本地文件,还能自动解压压缩文件和从 URL 下载文件。 - WORKDIR: 设置工作目录。用于定义后续命令的执行环境路径。
- VOLUME: 创建一个挂载点来持久化数据。
示例 部署 docker+nginx vitepress Dockerfile
# 阶段一:构建Vitepress应用
# 使用官方Node.js 18镜像作为构建环境
FROM node:18 as builder
# 设置工作目录为/app
WORKDIR /app
# 复制项目的package.json和package-lock.json到工作目录
COPY package.json package-lock.json /app/
# 安装项目依赖,使用中国镜像加速
RUN npm install --registry=https://registry.npmmirror.com
# 复制项目所有文件到工作目录
COPY . /app
# 构建Vitepress项目
RUN npm run build
# 阶段二:构建Nginx映像并复制Vitepress构建结果
# 使用官方nginx:1.21.6镜像作为构建环境
FROM nginx:1.21.6
# 使用michaelknightdriver提供的带有brotli支持的nginx镜像作为基础镜像
# FROM michaelknightdriver/docker-nginx-brotli
# 删除nginx默认配置
RUN rm /etc/nginx/conf.d/default.conf
# 复制自定义nginx配置到容器中
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 从构建器阶段复制构建的Vitepress应用到nginx的服务目录
COPY --from=builder /app/dist /usr/share/nginx/html
# 暴露3000端口
EXPOSE 3000
nginx.conf
server {
listen 3000; # 监听3000端口,用于接收外部HTTP请求
server_name localhost; # 设置服务器名称,本地部署时使用localhost
location / {
add_header Cache-Control no-cache; # 设置HTTP头部,禁用缓存策略
root /usr/share/nginx/html; # 设置网站根目录位置
try_files $uri $uri/ /index.html; # 尝试访问的文件不存在时,重定向到/index.html,支持SPA应用
}
}
Docker 命令
构建镜像: 根据 Dockerfile 构建镜像。需要在 Dockerfile 所在的目录执行此命令。
bashdocker build -t vitepress-app .
运行容器: 从刚才构建的镜像运行一个容器。
bashdocker run --name vitepress-nginx -d -p 3000:3000 vitepress-app
这将创建并启动一个名为
vitepress-nginx
的容器,将容器的 3000 端口映射到主机的 3000 端口。停止容器:
bashdocker stop vitepress-nginx
这将停止名为
vitepress-nginx
的容器。删除容器:
bashdocker rm vitepress-nginx
停止容器后,使用此命令删除容器。
查看容器日志:
bashdocker logs vitepress-nginx
查看名为
vitepress-nginx
的容器的日志,对于调试和监控运行状态很有帮助。
记得在执行上述命令时,可能需要管理员权限,例如在 Linux 或 Mac 系统中,可能需要在命令前加上 sudo
。
docker-compose.yml
docker-compose.yml
文件是 Docker Compose 工具使用的 YAML 文件,用于定义和管理多容器 Docker 应用程序。
通过此文件,开发人员可以简化容器构建、配置和管理过程,实现“一键”启动、停止和重建服务。
基本组成
- version: 指定
docker-compose
文件格式的版本。不同版本支持不同的功能。 - services: 此部分定义了应用中的所有服务(容器)。每个服务可以使用不同的镜像并包含特定的配置如网络和存储卷。
- volumes: 定义持久化数据的方法。可以被服务用来存储数据,以保证容器销毁后数据仍然存在。
- networks: 配置容器之间的网络连接。可以定义一个或多个内部网络,以便容器间通信。
示例解析
以下是一个 docker-compose.yml
的示例,用于部署一个简单的 Vite 文档网站,包括构建配置和网络定义。
version: "3"
services:
vite_docs:
build:
context: . # 指定 Dockerfile 所在的上下文路径
dockerfile: Dockerfile # 指定 Dockerfile 文件名
container_name: vite_docs # 容器名称
networks:
- net_vite_docs # 连接到内部网络
- share_docs_nginx # 连接到预先存在的外部网络
networks:
net_vite_docs: # 定义内部网络
share_docs_nginx:
external: true # 指明这是一个已经存在的外部网络
使用 Docker Compose 的操作
- 创建一个外部网络
docker network create share_docs_nginx
这条命令会创建一个名为 share_docs_nginx 的网络。 创建之后,Docker Compose 就可以将服务连接到这个已经存在的网络了。
- 构建镜像
docker compose build
通过在 Dockerfile 所在目录执行 docker compose build
命令来构建服务的镜像,这会根据 docker-compose.yml 文件中的 build
配置进行。
- 启动服务
docker compose up
docker compose up
命令用于根据 docker-compose.yml 文件启动定义的所有服务。可以加 -d
参数以后台模式运行。
- 停止服务
docker compose down
docker compose down
命令停止并移除由 docker compose up
命令启动的容器,网络,卷和镜像。
通过结合使用 Dockerfile 和 docker-compose.yml,开发人员可以有效地管理整个应用程序的生命周期,从构建、运行到停止服务,确保应用的快速部署和高效运维。