CentOS Docker 安装与配置

CentOS 上 Docker 的详细安装与配置指南

Docker 已经成为现代软件开发和部署中不可或缺的工具。它提供了一种轻量级、可移植的方式来打包、分发和运行应用程序。本文将深入探讨在 CentOS 系统上安装、配置和使用 Docker 的各个方面,旨在提供一份全面的指南,帮助您在 CentOS 环境中充分利用 Docker 的强大功能。

一、Docker 简介与优势

在深入安装细节之前,让我们先简要回顾一下 Docker 的概念和它带来的主要优势。

1.1 什么是 Docker?

Docker 是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何支持 Docker 的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 App)。

1.2 Docker 的核心概念

  • 镜像 (Image): Docker 镜像是一个只读的模板,包含了运行应用程序所需的所有内容:代码、运行时环境、库、环境变量和配置文件。
  • 容器 (Container): Docker 容器是镜像的可运行实例。您可以启动、停止、删除和移动容器。每个容器都是隔离的,拥有自己的文件系统、网络和进程空间。
  • 仓库 (Registry): Docker 仓库用于存储和分发 Docker 镜像。Docker Hub 是一个公共的仓库,您也可以创建私有仓库。
  • Dockerfile: 一个文本文件,其中包含一系列用于构建 Docker 镜像的指令。

1.3 Docker 的优势

  • 轻量级和高效: Docker 容器共享宿主机的内核,不需要额外的操作系统,因此比传统的虚拟机更轻量、更快速。
  • 可移植性: Docker 容器可以在任何支持 Docker 的平台上运行,无需修改,实现了“一次构建,随处运行”。
  • 隔离性: 每个 Docker 容器都是隔离的,互不干扰,确保了应用程序的稳定性和安全性。
  • 版本控制: Docker 镜像可以进行版本控制,方便回滚和管理。
  • 快速部署: Docker 容器的启动和停止非常快,可以大大缩短应用程序的部署时间。
  • 可扩展性: Docker 可以轻松地进行水平扩展,以应对高负载和高可用性需求。
  • DevOps 友好: Docker 与 DevOps 理念高度契合,促进了开发、测试和运维之间的协作。

二、CentOS 上 Docker 的安装

在 CentOS 上安装 Docker 有多种方法,我们将介绍两种最常用的方法:使用 Docker 官方仓库和使用便捷脚本。

2.1 系统要求

在开始安装之前,请确保您的 CentOS 系统满足以下要求:

  • CentOS 7 或更高版本(建议使用 CentOS 7 或 CentOS 8)。
  • 64 位系统架构。
  • 内核版本 3.10 或更高。
  • 建议至少 2GB 的内存。
  • 稳定的网络连接。
  • 建议以 root 用户或具有 sudo 权限的用户进行安装。

2.2 使用 Docker 官方仓库安装 (推荐)

这种方法通过添加 Docker 官方的 Yum 仓库来安装,可以确保您获得最新版本的 Docker,并且方便后续的更新。

  1. 卸载旧版本 (如果存在):

    如果您之前安装过旧版本的 Docker,请先卸载它们:

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

  2. 安装必要的软件包:

    bash
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

  3. 添加 Docker 官方仓库:

    bash
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  4. 安装 Docker Engine:

    bash
    sudo yum install docker-ce docker-ce-cli containerd.io

    如果出现错误,提示No package docker-ce available,可能是yum的缓存未更新,尝试使用 sudo yum makecache更新缓存

  5. 启动 Docker 服务:

    bash
    sudo systemctl start docker

  6. 设置 Docker 开机自启:

    bash
    sudo systemctl enable docker

  7. 验证安装:

    运行以下命令来验证 Docker 是否已正确安装:

    bash
    sudo docker run hello-world

    如果一切正常,您将看到一条消息,表明 Docker 已成功安装并正在运行。

2.3 使用便捷脚本安装

Docker 提供了一个便捷的安装脚本,可以简化安装过程。但请注意,这种方法可能不适用于生产环境,因为它可能无法提供最新的稳定版本。

  1. 下载并运行安装脚本:

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

  2. 启动 Docker 服务:

    bash
    sudo systemctl start docker

  3. 设置 Docker 开机自启:

    bash
    sudo systemctl enable docker

  4. 验证安装:

    bash
    sudo docker run hello-world

三、Docker 的基本配置

安装完成后,您可能需要进行一些基本的配置,以优化 Docker 的使用体验。

3.1 配置 Docker 用户组

默认情况下,只有 root 用户才能运行 Docker 命令。为了避免每次都使用 sudo,您可以将您的用户添加到 docker 用户组:

  1. 创建 docker 用户组 (如果不存在):

    bash
    sudo groupadd docker

  2. 将您的用户添加到 docker 用户组:

    ```bash
    sudo usermod -aG docker $USER # 将当前用户添加到 docker 组

    或者

    sudo usermod -aG docker your_username # 将指定用户添加到 docker 组
    ```

  3. 重新登录或重启系统:

    为了使更改生效,您需要重新登录或重启系统。

  4. 验证:

    重新登录后,尝试运行 docker 命令,而无需使用 sudo

3.2 配置 Docker 镜像加速器 (可选)

由于国内网络环境的特殊性,从 Docker Hub 下载镜像可能会很慢。您可以配置 Docker 镜像加速器来加速镜像的下载。

常用的 Docker 镜像加速器有:

  • 阿里云镜像加速器
  • DaoCloud 镜像加速器
  • 网易云镜像加速器
  • Docker 官方中国镜像加速器

以下以阿里云镜像加速器为例进行配置:

  1. 获取您的专属加速器地址:

    登录阿里云容器镜像服务控制台,找到您的专属加速器地址。

  2. 修改 Docker 配置文件:

    创建或编辑 /etc/docker/daemon.json 文件(如果文件不存在,则创建它):

    bash
    sudo vi /etc/docker/daemon.json

    添加以下内容(将 <your_aliyun_mirror_address> 替换为您的阿里云镜像加速器地址):

    json
    {
    "registry-mirrors": ["<your_aliyun_mirror_address>"]
    }

  3. 重启 Docker 服务:

    bash
    sudo systemctl restart docker

3.3 配置 Docker 存储驱动 (可选)

Docker 支持多种存储驱动,用于管理镜像和容器的文件系统。默认情况下,CentOS 上的 Docker 通常使用 overlay2 存储驱动。

您可以通过以下命令查看当前的存储驱动:

bash
docker info | grep Storage

如果您需要更改存储驱动,可以编辑 /etc/docker/daemon.json 文件,添加 storage-driver 选项。例如,要使用 devicemapper 存储驱动:

json
{
"storage-driver": "devicemapper"
}

注意: 更改存储驱动可能会导致现有镜像和容器不可用,请谨慎操作。

3.4 配置 Docker 日志 (可选)

Docker 默认将容器的日志输出到标准输出 (stdout) 和标准错误 (stderr)。您可以通过配置 Docker 日志驱动来更改日志的存储位置和方式。

常用的日志驱动有:

  • json-file (默认)
  • syslog
  • journald
  • gelf
  • fluentd
  • awslogs
  • splunk

例如,要使用 syslog 日志驱动,可以编辑 /etc/docker/daemon.json 文件,添加 log-driver 选项:

json
{
"log-driver": "syslog"
}

您还可以配置日志驱动的选项,例如日志文件的大小和数量限制。

3.5 配置 Docker 网络 (可选)

Docker 默认使用桥接网络 (bridge network)。您可以通过创建自定义网络来满足更复杂的网络需求。

例如,创建一个名为 my-network 的自定义桥接网络:

bash
docker network create my-network

在运行容器时,可以使用 --network 选项指定容器连接到哪个网络:

bash
docker run -d --network my-network my-image

四、Docker 的常用命令

掌握 Docker 的常用命令是高效使用 Docker 的关键。以下是一些最常用的命令:

4.1 镜像管理

  • docker images: 列出本地镜像。
  • docker pull <image_name>:<tag>: 从仓库拉取镜像。
  • docker build -t <image_name>:<tag> .: 从 Dockerfile 构建镜像。
  • docker rmi <image_id>docker rmi <image_name>:<tag>: 删除镜像。
  • docker tag <source_image>:<tag> <target_image>:<tag>: 为镜像打标签。
  • docker push <image_name>:<tag>: 将镜像推送到仓库。
  • docker search <keyword>: 在 Docker Hub 上搜索镜像。
  • docker image inspect <image_id>docker image inspect <image_name:tag>: 显示镜像的详细信息

4.2 容器管理

  • docker ps: 列出正在运行的容器。
  • docker ps -a: 列出所有容器(包括已停止的容器)。
  • docker run -d -p <host_port>:<container_port> --name <container_name> <image_name>:<tag>: 运行一个容器。
    • -d: 后台运行。
    • -p: 端口映射。
    • --name: 容器名称。
  • docker start <container_id>docker start <container_name>: 启动一个已停止的容器。
  • docker stop <container_id>docker stop <container_name>: 停止一个正在运行的容器。
  • docker restart <container_id>docker restart <container_name>: 重启一个容器。
  • docker rm <container_id>docker rm <container_name>: 删除一个容器。
  • docker exec -it <container_id> <command>: 在正在运行的容器中执行命令。
    • -it: 交互式终端。
  • docker logs <container_id>docker logs <container_name>: 查看容器的日志。
  • docker inspect <container_id>docker inspect <container_name>: 查看容器的详细信息。
  • docker cp <container_id>:<container_path> <host_path>docker cp <host_path> <container_id>:<container_path>: 在容器和宿主机之间复制文件。
  • docker commit <container_id> <new_image_name>:<tag> 将容器更改保存为新的镜像

4.3 网络管理

  • docker network ls: 列出现有的网络
  • docker network inspect <network_name>: 查看指定网络的详细信息
  • docker network rm <network_name>:删除指定网络

4.4 其他常用命令

  • docker info: 显示 Docker 系统信息。
  • docker version: 显示 Docker 版本信息。
  • docker login: 登录到 Docker 仓库。
  • docker logout: 登出 Docker 仓库。

五、Dockerfile 最佳实践

Dockerfile 是构建 Docker 镜像的蓝图。编写良好的 Dockerfile 可以提高镜像的构建效率、可维护性和安全性。

5.1 最佳实践

  1. 使用官方基础镜像: 尽量使用官方提供的基础镜像,例如 centosubuntualpine 等。
  2. 选择合适的基础镜像: 根据您的应用程序需求选择合适的基础镜像。例如,对于小型应用程序,可以选择 alpine 镜像以减小镜像大小。
  3. 使用 .dockerignore 文件: 创建 .dockerignore 文件,排除不需要包含在镜像中的文件和目录,例如临时文件、构建产物等。
  4. 最小化镜像层数: 每个 RUNCOPYADD 指令都会创建一个新的镜像层。尽量将多个命令合并到一个 RUN 指令中,以减少镜像层数。
  5. 使用多阶段构建: 多阶段构建可以将构建过程分为多个阶段,只保留最终所需的产物,从而减小最终镜像的大小。
  6. 避免安装不必要的软件包: 只安装应用程序运行所需的软件包,避免安装不必要的工具和依赖项。
  7. 使用非 root 用户: 为了安全起见,尽量避免在容器中以 root 用户运行应用程序。可以创建一个普通用户,并使用 USER 指令切换到该用户。
  8. 设置工作目录: 使用 WORKDIR 指令设置容器的工作目录,避免在根目录下执行命令。
  9. 使用环境变量: 使用 ENV 指令设置环境变量,使镜像更具可配置性。
  10. 明确指定端口: 使用 EXPOSE 指令明确指定容器暴露的端口。
  11. 使用标签: 使用 LABEL 指令为镜像添加元数据,例如作者、版本、描述等。
  12. 定期更新基础镜像: 定期更新基础镜像,以获取最新的安全补丁和功能更新。
  13. 使用构建缓存: docker build 默认会缓存每一层的构建结果。
  14. 指定版本号:对于需要安装的包,尽量指定版本号。

5.2 示例 Dockerfile

```dockerfile

使用官方 CentOS 基础镜像

FROM centos:7

设置维护者信息

LABEL maintainer="Your Name your.email@example.com"

设置工作目录

WORKDIR /app

安装必要的软件包

RUN yum update -y && \
yum install -y \
python3 \
python3-pip && \
yum clean all

复制应用程序代码

COPY . /app

安装 Python 依赖项

RUN pip3 install --no-cache-dir -r requirements.txt

设置环境变量

ENV PYTHONUNBUFFERED=1

暴露端口

EXPOSE 8000

创建普通用户

RUN useradd -m myuser
USER myuser

运行应用程序

CMD ["python3", "app.py"]
```

六、Docker Compose (可选)

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务、网络和卷。

6.1 安装 Docker Compose

  1. 下载 Docker Compose:

    bash
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    注意:这里的v2.23.0是compose的版本号,应该选择合适的版本号替换。查看最新版本号,可以进入Docker Compose Release页面查看。

  2. 添加可执行权限:

    bash
    sudo chmod +x /usr/local/bin/docker-compose

  3. 验证安装:

    bash
    docker-compose --version

6.2 使用 Docker Compose

  1. 创建 docker-compose.yml 文件:

    在您的项目目录中创建一个名为 docker-compose.yml 的文件。

  2. 定义服务:

    docker-compose.yml 文件中定义您的应用程序的服务、网络和卷。

    ```yaml
    version: "3.9" # 指定 docker-compose.yml 文件的版本

    services:
    web: # 服务名称
    image: nginx:latest # 使用的镜像
    ports:
    - "80:80" # 端口映射
    volumes:
    - ./html:/usr/share/nginx/html # 卷挂载
    depends_on:
    - app # 依赖关系

    app:
    build: . # 从当前目录的 Dockerfile 构建镜像
    ports:
    - "8000:8000"
    environment:
    - DATABASE_URL=postgres://user:password@db:5432/mydb # 环境变量

    db:
    image: postgres:latest
    environment:
    - POSTGRES_USER=user
    - POSTGRES_PASSWORD=password
    - POSTGRES_DB=mydb

    ```

  3. 运行应用程序:

    docker-compose.yml 文件所在的目录中运行以下命令:

    bash
    docker-compose up -d # -d 表示后台运行

  4. 停止应用程序:

    bash
    docker-compose down

    其他常用命令包括docker-compose ps,docker-compose logs,docker-compose build,docker-compose start,docker-compose stop等。

七、总结

本文详细介绍了在 CentOS 系统上安装、配置和使用 Docker 的各个方面,包括 Docker 的基本概念、安装方法、基本配置、常用命令、Dockerfile 最佳实践以及 Docker Compose 的使用。

希望这篇指南能够帮助您在 CentOS 环境中充分利用 Docker 的强大功能,提高您的开发和部署效率。Docker 是一个不断发展的技术,建议您持续关注 Docker 的最新动态和最佳实践。

THE END