Skip to content

Dockerfile 和 docker-compose.yml 介绍

Dockerfile 和 docker-compose.yml 是 Docker 技术栈中两个非常重要的组件,它们各自扮演着不同的角色。让我们逐一深入了解。

Dockerfile

Dockerfile 是一个文本文件,它包含了一系列的命令和参数,这些命令被 Docker 用来自动构建镜像。简而言之,Dockerfile 定义了创建 Docker 镜像所需的环境、文件添加、命令执行等步骤。

基本结构和命令

  • FROM: 指定基础镜像。所有 Dockerfile 都必须从一个基础镜像开始,这个镜像可以是官方的,也可以是自己创建的。
  • RUN: 执行命令。在构建镜像的过程中,RUN命令用于执行任何被认为在镜像中需要的命令。
  • CMD: 提供容器默认执行的命令。不同于 RUNCMD 不会在构建镜像时执行,而是在容器启动时执行。
  • EXPOSE: 指示容器监听的端口。
  • ENV: 设置环境变量。
  • COPY 和 ADD: 将本地文件添加到镜像中。COPY 更受推荐,因为它更透明;ADD 除了复制本地文件,还能自动解压压缩文件和从 URL 下载文件。
  • WORKDIR: 设置工作目录。用于定义后续命令的执行环境路径。
  • VOLUME: 创建一个挂载点来持久化数据。

示例 部署 docker+nginx vitepress Dockerfile

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

nginx
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 所在的目录执行此命令。

    bash
    docker build -t vitepress-app .
  • 运行容器: 从刚才构建的镜像运行一个容器。

    bash
    docker run --name vitepress-nginx -d -p 3000:3000 vitepress-app

    这将创建并启动一个名为 vitepress-nginx 的容器,将容器的 3000 端口映射到主机的 3000 端口。

  • 停止容器:

    bash
    docker stop vitepress-nginx

    这将停止名为 vitepress-nginx 的容器。

  • 删除容器:

    bash
    docker rm vitepress-nginx

    停止容器后,使用此命令删除容器。

  • 查看容器日志:

    bash
    docker 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 文档网站,包括构建配置和网络定义。

yaml
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 的操作

  • 创建一个外部网络
bash
docker network create share_docs_nginx

这条命令会创建一个名为 share_docs_nginx 的网络。 创建之后,Docker Compose 就可以将服务连接到这个已经存在的网络了。

  • 构建镜像
bash
docker compose build

通过在 Dockerfile 所在目录执行 docker compose build 命令来构建服务的镜像,这会根据 docker-compose.yml 文件中的 build 配置进行。

  • 启动服务
bash
docker compose up

docker compose up 命令用于根据 docker-compose.yml 文件启动定义的所有服务。可以加 -d 参数以后台模式运行。

  • 停止服务
bash
docker compose down

docker compose down 命令停止并移除由 docker compose up 命令启动的容器,网络,卷和镜像。

通过结合使用 Dockerfile 和 docker-compose.yml,开发人员可以有效地管理整个应用程序的生命周期,从构建、运行到停止服务,确保应用的快速部署和高效运维。