Docker 容器的实践

目标

  1. 理解 Docker 的基本概念和优势禁止
  2. 掌握 Docker 的安装、镜像管理、容器管理等基础操作。
  3. 学会编写 Dockerfile 和构建自定义镜像。
  4. 掌握 Docker Compose 的使用方法。
  5. 能够在 Docker 上部署 Gitee 上的开源项目。

任务实践

Docker 基础理论与安装

1.1 理解 Docker 的基本概念和优势

  • Docker 基本架构
    • Docker Engine:核心组件,负责容器运行时和管理。
    • 镜像(Image):只读模板,包含应用程序及其依赖。
    • 容器(Container):镜像的运行实例,隔离运行环境。
    • Registry:镜像仓库(如 Docker Hub),用于存储和分发镜像。
  • Docker 优势
    • 轻量级:容器共享主机内核,资源占用低。
    • 可移植性:镜像可在不同环境一致运行。
    • 快速部署:秒级启动,简化开发和测试流程。
    • 隔离性:容器间互不干扰,增强安全性。

1.2 Docker 与传统虚拟机的对比

特性 Docker 容器 传统虚拟机
架构 共享主机内核,运行在进程级别 完整虚拟化,包含独立操作系统
资源占用 轻量,MB 级别 重量,GB 级别
启动速度 秒级 分钟级
可移植性 高,镜像跨平台运行 较低,受虚拟化平台限制
隔离性 进程级隔离,较轻量 硬件级隔离,更强但开销大

1.3 在 Debian 12 上安装 Docker Engine 和 Docker Compose

本教程指导你在 Debian 12(Bookworm)上安装 Docker Engine 和 Docker Compose,遵循官方文档的推荐方法(https://docs.docker.com/engine/install/debian/).

前提条件
  • 防火墙限制
    • 如果使用 ufwfirewalld,请注意 Docker 暴露的容器端口会绕过防火墙规则。详情请参阅 Docker 和 ufw.
    • Docker 仅兼容 iptables-nftiptables-legacy。使用 nft 创建的防火墙规则不受支持。确保防火墙规则使用 iptablesip6tables,并添加到 DOCKER-USER 链。
  • 系统要求
    • 需要 64 位版本的 Debian 12(Bookworm)。
    • 支持的架构:x86_64(或 amd64)、armhfarm64ppc64le.
卸载旧版本

在安装 Docker Engine 之前,卸载可能冲突的包:

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt remove -y $pkg; done

注意/var/lib/docker/ 中的镜像、容器、卷和网络不会自动删除。如需全新安装,可参考卸载 Docker Engine部分清理数据。

安装方法
方法 1:使用 APT 仓库安装
  1. 设置 Docker 的 APT 仓库

    # 更新包索引并安装依赖
    sudo apt update
    sudo apt install -y ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    
    # 建议多输几次下面这行,可能被墙不稳定
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # 添加 Docker 仓库
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
      bookworm stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    sudo apt update
    
  2. 安装 Docker 包

    • 安装最新版本:
      sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
      
    • 如果需要安装特定版本:

      # 列出可用版本
      apt-cache madison docker-ce | awk '{ print $3 }'
      
      # 安装指定版本(例如 5:28.3.2-1~debian.12~bookworm)
      VERSION_STRING=5:28.3.2-1~debian.12~bookworm
      sudo apt install -y docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
      
  3. 验证安装
    sudo systemctl start docker
    sudo systemctl enable docker
    sudo docker run hello-world
    
    如果看到 hello-world 容器的确认信息,说明安装成功。
方法 2:使用便捷脚本安装

Docker 提供了一个便捷脚本(https://get.docker.com/) 用于非交互式安装,适合开发环境,但不推荐用于生产环境。限制

  • 需要 rootsudo 权限。
  • 脚本会自动检测发行版并配置包管理器。
  • 不支持自定义安装参数。
  • 默认安装最新稳定版本,可能导致意外的版本升级。
  • 不适合升级现有 Docker 安装。

运行以下命令安装:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

预览脚本步骤(可选):

sudo sh get-docker.sh --dry-run

验证安装:

sudo systemctl start docker
sudo docker run hello-world
安装预发布版本

若需安装测试版或预发布版,使用以下脚本:

curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
(可选)设置非 root 用户运行 Docker

默认情况下,需使用 sudo 运行 Docker 命令。为允许非 root 用户运行:

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

注销并重新登录或运行 newgrp docker 使更改生效。验证:

docker run hello-world
安装 Docker Compose

Docker Compose 作为插件已包含在 docker-compose-plugin 中,无需单独安装。验证版本:

docker compose version
配置 Docker 开机自启

确保 Docker 和 containerd 在系统启动时自动运行:

sudo systemctl enable docker.service
sudo systemctl enable containerd.service
升级 Docker Engine
  • 使用 APT 仓库升级: 重复“方法 1:安装 Docker 包”步骤,选择新版本:
    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  • 使用便捷脚本升级:不建议重新运行脚本,建议使用 APT 仓库升级以避免重复配置仓库导致的问题。
卸载 Docker Engine
  1. 卸载 Docker 包:
    sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  2. 删除所有镜像、容器和卷(可选):
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd
    
  3. 删除源列表和密钥:
    sudo rm /etc/apt/sources.list.d/docker.list
    sudo rm /etc/apt/keyrings/docker.asc
    
注意事项
  • 生产环境中优先使用 APT 仓库安装,便捷脚本适合开发或测试环境。
  • 如果使用衍生发行版(如 Kali Linux),需将 bookworm 替换为对应的 Debian 版本代号。
  • 更多配置详情,参考 Docker 官方文档Linux 安装后步骤.

2. Docker 基础操作

2.1 拉取镜像

拉取 nginx 镜像:

docker pull nginx

2.2 启动容器并访问服务

启动 nginx 容器并映射端口:

docker run -d -p 8080:80 --name my-nginx nginx
  • -d:后台运行。
  • -p 8080:80:将主机 8080 端口映射到容器 80 端口。
  • 访问 http://localhost:8080,应看到 Nginx 默认页面。

2.3 查看容器

  • 查看运行中的容器:
    docker ps
    
  • 查看所有容器(包括已停止):
    docker ps -a
    

2.4 停止和删除容器

  • 停止容器:
    docker stop my-nginx
    
  • 删除容器:
    docker rm my-nginx
    

2.5 删除镜像

  • 删除指定镜像:
    docker rmi nginx
    
  • 注意:镜像被容器引用时需先删除容器。

2.6 其他操作

  • 查看镜像列表:
    docker images
    
  • 进入容器内部:
    docker exec -it my-nginx bash
    
  • 查看容器日志:
    docker logs my-nginx
    

3. Dockerfile 编写与镜像构建

3.1 Dockerfile 基本结构和指令

  • 常用指令
    • FROM:指定基础镜像。
    • COPY:复制文件到镜像。
    • RUN:在构建时执行命令。
    • CMD:指定容器启动时的默认命令。
    • EXPOSE:声明容器监听的端口。
    • WORKDIR:设置工作目录。
  • 扩展:YAML 文件格式
    • YAML 是轻量级数据序列化格式,常用于配置文件(如 Docker Compose)。
    • 特点:层次结构清晰,使用缩进表示层级,键值对以 key: value 形式。
    • 示例:
      version: '3'
      services:
        web:
          image: nginx
          ports:
            - "8080:80"
      

3.2 编写简单的 Dockerfile

目标:构建一个 Nginx 镜像,主页显示 "hello docker".

  1. 创建目录并编写 index.html
    mkdir my-nginx
    cd my-nginx
    echo "hello docker" > index.html
    
  2. 编写 Dockerfile
    FROM nginx:latest
    COPY index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
  3. 构建镜像:
    docker build -t my-nginx:1.0 .
    
  4. 运行容器:
    docker run -d -p 8080:80 my-nginx:1.0
    
  5. 验证:访问 http://localhost:8080,应显示 "hello docker".

4. Docker Compose 基础

4.1 Docker Compose 的作用和优势

  • 作用:定义和管理多容器应用,通过 YAML 文件配置服务、端口、卷等。
  • 优势
    • 简化多容器管理。
    • 声明式配置,易于维护。
    • 支持环境变量和跨容器通信。

4.2 编写 Docker Compose 文件(Discuz 示例)

目标:部署 Discuz(PHP 论坛系统),包含 Nginx、MySQL 和 PHP 容器。

  1. 创建目录:
    mkdir discuz-docker
    cd discuz-docker
    
  2. 编写 docker-compose.yml
    version: '3'
    services:
      nginx:
        image: nginx:latest
        ports:
          - "8080:80"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
          - ./discuz:/var/www/html
        depends_on:
          - php
      php:
        image: php:7.4-fpm
        volumes:
          - ./discuz:/var/www/html
        depends_on:
          - mysql
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: discuz
        volumes:
          - mysql-data:/var/lib/mysql
    volumes:
      mysql-data:
    
  3. 创建 Nginx 配置文件 nginx.conf
    worker_processes 1;
    events { worker_connections 1024; }
    http {
        server {
            listen 80;
            root /var/www/html;
            index index.php index.html;
            location ~ \.php$ {
                fastcgi_pass php:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
        }
    }
    
  4. 下载 Discuz 源码:
    mkdir discuz
    wget -O discuz.zip https://gitee.com/dismz/DiscuzX/repository/archive/master.zip
    unzip discuz.zip -d discuz
    
  5. 启动服务:
    docker-compose up -d
    
  6. 验证:
    • 访问 http://localhost:8080,进入 Discuz 安装页面。
    • 配置数据库连接(主机:mysql,数据库:discuz,密码:root)。

5. Gitee 开源项目部署

5.1 部署 FastAPI 项目

以 Gitee 上的 fast-api 项目为例(假设为 FastAPI 框架项目)。

  1. 克隆项目:
    git clone https://gitee.com/<username>/fast-api.git
    cd fast-api
    
  2. 分析依赖:查看 requirements.txt 或项目文档,确认 Python 版本和依赖。
  3. 编写 Dockerfile
    FROM python:3.9
    WORKDIR /app
    COPY . /app
    RUN pip install --no-cache-dir -r requirements.txt
    EXPOSE 8000
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
    
  4. 构建并运行:
    docker build -t fast-api:1.0 .
    docker run -d -p 8000:8000 fast-api:1.0
    
  5. 验证:访问 http://localhost:8000/docs,查看 FastAPI 文档页面。

6. 原生方式转向 Docker 迁移

6.1 项目一:Dedecms

  1. 使用DockerCompose部署,详见DockerCompose部署Dedecms

6.2 项目二:WordPress

  1. 原生部署:需要配置 LAMP/LEMP/LNMP 栈,手动设置 WordPress。
  2. Docker 迁移: 直接拉取wordpress镜像

    version: '3'
    services:
      wordpress:
        image: wordpress:latest
        ports:
          - "8080:80"
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_USER: root
          WORDPRESS_DB_PASSWORD: root
          WORDPRESS_DB_NAME: wordpress
        depends_on:
          - mysql
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: wordpress
        volumes:
          - mysql-data:/var/lib/mysql
    volumes:
      mysql-data:
    
  3. 运行并验证:
    docker-compose up -d
    
    • 访问 http://localhost:8080,完成 WordPress 安装。

7. 开源项目一键部署

7.1 Halo

  1. 克隆项目:
    git clone https://gitee.com/halo-dev/halo.git
    cd halo
    
  2. 使用官方提供的 docker-compose.yml(通常在项目根目录)。
  3. 启动:
    docker-compose up -d
    
  4. 验证:访问 http://localhost:8090(端口依配置文件而定)。

7.2 mall-tiny

  1. 克隆并进入项目目录:
    git clone https://gitee.com/macrozheng/mall-tiny.git
    cd mall-tiny
    
  2. 使用项目自带的 Dockerfiledocker-compose.yml
  3. 构建并运行:
    docker-compose up -d
    
  4. 验证:根据项目文档访问前端或 API 地址。

7.3 gin-vue-admin

  1. 克隆项目:
    git clone https://gitee.com/pixelmax/gin-vue-admin.git
    cd gin-vue-admin
    
  2. 使用提供的 docker-compose.yml
  3. 启动并验证:
    docker-compose up -d
    
    • 访问前端地址(如 http://localhost:8080)。

8. 镜像分享与快速部署

8.1 导出镜像

  1. 保存镜像为 tar 文件:
    docker save -o my-nginx.tar my-nginx:1.0
    
  2. 分享 my-nginx.tar 文件给其他组员。

8.2 组员导入镜像

  1. 导入镜像:
    docker load -i my-nginx.tar
    
  2. 运行容器:
    docker run -d -p 8080:80 my-nginx:1.0
    
  3. 验证:访问 http://localhost:8080,确认一致性。

9. 学习资源补充

10. 预期成果

  1. 掌握 Docker 基础操作:完成镜像拉取、容器管理、构建等任务。
  2. 编写 Dockerfile 和 Docker Compose:成功部署 Nginx 和 Discuz。
  3. 部署 Gitee 开源项目:如 FastAPI 或 Halo。
  4. 镜像分享:通过 docker save/load 实现快速环境复制。
梦葉樱 all right reserved,powered by Gitbook该文件最后修改时间: 2025-08-01 21:42:02

results matching ""

    No results matching ""