Appearance
安装与基本操作
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-pluginRHEL / 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-pluginCentOS 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如果机器原来装过发行版自带的 docker、docker.io、podman-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/docker | Docker CLI |
/usr/bin/dockerd | Docker daemon |
/run/docker.sock | Docker API socket |
/etc/docker/daemon.json | daemon 配置文件,镜像加速、日志驱动、存储路径都写在这里 |
/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 events | Docker 事件流——容器创建、停止、OOM 都在这里 |
docker stats | 实时资源使用,适合现场看,不适合长期留存 |
journalctl -u docker | daemon 层面日志,容器日志看不到问题时看这里 |
容器启动失败时,顺序一般是:docker ps -a 看状态和退出码 → docker logs 看应用输出 → 如果日志为空,再看镜像入口命令、挂载路径、环境变量 → 最后看 daemon 日志。