在当今的软件开发和运维领域,Docker已经成为不可或缺的基础设施工具。作为一名长期使用Ubuntu进行开发和部署的工程师,我深刻体会到Docker带来的变革。传统部署方式中,我们常常会遇到"在我机器上能跑"的经典问题——开发环境、测试环境和生产环境的不一致导致的各种诡异bug。Docker通过容器化技术完美解决了这个问题。
容器与虚拟机不同,它不需要模拟完整的操作系统,而是直接利用宿主机的内核,通过命名空间和控制组(cgroups)实现资源隔离。这意味着:
对于Ubuntu 22.04用户来说,Docker的安装过程相对简单,但实际操作中仍会遇到各种"坑"。下面我将分享经过数十次实践验证的完整安装流程和问题解决方案。
在开始安装前,必须确认你的Ubuntu系统满足以下要求:
uname -r查看)注意:虽然Ubuntu 20.04也可以安装Docker,但22.04提供了更好的兼容性和性能优化。如果你使用的是旧版系统,建议先升级。
由于众所周知的原因,国内访问Docker官方资源可能会遇到困难。在开始安装前,你应该:
bash复制ping mirrors.tuna.tsinghua.edu.cn -c 4
如果你之前安装过Docker或相关组件,强烈建议先彻底清理:
bash复制sudo apt remove --purge docker.io docker-compose docker-doc podman-docker containerd runc
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
这个步骤比原文中的命令更彻底,能避免残留配置导致的冲突。
bash复制sudo apt update
sudo apt upgrade -y
这个基础步骤经常被忽略,但能确保后续安装的依赖是最新的。
bash复制sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
这些是后续步骤的基础依赖,其中:
ca-certificates:SSL证书验证curl:网络请求工具gnupg:密钥管理lsb-release:获取系统版本信息bash复制sudo install -m 0755 -d /etc/apt/keyrings
这个目录将存储Docker的GPG密钥,权限设置为755确保安全。
针对国内网络环境,使用清华镜像站:
bash复制sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
关键参数解析:
-f:静默模式(不显示错误)-s:静默模式-S:显示错误-L:跟随重定向bash复制sudo chmod a+r /etc/apt/keyrings/docker.gpg
确保所有用户都能读取密钥文件。
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
命令拆解:
dpkg --print-architecture:获取系统架构lsb_release -cs:获取系统代号(如jammy)tee:同时输出到文件和控制台bash复制sudo apt update
bash复制sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
这些组件构成了完整的Docker环境:
docker-ce:Docker社区版docker-ce-cli:命令行工具containerd.io:容器运行时docker-buildx-plugin:多架构构建支持docker-compose-plugin:容器编排工具bash复制sudo docker version
正常输出应包含Client和Server两部分版本信息。
bash复制sudo systemctl enable --now docker
--now参数表示立即启动并设置开机自启。
bash复制sudo systemctl status docker
正常状态应为"active (running)"。
错误现象:
code复制curl: (7) Failed to connect to download.docker.com port 443: Connection timed out
解决方案:
bash复制sudo curl -fksSL http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
错误现象:
code复制Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
深度解决方案:
配置国内镜像加速器:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
重新加载配置:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置:
bash复制docker info | grep -A 1 "Registry Mirrors"
错误现象:
code复制Got permission denied while trying to connect to the Docker daemon socket
解决方案:
bash复制sudo usermod -aG docker $USER
bash复制groups
应显示包含docker组Ubuntu 22.04默认使用overlay2存储驱动,这是目前最稳定高效的选择。可以通过以下命令验证:
bash复制docker info | grep "Storage Driver"
如果需要修改,编辑/etc/docker/daemon.json:
json复制{
"storage-driver": "overlay2"
}
默认情况下,Docker容器日志会无限制增长。建议配置日志轮转:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
为防止单个容器占用过多资源,可以设置默认限制:
json复制{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
禁用root用户直接运行容器:
bash复制sudo groupadd docker-rootless
sudo usermod -aG docker-rootless $USER
dockerd-rootless-setuptool.sh install
启用内容信任:
bash复制export DOCKER_CONTENT_TRUST=1
使用更高效的网络驱动:
bash复制sudo apt install -y docker-ce-rootless-extras
配置自定义网络:
bash复制docker network create --driver=bridge --subnet=172.28.0.0/16 mynet
安装cAdvisor监控:
bash复制docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:v0.47.0
定期清理无用资源:
bash复制docker system prune -af
bash复制docker run --rm hello-world
成功输出应包含:
code复制Hello from Docker!
This message shows that your installation appears to be working correctly.
运行Nginx服务器:
bash复制docker run -d -p 8080:80 --name my-nginx nginx
验证:
bash复制curl http://localhost:8080
| 命令 | 描述 |
|---|---|
docker ps |
查看运行中的容器 |
docker images |
列出本地镜像 |
docker pull <image> |
拉取镜像 |
docker exec -it <container> bash |
进入容器 |
docker logs <container> |
查看容器日志 |
docker stats |
查看资源使用情况 |
Docker Compose:学习多容器编排
bash复制docker compose version
Dockerfile编写:掌握镜像构建
dockerfile复制FROM ubuntu:22.04
RUN apt update && apt install -y curl
CMD ["curl", "https://example.com"]
容器安全:了解镜像扫描、权限控制
Kubernetes基础:向容器编排进阶
在实际使用中,我发现Docker的学习曲线相对平缓,但深度使用时会遇到各种环境相关的问题。建议在开发环境中多尝试不同的配置方案,积累排错经验。对于生产环境,一定要提前做好性能测试和安全评估。