1. Docker 容器技术概述

Docker 是一个用 Go 语言开发的容器化平台,它通过容器技术解决了软件安装部署的复杂性问题。容器可以看作是一个轻量级的、可移植的软件单元,它将应用程序及其所有依赖项(库、配置文件、环境变量等)打包在一起,确保在任何环境中都能以相同的方式运行。

Docker 主要解决了以下问题:

  • 环境一致性:开发、测试、生产环境完全一致,避免“在我机器上能运行”的问题。
  • 快速部署:镜像秒级启动,极大缩短了应用部署和扩展的时间。
  • 资源隔离与高效利用:相比虚拟机,容器共享主机操作系统内核,资源开销更小,密度更高。
  • 简化配置:通过 Dockerfile 定义环境,实现基础设施即代码。

2. Docker 核心概念

2.1 镜像 (Image)

镜像是一个只读的模板,包含了运行应用程序所需的微型操作系统、核心软件、依赖库和程序。可以将其理解为一个软件的“安装包”。一个镜像就是一个独立的软件。

官方镜像仓库:Docker Hub
国内镜像加速:渡渡鸟镜像同步站(个人网站,提供镜像下载服务)

2.2 仓库 (Repository)

仓库是集中存放镜像的地方,类似于代码仓库。Docker Hub 是最大的公共仓库,企业也可以搭建私有仓库。

2.3 容器 (Container)

容器是镜像的运行实例。你可以创建、启动、停止、移动或删除容器。容器与镜像的关系,类似于面向对象编程中“类”与“对象”的关系。

3. 云原生技术栈

云原生是一套技术体系和方法论,旨在充分利用云计算的弹性、分布式优势。其核心组件通常包括:

  • Docker:容器运行时标准,实现应用封装与隔离。
  • Kubernetes (k8s):容器编排平台,用于自动化部署、扩展和管理容器化应用。
  • etcd:分布式键值存储,作为 Kubernetes 的后端数据库,存储集群状态。
  • Prometheus:开源监控和告警工具,是云原生监控的事实标准。

4. CentOS stream10 环境准备与 Docker 安装

4.1 服务器环境

硬件参考配置:4核 CPU / 8GB 内存 / 100GB 磁盘
操作系统:CentOS Stream 10

4.2 安装步骤(基于阿里云镜像源)

参考文档:阿里云 Docker CE 镜像

  1. 修改主机名
[root@localhost ~]# hostnamectl set-hostname docker
[root@localhost ~]# su
  1. 测试网络连通性
[root@docker ~]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.177) 56(84) bytes of data.
64 bytes from 183.2.172.177: icmp_seq=1 ttl=128 time=20.7 ms
64 bytes from 183.2.172.177: icmp_seq=2 ttl=128 time=23.5 ms
64 bytes from 183.2.172.177: icmp_seq=3 ttl=128 time=19.0 ms
64 bytes from 183.2.172.177: icmp_seq=4 ttl=128 time=20.7 ms
^C
--- www.a.shifen.com ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7033ms
rtt min/avg/max/mdev = 18.668/21.695/29.102/3.113 ms
  1. 安装 Docker
# Step 1: 安装必要系统工具
sudo yum install -y yum-utils
# Step 2: 添加阿里云 Docker CE 仓库
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看仓库文件
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# ls
centos-addons.repo  centos.repo  docker-ce.repo
#查看可用仓库
[root@docker yum.repos.d]# yum repolist
repo id                         repo name
appstream                       CentOS Stream 10 - AppStream
baseos                          CentOS Stream 10 - BaseOS
docker-ce-stable                Docker CE Stable - x86_64
extras-common                   CentOS Stream 10 - Extras packages
# Step 3: 安装 Docker 及相关组件
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# Step 4: 启动 Docker 服务
sudo systemctl start docker
sudo systemctl restart docker  # 重启
sudo systemctl status docker   # 查看状态
sudo systemctl stop docker     # 停止(注意:停止前需确认无触发单元运行)
#查看 Docker 进程
[root@docker yum.repos.d]# ps aux | grep docker
root       11803  4.6  1.0 1907476 81672 ?       Ssl  11:32   0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       11994  0.0  0.0   6380  2004 pts/0    S+   11:33   0:00 grep --color=auto docker
# Step 5: 设置 Docker 开机自启
sudo systemctl enable docker
#关闭防火墙和 SELinux(生产环境请谨慎评估)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
#安装 vim 编辑器(可选)
sudo yum install vim -y
#关闭 SELinux(需重启生效)
sudo vim /etc/selinux/config
#将 SELINUX=enforcing 改为 SELINUX=disabled
#建议重启系统
sudo reboot

5. Docker 组件详解

安装时我们安装了五个核心组件,它们构成了完整的 Docker 容器化解决方案:

  1. docker-ce:Docker 社区版引擎,是服务器端的核心软件。
  2. docker-ce-cli:Docker 命令行客户端,用户通过它与 Docker 守护进程交互。
  3. containerd.io:容器运行时,是 Docker 依赖的底层执行组件,负责容器的生命周期管理。
  4. docker-buildx-plugin:增强镜像构建能力,支持多平台构建等高级特性。
  5. docker-compose-plugin:简化多容器应用的编排和管理。

这五个组件覆盖了“镜像构建 → 容器运行 → 多容器编排”的全部流程。

6. 实战:运行 MySQL 容器

6.1 拉取与重命名镜像

# 从华为云镜像仓库拉取 MySQL 8.4.6
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.4.6
#为镜像添加更简短的标签(可选)
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.4.6 docker.io/mysql:8.4.6

6.2 启动 MySQL 容器

# 后台运行一个名为 s-mysql-1 的容器,设置 root 密码,并将主机 3306 端口映射到容器
docker run -d --name s-mysql-1 -e "MYSQL_ROOT_PASSWORD=s123456" -p 3306:3306 mysql:8.4.6
#查看正在运行的容器
docker ps
输出示例:
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
a9e6a09b14e8   mysql:8.4.6   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp   s-mysql-1

6.3 容器基本操作

# 进入容器内部执行命令(交互式)
docker exec -it s-mysql-1 bash
# 在容器内部连接 MySQL
bash-5.1# mysql -uroot -p's123456'
查看容器日志
docker logs s-mysql-1
删除容器(建议先停止再删除)
docker stop s-mysql-1
docker rm s-mysql-1

7. Docker 常用命令与容器生命周期

7.1 如何判断 Docker 服务是否运行

可以通过以下两种主要方式检查 Docker 服务状态:

  1. 使用 systemctl 查看服务状态
systemctl status docker

该命令会显示 Docker 服务的详细状态,包括是否正在运行、启动时间、进程 ID 等信息。

  1. 通过进程列表检查
ps aux | grep dockerd

如果 Docker 守护进程(dockerd)正在运行,你会看到类似下面的输出:

root         887  0.0  1.3 2120948 109504 ?      Ssl  11:41   0:06 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

7.2 Docker 常用命令速查

  • docker images:列出本地所有镜像。
  • docker ps:查看正在运行的容器。
  • docker ps -a:查看所有容器(包括已停止的)。
  • docker stop <容器名或ID>:停止正在运行的容器。
  • docker pull <镜像名>:从仓库拉取镜像。
  • docker tag <源镜像> <新镜像名>:为镜像创建新的标签(改名)。
  • docker run:创建并启动一个新容器。
  • docker start <容器名或ID>:启动一个已创建但处于停止状态的容器。
  • docker rm <容器名或ID>:删除容器(需先停止容器才能删除)。
  • docker version:查看 Docker 客户端和服务端的版本信息。
  • docker inspect <容器名或ID>:查看容器或镜像的详细信息(JSON 格式)。

7.3 容器生命周期与状态

容器主要有以下几种状态:

  1. Created:已创建但未启动。
  2. Up (Running):正在运行。
  3. Exited (Stopped):已停止。

容器的典型生命周期为:CreatedstartUp (Running)stopExited

注意:重启 Docker 服务(systemctl restart docker)会导致所有正在运行的容器停止。

7.4 实战:运行 Nginx 容器

Nginx 是一个高性能的 Web 服务器和反向代理服务器。

  1. 直接运行 Nginx 容器
docker run -d --name s-nginx-1 -p 8080:80 nginx

参数说明:

  • -d:让容器在后台运行(daemon 模式)。
  • --name s-nginx-1:为容器指定名称。
  • -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口(Nginx 默认端口)。
  • nginx:使用的镜像名称。

这条命令等价于依次执行:docker pull nginx(拉取镜像) + docker create --name s-nginx-1 nginx(创建容器) + docker start s-nginx-1(启动容器)。

  1. 仅创建容器而不启动
docker create --name s-nginx-1 nginx

执行后会返回一个唯一的容器 ID。

  1. 端口映射与容器访问

端口映射格式为 -p <宿主机端口>:<容器端口>。例如运行 MySQL 容器:

docker run --name s-mysql-3 -p 33061:3306 -e "MYSQL_ROOT_PASSWORD=s123456" mysql:8.4.6

这样外部客户端(如 MySQL 客户端)就可以通过宿主机的 33061 端口连接到容器内的 MySQL 服务。

  1. 进入容器内部
docker exec -it s-mysql-3 bash

参数说明:

  • -it:分配一个交互式终端。
  • bash:在容器内启动 bash shell。

进入容器后,可以像在普通 Linux 系统中一样执行命令。

  1. 从外部连接容器内的服务

例如,从另一台机器连接上面启动的 MySQL 容器:

mysql -h 192.168.72.132 -uroot -p's123456' -P 33061

参数说明:

  • -h:指定远程主机的 IP 地址。
  • -P:指定端口号(Port)。
  • -p:指定密码(password)。
  • -u:指定用户(user)。

7.5 关于 Socket 文件

Docker 守护进程(dockerd)通过 Socket 文件与客户端通信。Socket 是实现进程间通信(IPC)的一种方式:

  • Unix Domain Socket:用于同一台机器内不同进程之间的通信(如 /var/run/docker.sock)。
  • Network Socket:基于 IP 地址和端口号(如 192.168.72.132:22),用于网络通信。

8. RPM 与 YUM

在 CentOS/RHEL 系统中:

  • RPM (Red Hat Package Manager):底层的软件包管理命令,用于查询、安装、卸载单个 .rpm 文件。
  • YUM/DNF:高级的包管理工具,基于 RPM,能自动解决依赖关系并从配置的仓库中安装软件。

常用 RPM 命令:

rpm -q docker-ce          # 查询指定软件包是否安装
rpm -qa                   # 查询所有已安装的软件包
rpm -qi docker-ce         # 查询 docker-ce 软件的详细信息
rpm -ql docker-ce         # 列出 docker-ce 安装的所有文件
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐