Skip to content

安装与基本操作

Docker 安装完成后,日常最先接触的是 Docker Engine、Docker CLI、containerd 和 Compose 插件。生产机器上走官方软件仓库是最稳的方式——版本升级、依赖管理、安全补丁都更容易持续维护。

官方仓库安装

Ubuntu 用 Docker 官方 apt 仓库:

bash
# 安装 HTTPS 仓库需要的基础工具
sudo apt-get update
sudo apt-get install -y ca-certificates curl

# Docker 官方 GPG key 放到 /etc/apt/keyrings,后面仓库配置引用这个路径
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# VERSION_CODENAME 自动取当前 Ubuntu 版本代号,避免写死版本号
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

# docker-compose-plugin 是 Compose v2,命令是 docker compose(中间没有横线)
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

RHEL / Rocky / CentOS 用 dnf 或 yum 加 Docker rpm 仓库:

bash
# dnf-plugins-core 提供 config-manager,用来管理 rpm 仓库
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

CentOS 7 等老系统用 yum:

bash
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

如果机器原来装过发行版自带的 dockerdocker.iopodman-docker,安装前要看清包来源。命令名一样不代表组件一致,后面排查 CLI、daemon、containerd 版本时很容易混。

启动并验证:

bash
sudo systemctl enable --now docker  # 开机自启并立即启动
sudo docker version                 # 同时看到 Client 和 Server 版本才算 daemon 正常
sudo docker run --rm hello-world    # 拉测试镜像,容器执行完自动删除

docker 组和权限

默认只有 root 能执行 Docker 命令。把用户加入 docker 组后可以不写 sudo

bash
sudo usermod -aG docker ops  # 重新登录后生效
id ops                       # 确认输出里包含 docker 组

docker 组基本等同于 root 权限——它能挂载宿主机目录、启动特权容器、访问 Docker socket。跳板机、共享服务器、生产机器上给这个权限要收口,不适合随手加给所有人。

关键路径和配置

路径说明
/usr/bin/dockerDocker CLI
/usr/bin/dockerdDocker daemon
/run/docker.sockDocker API socket
/etc/docker/daemon.jsondaemon 配置文件,镜像加速、日志驱动、存储路径都写在这里
/var/lib/docker镜像、容器可写层、volume、构建缓存——磁盘规划要单独考虑这个目录

查看服务状态:

bash
systemctl status docker --no-pager
journalctl -u docker -n 100 --no-pager  # daemon 日志
docker info                             # 存储驱动、root dir、cgroup、运行时等

镜像加速

国内机器直接拉 Docker Hub 镜像经常超时或速度很慢。/etc/docker/daemon.json 里配置 registry-mirrors,让 Docker Hub 镜像走加速源:

json
{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}

如果 daemon.json 已有其他配置(日志轮转、数据目录等),把 registry-mirrors 合并进去而不是覆盖。

bash
sudo systemctl restart docker
docker info | sed -n '/Registry Mirrors:/,/Live Restore Enabled:/p'  # 确认加速源已生效
docker pull nginx:1.26                                                # 验证拉取速度

registry-mirrors 只对 Docker Hub(docker.io)生效。GHCR、GCR、Quay 等仓库不受这个配置影响,需要通过对应加速前缀或内部仓库同步来解决。镜像加速源是外部服务,稳定性和可用性会变化;生产环境更适合准备内部 Harbor 或云厂商镜像仓库,外部加速源只作为拉取公共基础镜像的补充。

镜像的基本操作

bash
docker pull nginx:1.26             # 固定版本标签,避免 latest 指向变化
docker images nginx                # 查看本地已有镜像
docker image inspect nginx:1.26    # 元数据:架构、入口命令、环境变量、digest
docker search nginx                # 搜索远端仓库

生产里不建议用 latest 标签——今天拉到的和一个月后拉到的可能不是同一个内容,排查和回滚时追溯不了。基础服务优先用官方镜像或公司内部已验证的镜像,来源不明的镜像至少要看 Dockerfile、维护者、更新时间和漏洞扫描结果。

容器的基本操作

启动一个 Nginx 容器:

bash
docker run -d \
  --name web \
  -p 8080:80 \
  nginx:1.26
参数含义
-d后台运行
--name web指定容器名,后面查日志和进入容器都靠这个名字定位
-p 8080:80宿主机 8080 映射到容器 80
nginx:1.26镜像和版本

-p 8080:80 默认绑定所有地址。生产机器上如果只想给本机访问,写成 127.0.0.1:8080:80,避免测试服务意外暴露到公网。

验证:

bash
docker ps                       # 运行中的容器
curl -I http://127.0.0.1:8080/
docker logs web                 # 容器标准输出和标准错误

进入容器

bash
docker exec -it web sh          # 打开交互 shell
docker exec web nginx -t        # 在容器里执行一次性命令,不打开终端
docker top web                  # 容器内进程列表
docker stats web                # 实时 CPU、内存、网络、IO

很多精简镜像只有 sh 没有 bash,alpine 就是典型。进入容器前先确认镜像的基础系统和可用工具,别默认"进去就能用熟悉的命令"。

生命周期命令

bash
docker stop web      # 发送 SIGTERM,等容器进程退出
docker start web     # 启动已停止的容器,文件系统和配置还在
docker restart web   # 重启
docker rm web        # 删除已停止的容器
docker rm -f web     # 强制删除运行中的容器
docker ps -a         # 查看所有容器,包括已停止的

停止和删除是两步。容器停止后文件系统和网络配置还在,删除才彻底清理可写层。数据写在 volume 还是容器内部,决定了 docker rm 会不会丢数据。

常用排查命令

命令用途
docker ps -a看容器状态和退出码,是排查"容器为什么没在跑"的第一步
docker logs <容器>看标准输出,前提是应用把日志打到了 stdout/stderr
docker inspect <容器>看配置、网络、挂载、健康状态等全部元数据
docker eventsDocker 事件流——容器创建、停止、OOM 都在这里
docker stats实时资源使用,适合现场看,不适合长期留存
journalctl -u dockerdaemon 层面日志,容器日志看不到问题时看这里

容器启动失败时,顺序一般是:docker ps -a 看状态和退出码 → docker logs 看应用输出 → 如果日志为空,再看镜像入口命令、挂载路径、环境变量 → 最后看 daemon 日志。