admin 发布的文章

适配 CentOS/RHEL 系统,聚焦实战常用命令,可直接复制执行,新手友好、重点突出,避开冷门操作,适合日常查阅和服务器实操。

一、Docker 安装与启动(CentOS/RHEL)

# 1. 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 添加 Docker 官方源(国内可替换为阿里云源,更快速)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3. 安装 Docker CE(社区版,免费常用)
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 4. 启动 Docker 服务,并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 5. 验证安装是否成功(查看版本+运行测试镜像)
docker --version
docker run hello-world

✅ 说明:若国内下载镜像缓慢,可配置阿里云镜像加速器(下文有补充)。

二、镜像管理(Image)—— 容器的“模板”

2.1 搜索/拉取/查看镜像

# 搜索镜像(Docker Hub 官方仓库)
docker search nginx  # 搜索所有nginx相关镜像
docker search --filter is-official=true nginx  # 仅搜索官方镜像

# 拉取镜像(默认拉取 latest 最新版本)
docker pull nginx
docker pull nginx:1.25-alpine  # 指定版本(alpine版本更轻便,推荐)

# 查看本地已下载的镜像
docker images  # 等价于 docker image ls
docker images -q  # 仅显示镜像ID(方便批量操作)
docker images -a  # 显示所有镜像(含中间层镜像,一般用不到)

# 查看镜像详细信息(如镜像大小、构建历史、端口等)
docker inspect nginx:alpine

# 查看镜像的构建历史(了解镜像每层做了什么)
docker history nginx

2.2 镜像构建/标签/导出/导入/删除

# 从 Dockerfile 构建镜像(当前目录下,需提前创建Dockerfile)
docker build -t my-nginx:v1 .  # -t 给镜像打标签(名称:版本)

# 给镜像重新打标签(用于推送镜像到仓库、区分版本)
docker tag my-nginx:v1 username/my-nginx:v1  # username替换为自己的Docker Hub用户名

# 导出镜像为 tar 文件(用于备份、迁移)
docker save -o my-nginx.tar my-nginx:v1  # -o 指定输出文件

# 从 tar 文件加载镜像(迁移后恢复)
docker load -i my-nginx.tar  # -i 指定输入文件

# 删除镜像(需先删除依赖该镜像的容器,或用 -f 强制删除)
docker rmi nginx:1.25-alpine  # 删除指定版本
docker rmi -f $(docker images -q)  # 强制删除所有本地镜像(谨慎使用)

# 清理无用镜像(删除未被容器使用的镜像)
docker image prune  # 清理临时镜像(中间层)
docker image prune -a  # 清理所有未被使用的镜像(包括标签镜像)

三、容器管理(Container)—— 镜像的“运行实例”

3.1 运行容器(核心命令:docker run)

# 1. 基础运行(前台运行,退出终端则容器停止)
docker run -it nginx /bin/bash  # -it 交互模式,进入容器终端

# 2. 常用实战运行(后台+命名+端口映射)
docker run -d --name my-web -p 8080:80 nginx:alpine
# -d:后台运行(守护进程)
# --name:给容器命名(方便后续操作,避免记ID)
# -p:端口映射(宿主机8080端口 → 容器80端口)

# 3. 挂载目录(宿主机文件/目录 ↔ 容器,数据持久化)
docker run -d --name my-web -p 8080:80 -v /opt/html:/usr/share/nginx/html nginx
# -v:挂载目录(宿主机路径:容器路径),修改宿主机/opt/html内容,容器内同步生效

# 4. 设置环境变量+重启策略(适合数据库等服务)
docker run -d --name my-mysql -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \  # 环境变量:数据库root密码
  --restart=always \  # 重启策略:开机自启、容器崩溃自动重启
  mysql:8

# 5. 资源限制(限制容器使用的内存、CPU,避免占用过多服务器资源)
docker run -d --name my-web -m 512m --cpus 0.5 nginx
# -m:限制内存(512m = 512MB)
# --cpus:限制CPU(0.5 = 半核)

3.2 容器查看/进入/启停/删除

# 查看当前运行中的容器
docker ps

# 查看所有容器(含已停止的容器)
docker ps -a
docker ps -q  # 仅显示所有容器ID(批量操作常用)

# 进入运行中的容器(推荐用 exec,退出容器不影响容器运行)
docker exec -it my-web /bin/bash  # 大部分容器用 /bin/bash
docker exec -it my-web sh  # alpine 系统容器用 sh(无bash)

# 查看容器日志(排查容器运行错误、服务日志)
docker logs my-web  # 查看所有日志
docker logs -f my-web  # 实时跟踪日志(类似 tail -f)
docker logs -t --tail 100 my-web  # 显示时间戳 + 最后100行日志
docker logs --since 1h my-web  # 查看最近1小时的日志

# 容器启停/重启(常用操作)
docker start my-web  # 启动已停止的容器
docker stop my-web   # 停止运行中的容器(优雅停止)
docker restart my-web # 重启容器
docker kill my-web   # 强制终止容器(紧急情况使用)

# 删除容器(需先停止容器,或用 -f 强制删除运行中的容器)
docker rm my-web  # 删除指定已停止容器
docker rm -f my-web  # 强制删除运行中的容器
docker rm -f $(docker ps -aq)  # 强制删除所有容器(谨慎使用)

3.3 容器文件/网络/资源查看

# 宿主机 ↔ 容器 复制文件(双向复制)
# 宿主机 → 容器
docker cp index.html my-web:/usr/share/nginx/html/
# 容器 → 宿主机
docker cp my-web:/var/log/nginx/access.log ./

# 查看容器的端口映射情况(确认端口是否映射成功)
docker port my-web

# 查看容器占用的服务器资源(CPU、内存、网络等)
docker stats my-web  # 实时查看
docker stats --no-stream my-web  # 查看一次就退出

# 查看容器详细信息(IP、挂载、环境变量等)
docker inspect my-web

四、数据卷(Volume)—— 容器数据持久化(推荐)

⚠️ 区别于目录挂载:数据卷由Docker管理,更稳定,可跨容器共享,避免宿主机目录权限问题。

# 1. 创建数据卷
docker volume create my-vol

# 2. 查看数据卷(查看所有卷、卷详情)
docker volume ls
docker volume inspect my-vol  # 查看卷的存储路径等信息

# 3. 运行容器时挂载数据卷
docker run -d --name my-web -p 8080:80 -v my-vol:/usr/share/nginx/html nginx
# 数据卷 my-vol 挂载到容器的 /usr/share/nginx/html 目录

# 4. 删除数据卷(需先删除使用该卷的容器)
docker volume rm my-vol

# 5. 清理无用数据卷(删除未被容器使用的卷)
docker volume prune

五、网络管理(Network)—— 容器间通信

默认网络(bridge)可满足基本通信,自定义网络更安全、更灵活(推荐用于多容器协作)。

# 1. 创建自定义网络(默认 bridge 模式,最常用)
docker network create my-net

# 2. 查看网络(所有网络、网络详情)
docker network ls
docker network inspect my-net  # 查看网络中的容器、IP等

# 3. 将已运行的容器加入自定义网络
docker network connect my-net my-web

# 4. 运行容器时直接指定网络(推荐,容器间可通过容器名通信)
docker run -d --name my-db --network my-net mysql:8
# 此时 my-web 和 my-db 可通过容器名(my-web、my-db)互相访问

# 5. 断开容器与网络的连接
docker network disconnect my-net my-web

# 6. 删除自定义网络(需先断开所有容器连接)
docker network rm my-net

六、Docker Compose(多容器编排)

当需要同时运行多个容器(如 Nginx+MySQL+PHP)时,用 Compose 一键管理,无需逐个启动容器。

6.1 Compose 安装

# 下载 Compose(适配 Docker v2+,若已内置则直接用 docker compose)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给 Compose 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version  # 旧版本命令
docker compose version    # 新版本命令(推荐)

6.2 Compose 常用命令(需在 docker-compose.yaml 所在目录执行)

# 1. 启动所有服务(前台运行,退出终端则停止)
docker compose up

# 2. 后台启动所有服务(推荐,-d 守护进程;--build 重新构建镜像)
docker compose up -d --build

# 3. 停止并删除容器、网络(不删除数据卷)
docker compose down

# 4. 停止并删除容器、网络、数据卷(彻底清理)
docker compose down -v

# 5. 查看所有服务状态(容器运行情况)
docker compose ps

# 6. 查看指定服务的日志(实时跟踪)
docker compose logs -f web  # web 是 compose 文件中定义的服务名

# 7. 重启/停止/启动所有服务
docker compose restart
docker compose stop
docker compose start

# 8. 进入指定服务的容器
docker compose exec web /bin/bash  # web 是服务名

6.3 示例:docker-compose.yaml(Nginx+MySQL 多容器)

在任意目录创建 docker-compose.yaml 文件,粘贴以下内容,执行 docker compose up -d 即可一键启动。

version: '3.8'  # Compose 版本,与 Docker 版本匹配即可
services:
  # Nginx 服务
  web:
    image: nginx:alpine  # 镜像
    ports:
      - "8080:80"  # 端口映射
    volumes:
      - ./html:/usr/share/nginx/html  # 宿主机目录挂载(当前目录下的html文件夹)
      - ./nginx/conf:/etc/nginx/conf.d  # 挂载Nginx配置文件
    networks:
      - app-net  # 加入自定义网络
    restart: always  # 重启策略

  # MySQL 服务
  db:
    image: mysql:8  # 镜像
    environment:
      MYSQL_ROOT_PASSWORD: 123456  # root密码
      MYSQL_DATABASE: app_db  # 自动创建的数据库名
      MYSQL_USER: app_user  # 自动创建的用户
      MYSQL_PASSWORD: app_pass  # 用户密码
    volumes:
      - mysql-data:/var/lib/mysql  # 数据卷挂载(持久化数据库数据)
    networks:
      - app-net  # 加入自定义网络
    restart: always  # 重启策略

# 数据卷(持久化MySQL数据)
volumes:
  mysql-data:

# 自定义网络(容器间通信)
networks:
  app-net:
    driver: bridge

七、系统清理与状态查看

# 查看 Docker 系统信息(版本、镜像数量、容器数量、磁盘占用等)
docker info

# 查看 Docker 磁盘占用情况(镜像、容器、数据卷占用空间)
docker system df

# 一键清理(停止所有未运行容器、删除无用镜像、数据卷、网络)
docker system prune  # 基础清理
docker system prune -a  # 深度清理(删除所有未被使用的镜像,谨慎使用)
docker system prune -a --volumes  # 彻底清理(含数据卷,谨慎使用)

八、补充:国内镜像加速器(解决镜像拉取缓慢)

# 1. 创建/修改 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.mirrors.aliyun.com",  # 阿里云加速器(推荐)
    "https://hub-mirror.c.163.com",      # 网易加速器
    "https://mirror.baidubce.com"        # 百度加速器
  ]
}
EOF

# 2. 重启 Docker 服务,使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

# 3. 验证加速器是否生效(查看 Registry Mirrors 字段)
docker info

九、常见问题速查

  1. 容器启动失败:用 docker logs 容器名 查看日志,大概率是端口占用、环境变量错误、挂载目录权限问题。
  2. 镜像拉取失败:配置国内加速器,或检查网络,或指定具体版本(避免 latest 版本不稳定)。
  3. 容器无法访问:检查端口映射是否正确、网络是否连通(用 docker network inspect 查看)。
  4. 数据丢失:用数据卷(Volume)挂载,避免直接挂载宿主机目录,防止误删宿主机文件。
(注:文档部分内容可能由 AI 生成)

docker inspect typecho | grep Mounts -A 30