适用场景:什么时候需要把服务装进容器里
很多站长和中小企业运维都遇到过这样的场景:一台服务器上跑着网站、数据库、定时脚本,偶尔还要临时部署一个测试环境。每次新增服务都要重新配一遍环境,时间一长,系统里装了什么、改过哪些配置,连自己都说不清楚。Docker 容器正是为了解决这个问题:它把应用和依赖打包成独立的容器,互不干扰,随时可以启动、停止、删除或迁移。
这篇文章面向有一定 Linux 基础、但还没系统接触过容器化的读者。你不需要提前了解 Kubernetes,也不需要专门的容器服务器,一台普通的云主机(1 核 2G 起步即可)就能完成文中全部操作。下文以 Ubuntu/Debian 和 CentOS 两大主流发行版为例,从安装讲到日常使用,最后附上几个最常见的报错处理方法。
第一步:安装 Docker 引擎
官方推荐使用官方源安装最新版 Docker Engine,避免发行版仓库里版本过旧的问题。Ubuntu 系统可以先卸载旧版本,再配置官方 apt 源:
sudo apt-get update && sudo apt-get remove -y docker docker-engine docker.io containerd runc
然后安装依赖并添加官方 GPG 密钥与仓库(以 Ubuntu 为例,CentOS 用户请参考官方文档使用 dnf 源):
sudo apt-get install -y ca-certificates curl && 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
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
最后更新索引并安装:
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成后执行 sudo docker version,能看到 Client 和 Server 两段版本信息就说明引擎已经正常运行了。国内服务器如果拉取镜像缓慢,可以配置镜像加速地址(修改 /etc/docker/daemon.json 中的 registry-mirrors 字段),改完后执行 sudo systemctl restart docker 生效。
第二步:跑通第一个容器并理解核心概念
先用一条命令验证安装是否成功,这是 Docker 官方的经典入门示例:
sudo docker run hello-world
看到欢迎信息后,再部署一个实际有用的服务,比如 Nginx:
sudo docker run -d --name my-nginx -p 8080:80 nginx
这条命令包含四个关键点:-d 表示后台运行;--name 给容器起名,方便后续管理;-p 8080:80 把宿主机的 8080 端口映射到容器的 80 端口;最后的 nginx 是镜像名。执行 curl http://127.0.0.1:8080 能返回 Nginx 欢迎页就说明部署成功。
理解三个核心概念后再往下走会顺畅很多:镜像是只读模板,相当于安装包;容器是镜像的运行实例,可以随时创建和销毁;数据卷(volume)用来把容器内数据持久化到宿主机,例如 -v /data/nginx/html:/usr/share/nginx/html 就把网页目录挂到了宿主机的 /data 下。没有数据卷的容器,删除后里面的数据也会一起消失,这一点务必记住。

第三步:日常管理命令速查
容器跑起来之后,日常管理主要靠下面几条命令。查看正在运行的容器用 docker ps,加 -a 参数可以看到已停止的容器;进入容器内部排查问题用 docker exec -it my-nginx bash;查看容器日志用 docker logs -f my-nginx,加 --tail 100 可以只看最后 100 行。
停止和启动容器用 docker stop my-nginx 和 docker start my-nginx;彻底删除容器前必须先停止,再执行 docker rm my-nginx。清理无用镜像用 docker image prune,清理所有停止的容器、悬空镜像等冗余资源可以用 docker system prune——注意这条命令会删除所有已停止的容器,执行前务必确认没有需要保留的数据。
镜像管理方面,docker pull nginx:1.27 拉取指定版本镜像,docker images 查看本地镜像列表,docker rmi 镜像ID 删除镜像。建议始终使用带版本号的标签而不是 latest,避免日后升级时版本不可控。
第四步:用 Docker Compose 管理多容器应用
实际业务往往不止一个容器,比如网站加数据库的组合。逐条敲 run 命令既容易出错又不便维护,官方提供的 Compose 插件可以用一个 YAML 文件描述整套服务。在项目目录创建 docker-compose.yml:
services: web: image: nginx:1.27 ports: - "8080:80" db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 你的强密码 volumes: - db-data:/var/lib/mysqlvolumes: db-data:
在同一目录执行 sudo docker compose up -d 即可一键启动全部服务,sudo docker compose down 停止并删除容器(数据卷默认保留),sudo docker compose logs -f 查看所有服务日志。改完配置文件后执行 sudo docker compose up -d,Compose 会自动重建有变动的容器,其余服务保持不动。
需要注意,数据库密码这类敏感信息不建议直接写进 compose 文件并提交到 Git 仓库,可以用 .env 文件配合 env_file 字段加载,并把 .env 加入 .gitignore。
常见问题与处理方法
问题一:执行 docker 命令提示 permission denied。这是因为当前用户不在 docker 用户组里。官方做法是把用户加入 docker 组:sudo usermod -aG docker $USER,然后退出重新登录即可,不需要每次都加 sudo。注意 docker 组权限等价于 root,只应加给可信账号。
问题二:容器一启动就退出(docker ps 里看不到)。先用 docker logs 容器ID 看退出原因,多数是配置错误或依赖服务没就绪。另外 Docker 容器的前台进程结束时容器就会停止,如果镜像是靠手动命令拉起的,可以用 -d 加正确的常驻命令,或用 docker run --restart unless-stopped 让容器开机自启并异常后自动拉起。
问题三:宿主机访问不了映射的端口。按顺序排查三点:端口映射是否写对(docker port 容器名 确认);容器内服务是否监听在 0.0.0.0 而不是 127.0.0.1;宿主机防火墙或云厂商安全组是否放行了对应端口。修改安全组前请先评估业务影响,避免误开高危端口。
问题四:磁盘被 Docker 占满。长期运行后镜像、日志、悬空数据卷会持续累积。可以用 docker system df 查看占用明细,再用 docker system prune 清理。重要的数据卷删除后无法恢复,清理前建议先备份数据库和挂载目录。
总结
Docker 的价值在于把"环境"变成可复制、可迁移的标准件:安装引擎、跑通第一个容器、掌握 ps/exec/logs 等日常命令、用 Compose 编排多服务,这四步走完,你就可以把网站上零散的服务逐步容器化了。上手阶段建议从备份任务、监控探针这类无状态服务开始练手,核心业务迁移前务必先在测试环境验证并做好数据备份。遇到问题时,官方文档(docs.docker.com)永远是最可靠的参考。













暂无评论内容