跳转到内容

Docker 安装与使用

Docker 官方提供了适用于企业级 Linux 的软件仓库。以下步骤适用于 RHEL、CentOS Stream、AlmaLinux、Rocky Linux 等 EL 系发行版。

Terminal window
# 安装 DNF 插件(提供 config-manager)
sudo dnf install -y dnf-plugins-core
# 添加 Docker 官方仓库
sudo dnf config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装 Docker Engine、CLI 和容器运行时:

    Terminal window
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  2. 启动 Docker 并设置开机自启:

    Terminal window
    sudo systemctl enable --now docker
  3. 验证安装:

    Terminal window
    sudo docker version
    sudo docker run hello-world
  4. (可选)将当前用户加入 docker 组,避免每次使用 sudo:

    Terminal window
    sudo usermod -aG docker $(whoami)

    退出并重新登录后生效。

Terminal window
# 从 Docker Hub 拉取镜像
docker pull nginx:latest
docker pull almalinux:9
# 搜索镜像
docker search mariadb
# 查看本地镜像
docker images
Terminal window
# 前台运行,退出后自动删除
docker run --rm -it almalinux:9 /bin/bash
# 后台运行 Nginx
docker run -d --name my-nginx -p 80:80 nginx:latest
# 带环境变量和卷挂载运行 MariaDB
docker run -d --name my-db \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_password \
-v /data/mysql:/var/lib/mysql \
mariadb:10.11
Terminal window
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看容器日志
docker logs my-nginx
docker logs -f --tail 100 my-nginx
# 查看容器详细信息
docker inspect my-nginx
# 查看容器资源使用
docker stats
Terminal window
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 重启容器
docker restart my-nginx
# 删除已停止的容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
# 删除所有已停止的容器
docker container prune
# 删除未使用的镜像
docker image prune -a
Terminal window
# 以交互终端进入容器
docker exec -it my-nginx /bin/bash
# 在容器中执行命令
docker exec my-nginx nginx -t

Docker Compose 用于定义和管理多容器应用。Docker CE 安装时自带 docker compose 子命令(V2 版本)。

创建 docker-compose.yml

services:
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html:ro
- certbot_data:/etc/letsencrypt:ro
depends_on:
- app
restart: unless-stopped
app:
build: ./app
expose:
- "8000"
environment:
- DATABASE_URL=mysql://root:changeme@db:3306/myapp
depends_on:
- db
restart: unless-stopped
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
db_data:
certbot_data:
Terminal window
# 启动所有服务(后台)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 仅查看某个服务的日志
docker compose logs -f app
# 重新构建并启动
docker compose up -d --build
# 停止所有服务
docker compose down
# 停止并删除数据卷
docker compose down -v
# 扩展服务实例数
docker compose up -d --scale app=3
FROM almalinux:9-minimal
RUN microdnf install -y python3 python3-pip && \
microdnf clean all
WORKDIR /app
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
USER 1001
CMD ["python3", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Terminal window
# 构建镜像
docker build -t my-app:v1 .
# 给镜像打标签
docker tag my-app:v1 registry.example.com/my-app:v1
# 推送到私有仓库
docker push registry.example.com/my-app:v1

Docker 在 EL 系统上默认使用 overlay2 存储驱动,这是推荐的选项。

Terminal window
docker info | grep "Storage Driver"

编辑或创建 /etc/docker/daemon.json

{
"storage-driver": "overlay2",
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"registry-mirrors": [
"https://mirror.example.com"
]
}

重启 Docker 使配置生效:

Terminal window
sudo systemctl restart docker

如需将 Docker 数据从默认的 /var/lib/docker 迁移到新位置:

  1. 停止 Docker:

    Terminal window
    sudo systemctl stop docker
  2. 复制现有数据:

    Terminal window
    sudo rsync -aP /var/lib/docker/ /data/docker/
  3. /etc/docker/daemon.json 中设置 data-root

    {
    "data-root": "/data/docker"
    }
  4. 启动 Docker 并验证:

    Terminal window
    sudo systemctl start docker
    docker info | grep "Docker Root Dir"
  5. 确认一切正常后,删除旧目录:

    Terminal window
    sudo rm -rf /var/lib/docker

Docker 会自行管理 iptables 规则。如果使用 firewalld,需要注意以下事项:

Terminal window
# 允许容器间通信
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --reload
Terminal window
# 查看 Docker 磁盘使用
docker system df
# 全面清理未使用资源
docker system prune -a --volumes
# 导出容器为镜像
docker commit my-nginx my-nginx-backup:latest
# 导出/导入镜像文件
docker save -o nginx-backup.tar nginx:latest
docker load -i nginx-backup.tar