Docker 容器的实践
目标
- 理解 Docker 的基本概念和优势禁止
- 掌握 Docker 的安装、镜像管理、容器管理等基础操作。
- 学会编写 Dockerfile 和构建自定义镜像。
- 掌握 Docker Compose 的使用方法。
- 能够在 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/).
前提条件
- 防火墙限制:
- 如果使用
ufw
或firewalld
,请注意 Docker 暴露的容器端口会绕过防火墙规则。详情请参阅 Docker 和 ufw. - Docker 仅兼容
iptables-nft
和iptables-legacy
。使用nft
创建的防火墙规则不受支持。确保防火墙规则使用iptables
或ip6tables
,并添加到DOCKER-USER
链。
- 如果使用
- 系统要求:
- 需要 64 位版本的 Debian 12(Bookworm)。
- 支持的架构:
x86_64
(或amd64
)、armhf
、arm64
、ppc64le
.
卸载旧版本
在安装 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 仓库安装
设置 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
安装 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
- 安装最新版本:
- 验证安装:
如果看到sudo systemctl start docker sudo systemctl enable docker sudo docker run hello-world
hello-world
容器的确认信息,说明安装成功。
方法 2:使用便捷脚本安装
Docker 提供了一个便捷脚本(https://get.docker.com/) 用于非交互式安装,适合开发环境,但不推荐用于生产环境。限制:
- 需要
root
或sudo
权限。 - 脚本会自动检测发行版并配置包管理器。
- 不支持自定义安装参数。
- 默认安装最新稳定版本,可能导致意外的版本升级。
- 不适合升级现有 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
- 卸载 Docker 包:
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
- 删除所有镜像、容器和卷(可选):
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
- 删除源列表和密钥:
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".
- 创建目录并编写
index.html
:mkdir my-nginx cd my-nginx echo "hello docker" > index.html
- 编写
Dockerfile
:FROM nginx:latest COPY index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
- 构建镜像:
docker build -t my-nginx:1.0 .
- 运行容器:
docker run -d -p 8080:80 my-nginx:1.0
- 验证:访问
http://localhost:8080
,应显示 "hello docker".
4. Docker Compose 基础
4.1 Docker Compose 的作用和优势
- 作用:定义和管理多容器应用,通过 YAML 文件配置服务、端口、卷等。
- 优势:
- 简化多容器管理。
- 声明式配置,易于维护。
- 支持环境变量和跨容器通信。
4.2 编写 Docker Compose 文件(Discuz 示例)
目标:部署 Discuz(PHP 论坛系统),包含 Nginx、MySQL 和 PHP 容器。
- 创建目录:
mkdir discuz-docker cd discuz-docker
- 编写
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:
- 创建 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; } } }
- 下载 Discuz 源码:
mkdir discuz wget -O discuz.zip https://gitee.com/dismz/DiscuzX/repository/archive/master.zip unzip discuz.zip -d discuz
- 启动服务:
docker-compose up -d
- 验证:
- 访问
http://localhost:8080
,进入 Discuz 安装页面。 - 配置数据库连接(主机:
mysql
,数据库:discuz
,密码:root
)。
- 访问
5. Gitee 开源项目部署
5.1 部署 FastAPI 项目
以 Gitee 上的 fast-api
项目为例(假设为 FastAPI 框架项目)。
- 克隆项目:
git clone https://gitee.com/<username>/fast-api.git cd fast-api
- 分析依赖:查看
requirements.txt
或项目文档,确认 Python 版本和依赖。 - 编写
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"]
- 构建并运行:
docker build -t fast-api:1.0 . docker run -d -p 8000:8000 fast-api:1.0
- 验证:访问
http://localhost:8000/docs
,查看 FastAPI 文档页面。
6. 原生方式转向 Docker 迁移
6.1 项目一:Dedecms
- 使用DockerCompose部署,详见DockerCompose部署Dedecms
6.2 项目二:WordPress
- 原生部署:需要配置 LAMP/LEMP/LNMP 栈,手动设置 WordPress。
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:
- 运行并验证:
docker-compose up -d
- 访问
http://localhost:8080
,完成 WordPress 安装。
- 访问
7. 开源项目一键部署
7.1 Halo
- 克隆项目:
git clone https://gitee.com/halo-dev/halo.git cd halo
- 使用官方提供的
docker-compose.yml
(通常在项目根目录)。 - 启动:
docker-compose up -d
- 验证:访问
http://localhost:8090
(端口依配置文件而定)。
7.2 mall-tiny
- 克隆并进入项目目录:
git clone https://gitee.com/macrozheng/mall-tiny.git cd mall-tiny
- 使用项目自带的
Dockerfile
或docker-compose.yml
。 - 构建并运行:
docker-compose up -d
- 验证:根据项目文档访问前端或 API 地址。
7.3 gin-vue-admin
- 克隆项目:
git clone https://gitee.com/pixelmax/gin-vue-admin.git cd gin-vue-admin
- 使用提供的
docker-compose.yml
。 - 启动并验证:
docker-compose up -d
- 访问前端地址(如
http://localhost:8080
)。
- 访问前端地址(如
8. 镜像分享与快速部署
8.1 导出镜像
- 保存镜像为 tar 文件:
docker save -o my-nginx.tar my-nginx:1.0
- 分享
my-nginx.tar
文件给其他组员。
8.2 组员导入镜像
- 导入镜像:
docker load -i my-nginx.tar
- 运行容器:
docker run -d -p 8080:80 my-nginx:1.0
- 验证:访问
http://localhost:8080
,确认一致性。
9. 学习资源补充
- Docker 官方文档:https://docs.docker.com/
- 菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html
- Docker Hub:https://hub.docker.com/(查找官方镜像)
- Gitee 文档:参考项目 README 或 Wiki。
10. 预期成果
- 掌握 Docker 基础操作:完成镜像拉取、容器管理、构建等任务。
- 编写 Dockerfile 和 Docker Compose:成功部署 Nginx 和 Discuz。
- 部署 Gitee 开源项目:如 FastAPI 或 Halo。
- 镜像分享:通过
docker save/load
实现快速环境复制。