写在前面

对于在中国大陆地区的 Linux 用户来说,安装 Docker 和 Docker Compose 时可能会因为网络问题遇到问题。官方的软件源位于国外,直接访问可能速度缓慢或被阻断。为了解决这一问题,推荐使用国内的镜像源来加速安装和镜像拉取过程。

本文将为你提供一份详尽的指南,介绍如何在常见的 Linux 发行版(如 Ubuntu, Debian, CentOS, Fedora)上,通过配置国内镜像源来顺利安装 Docker Engine 和 Docker Compose。

第一步:安装 Docker Engine

安装 Docker Engine 的首选方法是设置 Docker 的 aptyum 仓库,这样可以轻松地进行安装和更新。我们将使用国内的镜像源来替换官方源。

准备工作

在开始安装之前,如果你的系统上安装有旧版本的 Docker,建议先将其卸载:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 或者在基于 Debian 的系统上
sudo apt-get remove docker docker-engine docker.io containerd runc

在基于 Debian 的系统 (Ubuntu, Debian) 上安装

  1. 安装必要的依赖包,以允许 apt 通过 HTTPS 使用仓库:

    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg lsb-release
    
  2. 添加 Docker 的官方 GPG 密钥。为了确保软件包的安全性,需要添加 Docker 的官方 GPG 密钥。这里我们同样使用国内的镜像源(以清华大学开源软件镜像站为例):

    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
  3. 设置 Docker 的 apt 仓库。将 Docker 的官方仓库地址替换为国内镜像源地址:

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    注意:

    • $(lsb_release -cs) 会返回你的 Ubuntu/Debian 发行版的代号 (例如 focal, jammy, bullseye)。

    • 除了清华大学源,你也可以选择其他镜像源,如中国科学技术大学(USTC)源 (https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu) 或阿里云源。

  4. 安装 Docker Engine:

    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
    

在基于 RPM 的系统 (CentOS, Fedora) 上安装

  1. 安装 yum-utils,它提供了 yum-config-manager 工具:

    sudo yum install -y yum-utils
    
  2. 设置 Docker 的 yum 仓库。同样,我们将使用国内的镜像源(以清华大学源为例):

    sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    

    对于 Fedora 用户,请使用相应的 Fedora 仓库地址。

  3. 安装 Docker Engine:

    sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
    

第二步:配置 Docker 镜像加速

为了在拉取 Docker 镜像时获得更快的速度,你需要配置 Docker 守护进程以使用国内的镜像加速器。

  1. 创建或修改 Docker 配置文件

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://registry.docker-cn.com"
      ]
    }
    EOF
    

    这里列出了一些常用的国内镜像加速器地址,你可以根据自己的网络情况选择一个或多个。

  2. 重启 Docker 服务以应用新的配置:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  3. 验证 Docker 是否安装成功

    sudo docker run hello-world
    

    如果能够成功拉取并运行 hello-world 镜像,则说明 Docker Engine 已成功安装并配置了镜像加速。

至此,你已经成功安装并配置好了 Docker 和 Docker Compose。现在你可以开始使用它们来构建和管理你的容器化应用了。

基本使用方法

好的,在成功安装 Docker 和 Docker Compose 之后,接下来我们将介绍它们的基本使用方法。

这篇指南将分为两部分:

  1. Docker 的基本使用:如何管理单个容器,包括镜像、容器的生命周期管理。

  2. Docker Compose 的基本使用:如何通过一个配置文件来定义和运行多个容器的应用。

Docker 基本使用方法

Docker 的核心是围绕 镜像 (Image)容器 (Container) 展开的。

  • 镜像 (Image):一个只读的模板,包含了运行应用程序所需的所有内容——代码、运行时、库、环境变量和配置文件。可以把它理解为一个轻量级的虚拟机快照。

  • 容器 (Container):镜像的运行实例。你可以创建、启动、停止、移动或删除容器。每个容器都是相互隔离、保证安全的平台。

1. 镜像管理 (Image Management)

a. 搜索镜像

从 Docker Hub(或者你配置的镜像加速器)上搜索需要的镜像。

docker search nginx

这会列出所有与 "nginx" 相关的公开镜像。

b. 拉取镜像

将远程仓库的镜像下载到本地。

# 拉取最新版的 Nginx 镜像
docker pull nginx

# 拉取特定版本的 Nginx 镜像
docker pull nginx:1.21.6

如果不指定标签 (tag, 如 :1.21.6),默认会拉取 latest 标签的镜像。

c. 查看本地镜像

列出所有已经下载到本地的镜像。

docker images

d. 删除本地镜像

当一个镜像不再需要时,可以删除它以释放磁盘空间。

docker rmi nginx:1.21.6

如果该镜像正被某个容器使用,你需要先删除该容器才能删除镜像。可以使用 -f 参数强制删除。

2. 容器生命周期管理 (Container Lifecycle Management)

a. 运行容器 (创建并启动)

docker run 是最核心的命令,它从一个镜像创建一个新的容器并启动它。

基本示例:运行一个 Nginx Web 服务器

docker run --name my-nginx -p 8080:80 -d nginx

参数解释:

  • --name my-nginx:给容器指定一个名字 my-nginx,方便后续操作。如果不指定,Docker 会随机分配一个名字。

  • -p 8080:80:端口映射。将主机的 8080 端口映射到容器的 80 端口。这样你就可以通过访问 http://主机IP:8080 来访问 Nginx 服务器了。

  • -d (detach):后台运行容器,并返回容器 ID。没有这个参数,容器会在前台运行,占用你的终端。

  • nginx:用来创建容器的镜像名称。

b. 查看正在运行的容器

Bash

docker ps

要查看所有容器(包括已停止的),请使用 -a 参数:

docker ps -a

c. 停止容器

docker stop my-nginx

这里的 my-nginx 是你在 docker run 时指定的容器名。你也可以使用容器 ID。

d. 启动已停止的容器

docker start my-nginx

e. 重启容器

docker restart my-nginx

f. 进入正在运行的容器 (执行命令)

有时候需要进入容器内部进行调试或查看文件。

docker exec -it my-nginx /bin/bash

参数解释:

  • -i (interactive):保持 STDIN 打开,即使没有附加。

  • -t (tty):分配一个伪终端。

  • /bin/bash:在容器内要执行的命令,这里是启动一个 bash shell。

g. 查看容器日志

查看容器的标准输出日志,非常适合用来排错。

docker logs my-nginx

# 持续跟踪日志(类似 tail -f)
docker logs -f my-nginx

h. 删除容器

删除一个或多个已经停止的容器。

# 首先确保容器已经停止
docker stop my-nginx

# 然后删除容器
docker rm my-nginx

如果要删除一个正在运行的容器,需要添加 -f 参数。

Docker Compose 基本使用方法

当你的应用需要多个服务(例如一个 Web 应用 + 一个数据库)协同工作时,手动管理多个 docker run 命令会变得非常繁琐。Docker Compose 允许你使用一个 YAML 文件来定义和管理一个多容器的 Docker 应用。

核心是 docker-compose.yml 文件。

1. 编写 docker-compose.yml 文件

假设我们要部署一个 WordPress 网站,它需要一个 WordPress 服务和一个 MySQL 数据库服务。

创建一个名为 docker-compose.yml 的文件,并写入以下内容:

version: '3.8'  # 指定 compose 文件版本

services:  # 定义一组服务
  db:  # 服务名称,这里是数据库服务
    image: mysql:5.7  # 使用的镜像
    container_name: wordpress_db
    volumes:  # 数据卷挂载,用于数据持久化
      - db_data:/var/lib/mysql
    restart: always  # 容器退出时总是重启
    environment:  # 设置环境变量
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: your_wordpress_password

  wordpress:  # 服务名称,这里是 WordPress 服务
    image: wordpress:latest
    container_name: wordpress_app
    volumes:
      - ./wp_content:/var/www/html/wp-content
    ports:  # 端口映射
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306  # 连接到 db 服务的 3306 端口
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: your_wordpress_password
      WORDPRESS_DB_NAME: wordpress
    depends_on: # 声明依赖关系,wordpress 会在 db 启动之后再启动
      - db

volumes:  # 定义数据卷
  db_data:
  wp_content:

关键点

  • services: 定义了两个服务,dbwordpress

  • image: 指定每个服务所使用的 Docker 镜像。

  • ports: 端口映射,将主机的 8000 端口映射到 wordpress 容器的 80 端口。

  • volumes: 数据持久化。将数据库文件和 WordPress 的 wp-content 目录保存在主机上,这样即使容器被删除,数据也不会丢失。

  • environment: 设置容器内的环境变量,用于配置数据库连接等。

  • depends_on: 定义了服务间的依赖关系,确保数据库先于 WordPress 启动。

  • 网络: Docker Compose 会自动为这个应用创建一个默认的网络,dbwordpress 服务在同一个网络中,可以通过服务名 (db) 直接通信。

2. 管理应用

docker-compose.yml 文件所在的目录中,执行以下命令。请注意,新版命令是 docker compose(无连字符)。

a. 启动应用 (创建并启动所有服务)

docker compose up -d

-d 参数表示在后台运行。首次运行时,它会自动拉取所需的镜像。

b. 查看服务状态

docker compose ps

c. 查看服务日志

# 查看所有服务的日志
docker compose logs

# 查看特定服务的日志并持续跟踪
docker compose logs -f wordpress

d. 停止并移除容器

docker compose down

这个命令会停止并删除由 docker-compose.yml 定义的容器和网络。如果需要同时删除 volumes,可以加上 --volumes 参数。

e. 暂停和恢复服务

# 暂停服务中的容器
docker compose pause

# 恢复服务中的容器
docker compose unpause

f. 重启服务

docker compose restart

总结

  • Docker 主要用于管理单个容器,命令如 docker run, docker pull, docker ps, docker rm 等。

  • Docker Compose 主要用于管理多容器应用,通过一个 docker-compose.yml 文件来编排服务,核心命令是 docker compose updocker compose down

从简单的 docker run 开始练习,熟悉容器的生命周期。当你需要部署更复杂的应用时,再转向使用 Docker Compose,这将大大简化你的部署和管理工作。