Ubuntu 22.04 系统 Docker 部署与生产环境配置实战
1. 环境准备与Docker安装刚接触Docker的朋友可能会觉得它很神秘其实就像搬家时用的集装箱一样Docker把应用程序和它的运行环境打包成一个标准化的集装箱这样在任何地方都能保持一致的运行效果。在Ubuntu 22.04上安装Docker其实很简单但有几个关键步骤需要注意。首先确保你的系统是最新的打开终端输入sudo apt update sudo apt upgrade -y这个命令会更新软件包列表并升级所有可升级的软件。我遇到过不少问题都是因为系统没更新导致的所以这一步千万别偷懒。接下来要清理可能存在的旧版本Docker这点很重要因为残留的旧版本可能会导致各种奇怪的问题for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-doc containerd runc; do sudo apt-get remove $pkg done安装必要的依赖项后就可以添加Docker官方GPG密钥和软件源了。这里有个小技巧很多教程会直接让你用root权限操作但我建议先创建好目录再操作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 ar /etc/apt/keyrings/docker.asc添加软件源时要注意匹配你的系统版本Ubuntu 22.04的代号是jammyecho \ 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最后安装Docker引擎和常用插件sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装完成后建议立即测试一下是否正常工作sudo docker run hello-world如果看到Hello from Docker!的消息说明安装成功了。不过这时候每次运行docker命令都需要sudo很不方便我们稍后会解决这个问题。2. 生产环境关键配置2.1 配置国内镜像加速在国内使用Docker最大的痛点就是拉取镜像速度慢。我刚开始用时经常要等十几分钟下载一个基础镜像后来发现配置镜像加速能极大改善这个问题。编辑或创建配置文件sudo vim /etc/docker/daemon.json添加以下内容可以根据网络情况选择最合适的镜像源{ registry-mirrors: [ https://docker.m.daocloud.io, https://hub-mirror.c.163.com, https://mirror.baidubce.com, https://docker.nju.edu.cn ] }保存后重新加载配置sudo systemctl daemon-reload sudo systemctl restart docker测试镜像加速是否生效docker info | grep Mirrors -A 10这里有个小技巧不要把所有镜像源都加进去选择2-3个离你地理位置近的就行太多反而会影响速度。我实测下来163的镜像源在华东地区速度最快。2.2 用户权限管理每次都要用sudo运行docker命令不仅麻烦还存在安全隐患。正确的做法是把当前用户加入docker组sudo groupadd docker sudo usermod -aG docker $USER newgrp docker这样设置后当前用户就可以直接运行docker命令了。不过要注意docker组的用户实际上拥有root权限所以在生产环境中要谨慎管理。验证权限是否生效docker ps如果能看到容器列表而不是权限错误说明配置成功了。我在团队协作时遇到过权限问题就是因为新成员没被加入docker组导致各种Permission denied错误。2.3 图形界面支持如果你需要在Docker容器中运行GUI应用比如一些开发工具需要配置X11转发xhost local: echo xhost local:docker ~/.bashrc这样设置后容器内的GUI应用就能显示在主机桌面上了。我经常用这个功能来运行一些IDE工具效果和原生安装几乎没区别。3. 常用工具与生态集成3.1 Portainer可视化管理Portainer是Docker生态中最受欢迎的可视化管理工具之一特别适合刚接触Docker的用户。安装非常简单docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 --name portainer \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest安装完成后访问http://localhost:9000 就能看到管理界面。第一次使用需要设置管理员密码。Portainer最实用的功能是容器状态监控和日志查看。我经常用它来快速排查容器问题比命令行方便很多。它还支持模板部署可以一键部署常见应用如MySQL、Redis等。3.2 NVIDIA Docker支持如果你需要在Docker中使用GPU加速比如运行机器学习模型需要安装NVIDIA Docker支持distribution$(. /etc/os-release;echo $ID$VERSION_ID) \ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed s#deb https://#deb [signed-by/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker测试GPU是否可用docker run --rm --runtimenvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi这个功能对AI开发者特别有用。我团队训练模型时就用这个方案性能损失不到5%比虚拟机方案高效多了。4. 日常使用技巧与排错4.1 常用命令速查掌握这些命令能让你日常工作效率翻倍# 查看运行中的容器 docker ps # 查看所有容器包括停止的 docker ps -a # 启动/停止容器 docker start/stop 容器名 # 进入运行中的容器 docker exec -it 容器名 /bin/bash # 查看容器日志 docker logs -f 容器名 # 删除无用资源 docker system prune我建议把这些命令保存成备忘单刚开始用时经常记不住。特别是docker system prune能清理磁盘空间解决磁盘空间不足的常见问题。4.2 VSCode集成开发如果你用VSCode强烈推荐安装Docker插件和Dev Containers插件。它们能让你直接在容器中开发保持环境一致性。安装插件后在左侧活动栏点击Docker图标找到你的容器右键选择Attach Visual Studio Code新窗口打开后就能像本地开发一样工作了这种开发方式最大的好处是环境隔离。我团队现在所有项目都采用这种方式新人入职再也不用花半天配环境了。4.3 常见问题排查遇到Docker命令没反应时先检查服务状态sudo systemctl status docker如果服务挂了尝试重启sudo systemctl restart docker镜像拉取失败时可以尝试更换镜像源使用代理注意遵守相关规定手动下载镜像包再导入网络问题可以检查防火墙设置sudo ufw status我遇到过最棘手的问题是容器间网络不通最后发现是防火墙规则冲突。建议生产环境做好网络规划避免使用默认的bridge网络。