1. 为什么选择Docker?
Docker作为当前最流行的容器化技术,已经成为开发者和运维人员的标配工具。相比传统虚拟机,Docker容器更加轻量级,启动速度更快,资源占用更少。在Ubuntu上使用Docker,可以轻松实现开发环境与生产环境的一致性,避免"在我机器上能跑"的尴尬情况。
我最初接触Docker是在2016年,当时为了解决多个Python项目依赖冲突的问题。传统方式需要在不同虚拟环境中来回切换,而使用Docker后,每个项目都可以拥有完全隔离的运行环境,大大提高了开发效率。
2. Ubuntu环境准备
2.1 系统要求检查
在安装Docker之前,建议先检查Ubuntu系统版本和内核信息:
lsb_release -a uname -rDocker CE支持以下Ubuntu版本:
- Ubuntu Jammy 22.04 (LTS)
- Ubuntu Impish 21.10
- Ubuntu Focal 20.04 (LTS)
- Ubuntu Bionic 18.04 (LTS)
注意:建议使用LTS(Long Term Support)版本以获得长期支持。我在生产环境中主要使用20.04和22.04版本。
2.2 卸载旧版本
如果你的系统上安装过旧版Docker,建议先彻底卸载:
sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd这个步骤可以避免新旧版本冲突问题。我曾经因为没彻底卸载旧版本导致端口映射失效,花了半天时间排查。
3. Docker安装详解
3.1 使用官方脚本安装
这是最简单快捷的安装方式:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh安装完成后,将当前用户加入docker组,避免每次都要sudo:
sudo usermod -aG docker $USER newgrp docker重要:需要注销重新登录或重启终端才能使组权限生效。这个细节经常被忽略,导致用户以为安装失败。
3.2 通过APT仓库安装
如果你更喜欢传统的包管理方式:
sudo apt-get update sudo apt-get 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 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin3.3 验证安装
安装完成后,运行测试容器验证:
docker run hello-world如果看到"Hello from Docker!"消息,说明安装成功。我第一次看到这个输出时,感觉特别有成就感。
4. Docker镜像管理实战
4.1 镜像基础操作
查看本地镜像列表:
docker images搜索Docker Hub上的镜像:
docker search ubuntu拉取镜像到本地:
docker pull ubuntu:22.04删除本地镜像:
docker rmi ubuntu:22.04技巧:使用
docker image prune可以清理未被任何容器引用的悬空镜像,释放磁盘空间。
4.2 镜像标签管理
给镜像打标签:
docker tag ubuntu:22.04 my-ubuntu:v1这个功能在构建自定义镜像时特别有用。我曾经管理过多个版本的Python应用镜像,通过标签可以清晰地区分不同版本。
4.3 镜像导出与导入
导出镜像为tar文件:
docker save -o ubuntu22.tar ubuntu:22.04从tar文件导入镜像:
docker load -i ubuntu22.tar这个功能在内网环境中特别实用。有一次客户现场没有外网,我就是通过预先导出的镜像文件完成了部署。
5. 容器生命周期管理
5.1 容器基本操作
运行容器:
docker run -it --name my-ubuntu ubuntu:22.04 /bin/bash查看运行中的容器:
docker ps查看所有容器(包括已停止的):
docker ps -a启动/停止/重启容器:
docker start my-ubuntu docker stop my-ubuntu docker restart my-ubuntu删除容器:
docker rm my-ubuntu5.2 容器与主机交互
从主机复制文件到容器:
docker cp host_file.txt my-ubuntu:/path/in/container/从容器复制文件到主机:
docker cp my-ubuntu:/path/in/container/file.txt host_file.txt这个功能在调试时非常有用。记得有一次应用在容器中运行异常,我就是通过复制日志文件出来分析解决了问题。
6. 数据持久化方案
6.1 挂载主机目录
docker run -v /host/path:/container/path ubuntu:22.04这种方式简单直接,适合开发环境。但要注意权限问题,容器内的进程可能没有权限访问主机目录。
6.2 使用数据卷
创建数据卷:
docker volume create my-vol使用数据卷:
docker run -v my-vol:/container/path ubuntu:22.04数据卷相比目录挂载有更好的性能,适合生产环境。我曾经对比测试过,在高IO场景下,数据卷的性能优势明显。
7. 网络配置技巧
7.1 端口映射
docker run -p 8080:80 nginx这样就将容器的80端口映射到主机的8080端口。注意如果主机端口小于1024,需要root权限。
7.2 自定义网络
创建自定义网络:
docker network create my-net使用自定义网络运行容器:
docker run --network=my-net ubuntu:22.04自定义网络可以提供更好的隔离性和灵活性。在多容器应用场景下,我通常会为每个项目创建独立的网络。
8. Dockerfile最佳实践
8.1 基础Dockerfile示例
FROM ubuntu:22.04 RUN apt-get update && apt-get install -y python3 pip COPY . /app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 8000 CMD ["python3", "app.py"]8.2 构建优化技巧
- 合理使用.dockerignore文件,避免不必要的文件被复制到镜像中
- 合并RUN指令减少镜像层数
- 使用多阶段构建减小最终镜像体积
- 固定基础镜像版本,避免自动更新导致的不一致
我曾经通过优化Dockerfile,将一个Python应用的镜像大小从1.2GB减小到不到300MB,大大提高了部署效率。
9. 常见问题排查
9.1 容器启动失败
检查容器日志:
docker logs container_name查看容器详细信息:
docker inspect container_name9.2 网络连接问题
检查容器网络配置:
docker network inspect bridge测试容器网络连通性:
docker exec -it container_name ping google.com9.3 存储空间不足
查看Docker磁盘使用情况:
docker system df清理无用资源:
docker system prune警告:这个命令会删除所有未被使用的资源,包括停止的容器、悬空镜像和网络等。执行前请确认。
10. 生产环境建议
- 使用非root用户运行容器
- 限制容器资源使用(CPU、内存)
- 配置日志轮转
- 定期更新基础镜像和安全补丁
- 使用编排工具管理多容器应用
在实际运维中,我曾经遇到过因为没限制容器内存导致主机OOM的情况。从那以后,我都会为每个容器设置合理的资源限制。