在Ubuntu 22.04(代号jammy)上部署Docker已经成为现代应用开发的标配操作。相比传统虚拟机方案,Docker容器通过共享宿主机内核的方式,实现了轻量级的进程隔离,这使得单个服务器可以运行数十个隔离的应用环境。我最早接触Docker是在2016年处理Python多版本冲突问题时,当时就被它"一次构建,处处运行"的特性所震撼。
以最常见的Web应用部署为例:传统方式需要手动安装Nginx、配置Python环境、处理依赖冲突,而使用Docker后,只需一个包含所有依赖的镜像文件,就能在任何支持Docker的机器上秒级启动完全一致的环境。根据2023年CNCF的调查报告,生产环境中Docker的使用率已突破89%,成为事实上的容器标准。
在开始安装前,建议先执行以下命令确保系统处于最新状态:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
这里有几个关键点需要注意:
apt-transport-https 允许apt通过HTTPS协议访问仓库(Docker官方源必须)ca-certificates 确保系统能验证SSL证书真实性bash复制sudo apt remove docker docker-engine docker.io containerd runc
Ubuntu 22.04默认使用5.15 LTS内核,完全支持Docker所需的所有功能。通过命令检查内核版本:
bash复制uname -r
# 预期输出类似:5.15.0-76-generic
存储驱动方面,对于新安装系统推荐使用overlay2,这是目前性能最稳定的驱动方案。可以通过以下命令确认当前驱动:
bash复制ls -l /var/lib/docker
Docker官方软件包需要验证签名,先添加GPG密钥:
bash复制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
sudo chmod a+r /etc/apt/keyrings/docker.gpg
重要提示:如果遇到"gpg: no valid OpenPGP data found"错误,通常是网络问题导致密钥下载不完整,可以尝试更换curl为wget或检查代理设置。
设置稳定版仓库(注意jammy对应的Ubuntu版本号):
bash复制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
执行更新使新源生效:
bash复制sudo apt update
安装最新版本的Docker套件:
bash复制sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证安装是否成功:
bash复制sudo docker run hello-world
如果看到"Hello from Docker!"的欢迎信息,说明基础环境已就绪。
默认情况下,只有root用户和sudo才能运行Docker命令。要将普通用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效无需注销
验证权限:
bash复制docker ps
如果不再提示"permission denied"即配置成功。
国内用户建议配置镜像加速器,创建或修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
重启服务使配置生效:
bash复制sudo systemctl restart docker
这是最常见的权限问题,可能原因包括:
sudo systemctl start docker$DOCKER_HOST是否被错误设置Docker默认存储目录/var/lib/docker空间不足的解决方案:
bash复制# 查看磁盘使用情况
docker system df
# 清理无用资源
docker system prune -a --volumes
如需修改默认存储位置,可创建软链接或修改daemon.json中的"data-root"参数。
端口冲突时的处理流程:
sudo netstat -tulnp | grep <端口号>sudo systemctl restart docker防止日志文件无限增长,编辑/etc/docker/daemon.json增加:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
禁用容器间的网络通信:
bash复制sudo nano /etc/docker/daemon.json
# 添加:"icc": false
启用用户命名空间隔离:
bash复制sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 dockremap
echo "dockremap:100000:65536" | sudo tee /etc/subuid /etc/subgid
安装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
访问http://localhost:8080即可查看容器资源使用情况。
bash复制docker version
# Client: Docker Engine - Community
# Version: 24.0.2
# API version: 1.43
先更新apt索引:
bash复制sudo apt update
查看可升级版本:
bash复制apt list --upgradable
指定升级Docker组件:
bash复制sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io
如果新版本出现问题,可以降级到特定版本:
bash复制sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION>
版本号可以通过apt-cache madison docker-ce查询。
Ubuntu 22.04推荐使用官方插件版:
bash复制sudo apt install docker-compose-plugin
验证安装:
bash复制docker compose version
# Docker Compose version v2.19.1
创建docker-compose.yml示例:
yaml复制version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
启动服务栈:
bash复制docker compose up -d
停止所有容器:
bash复制docker stop $(docker ps -aq)
删除已退出的容器:
bash复制docker rm $(docker ps -aq --filter status=exited)
清理悬空镜像:
bash复制docker image prune -f
进入运行中的容器:
bash复制docker exec -it <容器名> bash
查看实时日志:
bash复制docker logs -f --tail 100 <容器名>
复制文件到容器:
bash复制docker cp local_file.txt <容器名>:/path/in/container/
运行容器时限制内存使用:
bash复制docker run -it --memory="512m" --memory-swap="1g" ubuntu
限制容器使用的CPU核心:
bash复制docker run -it --cpus="1.5" ubuntu
绑定到特定CPU核心:
bash复制docker run -it --cpuset-cpus="0,1" ubuntu
限制块设备读写速率:
bash复制docker run -it --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb ubuntu
创建桥接网络:
bash复制docker network create --driver=bridge --subnet=172.28.0.0/16 my-net
查看网络详情:
bash复制docker network inspect my-net
随机映射主机端口:
bash复制docker run -d -p 80 nginx
查看实际映射端口:
bash复制docker port <容器ID>
将容器连接到自定义网络:
bash复制docker run -d --network=my-net --name=web nginx
docker run -it --network=my-net alpine ping web
创建命名卷:
bash复制docker volume create my-vol
挂载卷到容器:
bash复制docker run -d -v my-vol:/app/data nginx
挂载主机目录:
bash复制docker run -d -v /path/on/host:/path/in/container nginx
备份卷数据:
bash复制docker run --rm -v my-vol:/volume -v $(pwd):/backup alpine \
tar cvf /backup/backup.tar /volume
dockerfile复制# 构建阶段
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:latest
COPY --from=builder /app/myapp /
CMD ["/myapp"]
避免将不必要的文件加入镜像:
code复制**/node_modules
**/*.log
.git
使用docker scan检查漏洞:
bash复制docker scan my-image
运行本地registry:
bash复制docker run -d -p 5000:5000 --restart=always --name registry registry:2
推送镜像到私有库:
bash复制docker tag my-image localhost:5000/my-image
docker push localhost:5000/my-image
GitLab CI示例:
yaml复制build_image:
stage: build
script:
- docker build -t my-app .
- docker push my-registry/my-app
定期备份关键数据:
bash复制docker run --rm --volumes-from my-container -v $(pwd):/backup alpine \
tar cvf /backup/backup.tar /data