在Ubuntu 22.04(代号jammy)上部署Docker已经成为现代应用开发的标配操作。相比传统虚拟机方案,Docker的轻量化容器技术能让你的开发环境保持高度一致性——从本地笔记本到云服务器,所有依赖项都被打包成可移植的镜像。我亲历过多个项目因为环境差异导致的"在我机器上能跑"问题,而Docker彻底解决了这个痛点。
举个例子,上周团队新成员配置Python+PostgreSQL开发环境花了整整两天,而用Docker只需执行docker-compose up就能立即获得完全相同的环境。这种效率提升在微服务架构中更为明显——每个服务独立容器化,通过定义好的网络接口通信,彻底告别了"依赖地狱"。
虽然Docker对硬件要求不高,但建议生产环境至少:
在终端执行lsb_release -a确认系统版本为Ubuntu 22.04 jammy。我曾遇到用户误将20.04的安装教程用在22.04上导致依赖冲突,特别注意版本匹配。
即使是新系统也建议执行以下清理命令:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
sudo apt purge docker-ce docker-ce-cli containerd.io
残留的配置文件可能引发难以排查的权限问题。去年我在阿里云一台ECS上就遇到过因为旧版docker.io未彻底卸载导致docker.sock权限异常的情况。
不同于直接apt install,官方推荐通过仓库安装以保证获取最新稳定版:
bash复制sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
sudo mkdir -p /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
这里有几个易错点:
lsb_release -cs必须返回"jammy",如果显示其他值说明系统版本识别错误/etc/apt/keyrings需要手动创建(Ubuntu 22.04新增要求)更新并安装核心组件:
bash复制sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
组件作用说明:
docker-ce:主引擎docker-ce-cli:命令行工具containerd.io:容器运行时docker-compose-plugin:替代旧版docker-compose的官方插件重要提示:不要安装
docker-compose包,该独立版本已停止维护。应使用docker compose(带空格)命令调用插件版。
默认只有sudo能执行docker命令,这在实际开发中极不方便。正确做法是将用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效无需重启
验证权限:
bash复制docker run hello-world
如果看到"Hello from Docker!"说明安装成功。我曾遇到用户忘记执行newgrp导致权限不立即生效,误以为安装失败。
创建或修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启服务生效:
bash复制sudo systemctl restart docker
日志配置可防止容器日志爆满磁盘——这是生产环境常见故障点。
错误信息:
code复制The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX
解决方案:
bash复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXXXXXXXXXX
密钥指纹可在Docker官网文档找到。这个错误通常发生在网络不稳定时密钥下载不完整。
经典错误:
code复制Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
排查步骤:
sudo systemctl status dockerls -l /var/run/docker.sock(应显示组为docker)groups(应包含docker组)典型表现:
code复制net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
除了配置镜像加速器,还可以:
bash复制mkdir -p ~/.docker
echo '{"experimental":"enabled","features":{"buildkit":true}}' > ~/.docker/config.json
启用BuildKit能显著改善大镜像下载稳定性。
Docker默认存储路径/var/lib/docker会随时间膨胀,建议:
docker system prune -a --volumesoverlay2(默认)bash复制sudo sed -i 's/^ExecStart=.*/& --icc=false/' /lib/systemd/system/docker.service
bash复制export DOCKER_CONTENT_TRUST=1
bash复制docker scan <image-name>
创建reset-docker.sh:
bash复制#!/bin/bash
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker volume prune -f
这在调试复杂编排时非常有用,但切记不要在生成环境执行!
实时查看容器资源占用:
bash复制docker stats
生成资源使用报告:
bash复制docker run --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/nicolargo/glances
这个轻量级监控工具能显示所有容器的CPU/内存/网络指标。
在x86服务器构建ARM镜像:
bash复制docker buildx create --use
docker buildx build --platform linux/arm64 -t your-image:arm64 .
需要先启用QEMU模拟:
bash复制docker run --privileged --rm tonistiigi/binfmt --install all
经过三年在超过50台Ubuntu服务器上的Docker部署经验,我强烈建议将安装过程脚本化。下面这个Ansible Playbook片段可以自动化所有步骤:
yaml复制- name: Install Docker on Ubuntu 22.04
hosts: all
tasks:
- name: Install prerequisites
apt:
name: ["ca-certificates", "curl", "gnupg", "lsb-release"]
state: present
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /etc/apt/keyrings/docker.gpg
- name: Add Docker repository
apt_repository:
repo: "deb [arch={{ ansible_architecture }} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Install Docker packages
apt:
name: ["docker-ce", "docker-ce-cli", "containerd.io", "docker-compose-plugin"]
state: latest
update_cache: yes
- name: Add user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes