引言
在服务器运维的日常工作中,环境不一致、依赖冲突、部署繁琐是三大经典痛点。同一套应用,在开发机上运行正常,上了生产服务器却报错;一台机器上要同时跑 PHP 7 和 PHP 8,还要避免扩展库互相打架。这些问题归根结底,都是因为应用与系统环境强耦合。Docker 容器技术正是为解决这些问题而生:它把应用及其依赖打包进一个标准化的镜像里,做到”一次构建、处处运行”,让部署从”手工配环境”变成”拉镜像、起容器”两条命令。
在 Ubuntu 上部署和运维 Docker,是每一位 Linux 运维工程师的必修课。本文将从 Docker 的安装开始,系统讲解镜像管理、容器生命周期、网络与数据卷等核心内容,并通过大量可复制的命令,帮助你快速上手 Docker 容器运维。

一、核心概念
在动手之前,先理清三个关键概念:镜像(Image)、容器(Container)和仓库(Registry)。
- 镜像(Image):一个只读的模板,包含了运行应用所需的操作系统、依赖库、环境变量和启动命令。镜像采用分层存储,每一层都是只读的,多个镜像可以共享底层的层,从而节省磁盘空间。
- 容器(Container):镜像的运行实例。容器在镜像的只读层之上叠加一个可写层,应用运行时对文件系统的修改都写在这个可写层里。容器可以被创建、启动、停止、删除。
- 仓库(Registry):存储和分发镜像的服务,Docker Hub 是最常用的公共仓库,企业内部也常搭建私有仓库(Harbor、Registry)。
容器与虚拟机最大的区别在于:虚拟机虚拟出一整套硬件和操作系统内核,资源开销大、启动慢;而容器直接共享宿主机的 Linux 内核,只做进程和命名空间层面的隔离,因此启动速度可以达到秒级,资源占用也低得多。
二、Ubuntu 安装 Docker
2.1 卸载旧版本并安装依赖
首先更新软件源并安装必要的依赖包,同时卸载可能存在的旧版本(如 docker、docker.io、docker-engine)。
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# 卸载可能存在的旧版本
sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
2.2 配置官方 APT 源
使用 Docker 官方 GPG 密钥和 apt 源,保证安装的是最新稳定版本。
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
2.3 安装 Docker 引擎与 Compose 插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.4 配置普通用户免 sudo 与开机自启
安装完成后,把当前用户加入 docker 组,并设置 Docker 服务开机自启。
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# 重新登录后生效,或临时切换用户组
newgrp docker
验证安装结果:
docker --version
sudo docker run hello-world
三、镜像管理实战
3.1 拉取与查看镜像
镜像默认从 Docker Hub 拉取。docker pull 可以指定仓库、名称和标签(tag)。
# 拉取 nginx 官方镜像的 latest 标签
docker pull nginx
# 拉取指定版本
docker pull nginx:1.25-alpine
# 查看本地所有镜像
docker images
# 查看镜像详细信息(分层、环境变量、暴露端口等)
docker inspect nginx:latest
3.2 构建自定义镜像
运维经常需要把应用打包成自己的镜像。下面是一个简单的 Dockerfile 示例,用于构建一个运行静态页面的 Nginx 镜像。
# 基于官方 nginx 镜像
FROM nginx:1.25-alpine
# 维护者信息
LABEL maintainer="ops@stellardata.top"
# 拷贝本地文件到镜像内
COPY index.html /usr/share/nginx/html/index.html
# 暴露 80 端口
EXPOSE 80
# 容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
构建并打标签:
docker build -t my-web:v1 .
docker tag my-web:v1 my-web:latest
3.3 清理无用镜像
随着频繁构建,本地会积累大量无标签的悬空镜像(dangling),定期清理可以释放磁盘空间。
# 查看悬空镜像
docker images -f dangling=true
# 清理悬空镜像
docker image prune -f
# 清理所有未被容器引用的镜像
docker image prune -a -f
四、容器生命周期管理
容器的生命周期可以概括为:创建(create)→ 启动(start)→ 运行(running)→ 停止(stop)→ 删除(rm),其中 docker run 是”创建并启动”的组合命令。
# 后台运行一个 nginx 容器,映射宿主机 8080 到容器 80
docker run -d --name web1 -p 8080:80 nginx:1.25-alpine
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 进入容器内部执行命令
docker exec -it web1 /bin/sh
# 查看容器实时日志
docker logs -f web1
# 停止容器
docker stop web1
# 重新启动已停止的容器
docker start web1
# 删除容器(需先停止)
docker rm web1
一条命令同时清理所有已停止的容器:
docker container prune -f
五、数据卷与端口映射
容器是无状态的,删除后容器内的数据会一并丢失。对于需要持久化的数据(数据库、上传文件、日志),必须使用数据卷(Volume)或绑定挂载(Bind Mount)。
# 创建具名数据卷
docker volume create dbdata
# 运行 MySQL,将数据挂载到数据卷
docker run -d --name mysql
-e MYSQL_ROOT_PASSWORD=secret
-v dbdata:/var/lib/mysql
-p 3306:3306
mysql:8.0
# 查看数据卷
docker volume ls
docker volume inspect dbdata
数据卷与绑定挂载的核心区别在于:数据卷由 Docker 管理,存放在 /var/lib/docker/volumes/ 下;绑定挂载则直接使用宿主机上的某个目录。生产环境中数据库等场景推荐使用数据卷。
六、常见问题与排障
6.1 端口被占用
启动容器时若报 port is already allocated,说明宿主机端口已被占用,先排查占用进程再调整映射。
sudo lsof -i :8080
# 改用其他宿主机端口
docker run -d --name web2 -p 9090:80 nginx
6.2 容器内无法访问网络
如果容器内部无法访问外网,先检查宿主机的 IP 转发是否开启。
sudo sysctl net.ipv4.ip_forward
# 若为 0,临时开启
sudo sysctl -w net.ipv4.ip_forward=1
# 永久生效写入 /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
6.3 镜像拉取缓慢
国内网络环境拉取 Docker Hub 镜像可能较慢,可以配置镜像加速器,编辑 /etc/docker/daemon.json:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
修改后重启 Docker 服务使其生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
总结
本文围绕 Docker 容器运维的核心链路展开:从 Ubuntu 上安装 Docker 引擎,到镜像的拉取、构建与清理,再到容器的创建、启动、停止、删除全生命周期管理,最后介绍了数据卷持久化与常见排障方法。掌握这些基础命令后,你已经能够独立完成单机 Docker 环境下的应用部署与日常运维。
Docker 的能力远不止于此:多容器应用如何编排?服务之间如何依赖和通信?下一篇文章将进入 Docker Compose 的世界,用一份 YAML 文件优雅地管理整套微服务架构,敬请期待。
下期预告
下一期《Ubuntu 运维系列 | 第 21 天:Docker Compose 与容器编排实战》将带你学习如何使用 docker-compose.yml 定义多容器应用、管理服务依赖、配置网络与数据卷,以及生产环境中的 Compose 最佳实践。不见不散!
















暂无评论内容