恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Ubuntu 22.04 Docker安装与镜像加速配置实战指南
首页
资讯中心
/
Ubuntu 22.04 Docker安装与镜像加速配置实战指南
Ubuntu 22.04 Docker安装与镜像加速配置实战指南
发布时间:2026/8/16 23:45:35
1. 项目概述从零到一搞定Docker环境与镜像加速如果你是一名开发者或者正在学习运维、数据科学甚至是搞点个人项目那么“Docker”这个词你肯定不陌生。它就像一个标准化的集装箱把你的应用和它运行所需的一切环境代码、运行时、系统工具、系统库、设置打包在一起确保在任何地方都能以相同的方式运行。这解决了“在我机器上能跑到你那就出问题”的经典难题。今天要聊的就是把这个强大的工具请到你的电脑上并且让它“跑”得更快。整个过程我会以在Ubuntu 22.04 LTS系统上安装Docker CE社区版为例并配置国内镜像加速器最后拉取一个具体的镜像比如ubuntu:22.04来验证。无论你是刚接触Linux的小白还是想优化现有工作流的老手这篇手把手的指南都能帮你绕过我踩过的那些坑。2. 核心需求解析为什么我们需要Docker和镜像加速在动手之前我们先花几分钟搞清楚两个核心问题为什么要用Docker以及为什么需要镜像加速这能让你在后续操作中每一步都心里有数。2.1 Docker的价值不仅仅是“隔离”很多人把Docker简单理解为轻量级虚拟机这其实不太准确。虚拟机VM模拟的是完整的操作系统包括内核因此资源占用大、启动慢。而Docker容器共享主机操作系统的内核只是在用户空间实现了隔离。这就好比VM是建了一栋完整的房子包括地基而Docker是在一栋大楼主机系统里租用了一间设施齐全、自带独立水电表的公寓。它的核心价值在于环境一致性开发、测试、生产环境的高度统一杜绝了“环境依赖”问题。快速部署与扩展镜像一旦构建完成可以在秒级启动无数个完全相同的容器非常适合微服务架构和弹性伸缩。更高的资源利用率相比VM容器几乎没有额外开销能在一台主机上运行更多应用实例。简化配置将环境配置固化在Dockerfile中基础设施即代码。2.2 镜像加速的痛点从“龟速”到“飞驰”Docker镜像默认从Docker Hub这个公共仓库拉取。对于国内用户来说直接从海外拉取镜像速度慢、不稳定动辄几KB/s的速度一个几百MB的基础镜像可能就要下载半小时甚至经常超时失败。镜像加速器的作用就是在你和Docker Hub之间架设一个高速缓存节点。当你请求拉取镜像时请求会被重定向到国内的镜像站如阿里云、腾讯云、中科大等如果该站有缓存就直接高速返回如果没有它会帮你从Docker Hub拉取并缓存下来下次你再拉取就快了。这本质上是一个CDN内容分发网络的概念。3. 系统环境准备与Docker安装理论清楚了我们开始实战。我假设你使用的是一台干净的Ubuntu 22.04系统。其他Linux发行版步骤类似主要是包管理器的命令不同如CentOS用yumArch用pacman。3.1 清理旧版本与安装依赖在安装新版本之前确保系统里没有残留的旧版本Docker它们可能被称为docker,docker-engine,docker.io或containerd。sudo apt-get remove docker docker-engine docker.io containerd runc系统通常会提示这些包未被安装这是正常的。接着更新软件包索引并安装一些必要的工具这些工具允许apt通过HTTPS使用仓库。sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release注意ca-certificates是用于HTTPS连接的CA证书curl用于下载gnupg用于处理GPG密钥lsb-release用于获取系统发行版信息。缺少任何一个都可能导致后续步骤失败。3.2 添加Docker官方GPG密钥与软件源这是保证我们下载的Docker软件包来自官方、未被篡改的关键步骤。创建密钥环目录首先为Docker创建存放GPG密钥的目录。sudo mkdir -p /etc/apt/keyrings下载并导入GPG密钥从Docker官方下载GPG公钥并存入我们创建的目录。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg命令分解curl -fsSL-f失败时不显示HTTP错误-s静默模式-S显示错误-L跟随重定向。组合起来就是“安静地、完整地下载文件”。| sudo gpg --dearmor -o ...将下载的密钥流通过管道传递给gpg命令--dearmor将其从ASCII格式转换为二进制格式-o指定输出文件。设置稳定的软件仓库接下来告诉系统从哪里获取Docker软件包。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命令分解[arch$(dpkg --print-architecture)自动获取当前系统架构如amd64, arm64。signed-by/etc/apt/keyrings/docker.gpg指定验证软件包签名的密钥文件。https://download.docker.com/linux/ubuntuDocker官方APT仓库地址。$(lsb_release -cs)自动获取当前Ubuntu的代号如jammy for 22.04。sudo tee ... /dev/null将echo输出的内容写入指定文件/dev/null丢弃标准输出避免在终端显示。3.3 安装Docker引擎添加好源之后就可以安装Docker了。更新软件包列表让系统识别新添加的Docker仓库。sudo apt-get update安装Docker核心组件安装Docker引擎、命令行工具、容器运行时containerd以及插件。sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-ce: Docker社区版引擎。docker-ce-cli: Docker命令行工具。containerd.io: 行业标准的容器运行时Docker在其之上构建。docker-compose-plugin: 这是新的Docker Compose V2作为插件集成到docker命令中使用docker compose替代了旧的独立docker-compose命令。验证安装安装完成后运行一个测试容器来验证Docker是否正常工作。sudo docker run hello-world如果一切顺利你会看到一段“Hello from Docker!”的欢迎信息这表示Docker已成功安装并可以拉取和运行镜像。实操心得在sudo apt-get update时你可能会遇到类似“GPG error: ... The following signatures couldn‘t be verified because the public key is not available”的错误。这通常是因为密钥没有正确添加或源列表格式有误。请回头仔细检查添加GPG密钥和软件源的命令确保路径和命令完全正确。一个常见的排查方法是手动检查/etc/apt/sources.list.d/docker.list文件内容是否正确。4. 配置与管理非root用户权限与镜像加速默认情况下运行Docker命令需要sudo权限这很不方便。同时我们需要配置镜像加速来提升下载速度。4.1 允许非root用户运行Docker强烈推荐每次命令前加sudo不仅麻烦还可能引发一些脚本或工具的使用问题。解决方案是将当前用户加入docker用户组。创建docker用户组如果尚未存在安装Docker时通常会自动创建。sudo groupadd docker将当前用户加入docker组sudo usermod -aG docker $USER-aG-a表示追加-G指定要加入的组。这样不会影响用户已有的其他组身份。生效组权限重新登录系统或者运行以下命令使组更改立即在当前会话生效newgrp docker验证现在你应该可以直接运行docker命令而不需要sudo了。docker run hello-world重要警告将用户加入docker组等同于授予该用户root权限。因为Docker守护进程以root身份运行而docker组的成员可以命令守护进程执行任何操作。因此请仅在你信任的个人开发机器上这样做。在生产服务器或多人共享的环境中需要更精细的权限控制。4.2 配置国内镜像加速器这是提升体验的关键一步。国内常用的镜像加速器服务商有阿里云、腾讯云、网易云、中科大等。这里以阿里云镜像加速器为例因为它对个人开发者免费且稳定。获取专属加速器地址访问阿里云容器镜像服务控制台需要登录阿里云账号。在左侧菜单找到“镜像工具” - “镜像加速器”。你会看到一个专属于你的加速器地址格式类似https://xxxx.mirror.aliyuncs.com。每个用户的地址是唯一的。配置Docker DaemonDocker守护进程的配置文件决定了它的行为包括从哪里拉取镜像。编辑配置文件如果不存在则会创建sudo nano /etc/docker/daemon.json将以下内容写入文件将https://xxxx.mirror.aliyuncs.com替换为你自己的地址{ registry-mirrors: [https://xxxx.mirror.aliyuncs.com] }如果你想配置多个镜像源可以以数组形式添加Docker会按顺序尝试{ registry-mirrors: [ https://xxxx.mirror.aliyuncs.com, https://hub-mirror.c.163.com, https://mirror.baidubce.com ] }重启Docker服务并验证sudo systemctl daemon-reload # 重载systemd配置 sudo systemctl restart docker # 重启Docker服务 docker info # 查看Docker系统信息在docker info命令输出的最后部分你应该能看到Registry Mirrors:下面列出了你刚刚配置的加速器地址。踩坑记录修改daemon.json后必须执行systemctl daemon-reload再重启docker否则配置可能不生效。另外配置文件必须是合法的JSON格式哪怕多一个逗号都会导致Docker启动失败。可以使用sudo systemctl status docker查看服务状态如果失败用sudo journalctl -xe -u docker查看详细日志来排错。5. 核心操作实战镜像拉取、容器管理与示例应用环境配置妥当我们来玩点真的。通过一系列常用命令感受Docker的日常工作流。5.1 镜像Image基础操作镜像是容器的模板是一个只读的静态文件层集合。搜索镜像在Docker Hub上查找镜像。docker search ubuntu拉取镜像从仓库下载镜像到本地。:后面是标签Tag通常表示版本。docker pull ubuntu:22.04配置了镜像加速后这个下载速度会有质的飞跃。你可以通过观察下载进度条来直观感受。列出本地镜像docker images # 或使用新语法 docker image ls删除镜像删除不再需要的本地镜像以释放空间。docker rmi ubuntu:22.04 # 或 docker image rm ubuntu:22.04如果镜像有对应的容器存在即使容器已停止需要先删除容器才能删除镜像或者使用-f强制删除不推荐可能产生数据残留。5.2 容器Container生命周期管理容器是镜像的运行实例。运行容器最基本的运行命令。-it是两个参数-i保持标准输入打开-t分配一个伪终端。两者结合可以让我们进入容器的交互式Shell。docker run -it ubuntu:22.04 /bin/bash运行后你会进入容器内部的bash终端。可以执行ls,cat /etc/os-release等命令验证。输入exit退出容器容器也随之停止。在后台运行容器使用-d参数让容器在后台运行。docker run -d --name my_nginx nginx:latest--name给容器起一个有意义的名字否则Docker会随机分配一个。列出容器docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器包括已停止的停止、启动、重启容器docker stop my_nginx docker start my_nginx docker restart my_nginx进入正在运行的容器对于后台运行的容器可以使用exec命令进入。docker exec -it my_nginx /bin/bashexecvsattachdocker attach是附着到容器的主进程PID 1如果主进程是bash你exit会导致容器停止。而docker exec是在容器内新启动一个进程如bash你退出这个bash不会影响容器主进程。绝大多数情况推荐使用exec。查看容器日志docker logs my_nginx docker logs -f my_nginx # -f 参数可以持续跟踪日志输出类似 tail -f删除容器docker rm my_nginx # 删除已停止的容器 docker rm -f my_nginx # -f 强制删除运行中的容器5.3 实战示例运行一个Nginx Web服务器并映射端口让我们运行一个更实用的例子启动一个Nginx容器并将宿主机的端口映射到容器内。运行容器并映射端口docker run -d --name my_web -p 8080:80 nginx:latest-p 8080:80端口映射格式为主机端口:容器端口。意思是把宿主机的8080端口映射到容器内部的80端口Nginx默认监听80端口。验证打开浏览器访问http://你的服务器IP地址:8080。你应该能看到Nginx的欢迎页面。在宿主机上你也可以用curl测试curl http://localhost:8080。查看与修改容器内文件Nginx的默认HTML文件在容器内的/usr/share/nginx/html/index.html。我们可以用docker exec来查看或修改它。docker exec my_web cat /usr/share/nginx/html/index.html但是直接修改容器内的文件不是好实践因为容器一旦删除修改就丢失了。更好的方式是使用数据卷Volume或绑定挂载Bind Mount将宿主机的目录挂载到容器内。例如# 先停止并删除旧容器 docker stop my_web docker rm my_web # 创建宿主机目录并准备一个自定义的index.html mkdir -p ~/my_nginx_html echo h1Hello from My Custom Nginx Container!/h1 ~/my_nginx_html/index.html # 重新运行容器绑定挂载宿主机目录 docker run -d --name my_web -p 8080:80 -v ~/my_nginx_html:/usr/share/nginx/html nginx:latest现在刷新浏览器看到的就是你自定义的页面了。而且你在宿主机~/my_nginx_html/下对文件的任何修改都会实时反映在容器中。6. 进阶配置与Docker Compose初探单容器管理用命令行尚可但当应用由多个容器组成例如一个Web应用需要Web服务器、数据库、缓存时手动管理每个容器的运行参数就非常繁琐了。这时就需要Docker Compose。6.1 Docker Compose简介与安装Docker Compose是一个用于定义和运行多容器Docker应用的工具。它使用一个YAML文件默认名为docker-compose.yml来配置所有服务然后用一条命令就能启动所有服务。如果你按照前面的步骤安装了docker-compose-plugin那么Compose V2已经作为docker命令的一个子命令集成好了。你可以通过docker compose version来验证。6.2 编写你的第一个docker-compose.yml我们来创建一个简单的Python Flask应用它使用Redis进行访问计数。创建项目目录和文件mkdir my_flask_app cd my_flask_app创建应用文件app.pyimport time import redis from flask import Flask app Flask(__name__) # 连接到名为‘redis’的容器这是Docker Compose提供的服务名解析 cache redis.Redis(hostredis, port6379) def get_hit_count(): retries 5 while True: try: return cache.incr(hits) except redis.exceptions.ConnectionError as exc: if retries 0: raise exc retries - 1 time.sleep(0.5) app.route(/) def hello(): count get_hit_count() return fHello World! I have been seen {count} times.\n if __name__ __main__: app.run(host0.0.0.0, debugTrue)创建依赖文件requirements.txtflask redis创建Dockerfile定义如何构建Flask应用的镜像。# 使用官方Python轻量级镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 声明容器运行时监听的端口 EXPOSE 5000 # 定义启动命令 CMD [python, app.py]创建核心文件docker-compose.ymlversion: 3.8 # 指定Compose文件格式版本 services: web: build: . # 使用当前目录下的Dockerfile构建镜像 ports: - 5000:5000 # 映射端口 depends_on: - redis # 声明依赖先启动redis # 环境变量可选 # environment: # - FLASK_ENVdevelopment redis: image: redis:alpine # 直接使用官方Redis镜像 # 数据持久化可选将Redis数据保存在命名卷中 # volumes: # - redis-data:/data # 定义顶级volumes如果上面启用了 # volumes: # redis-data:6.3 使用Docker Compose启动多容器应用在包含docker-compose.yml的目录下执行一条命令docker compose up -d-d表示在后台运行。Docker Compose会执行以下操作为项目创建一个独立的网络默认以目录名命名如my_flask_app_defaultweb和redis服务会加入这个网络并可以通过服务名web,redis互相访问。根据Dockerfile构建web服务的镜像。从镜像仓库拉取redis:alpine镜像。按依赖顺序启动容器先启动redis再启动web。现在访问http://localhost:5000每次刷新页面计数都会增加。这证明了Flask应用和Redis容器正在协同工作。常用Compose命令docker compose ps查看本项目下的容器状态。docker compose logs查看所有服务的日志。-f跟踪服务名查看特定服务。docker compose logs web只看web服务的日志。docker compose down停止并移除所有容器、网络默认保留卷。加-v会同时删除在docker-compose.yml中定义的匿名卷。docker compose build重新构建服务镜像。docker compose exec web /bin/bash进入web服务的容器。7. 日常维护、问题排查与性能优化Docker用起来之后日常维护和问题排查是必不可少的技能。7.1 资源监控与清理随着使用系统中可能会积累很多停止的容器、未被使用的镜像、网络和构建缓存占用大量磁盘空间。查看磁盘使用情况docker system df这个命令会清晰地列出镜像、容器、数据卷和构建缓存各占用了多少空间。一键清理谨慎使用docker system prune -a-a删除所有未被使用的镜像而不仅仅是悬空镜像。这个命令会删除所有已停止的容器、所有未被任何容器使用的网络、所有悬空镜像、所有悬空构建缓存。警告这会删除你所有停止的容器和未被引用的镜像包括可能有用的中间镜像。执行前请确认。更精细的清理docker container prune # 删除所有已停止的容器 docker image prune # 删除所有悬空镜像 docker image prune -a # 删除所有未被容器使用的镜像 docker volume prune # 删除未被使用的数据卷 docker network prune # 删除未被使用的网络7.2 常见问题与排查技巧这里记录几个我高频遇到的问题和解决方法。问题docker: Got permission denied while trying to connect to the Docker daemon socket.原因当前用户没有docker组的权限。解决参考4.1节将用户加入docker组并重新登录或执行newgrp docker。问题容器启动后立即退出Exited (0)排查首先查看容器日志docker logs 容器名/ID。通常是因为容器的主进程CMD或ENTRYPOINT指定的命令执行完毕并正常退出了。例如你运行了一个只执行echo hello的脚本脚本执行完容器自然就退了。解决对于需要长期运行的服务如Nginx、MySQL确保其主进程是前台运行的守护进程。对于交互式容器使用-it参数。也可以使用docker run -d ...让容器在后台运行。问题端口绑定失败Bind for 0.0.0.0:8080 failed: port is already allocated原因宿主机的8080端口已经被其他进程占用。排查使用sudo netstat -tulpn | grep :8080或sudo lsof -i :8080查看占用端口的进程。解决停止占用端口的进程或者为Docker容器映射另一个主机端口如-p 8081:80。问题镜像拉取失败或极慢报错net/http: TLS handshake timeout原因网络问题镜像加速器配置可能未生效或地址有误。排查运行docker info检查Registry Mirrors是否正确。尝试ping你的镜像加速器域名看是否通。检查/etc/docker/daemon.json文件格式是否正确JSON。解决确认加速器地址修正配置文件重启Docker服务。也可以尝试换一个镜像源。问题容器内无法连接外部网络如ping不通百度排查首先在宿主机上测试网络是否正常。然后进入容器测试ping 8.8.8.8。可能原因与解决DNS问题容器内/etc/resolv.conf的DNS服务器可能有问题。可以在运行容器时指定DNSdocker run --dns 8.8.8.8 ...或者修改Docker守护进程的DNS配置在/etc/docker/daemon.json中添加dns: [8.8.8.8, 114.114.114.114]。防火墙问题宿主机防火墙如ufw可能阻止了Docker的网络流量。可以尝试暂时禁用防火墙测试或为Docker添加规则。7.3 性能与安全基础建议镜像优化使用体积更小的基础镜像如alpine、slim版本。在Dockerfile中将不经常变化的层如安装依赖放在前面经常变化的层如复制应用代码放在后面充分利用构建缓存。合并RUN指令减少镜像层数并在最后清理apt缓存等临时文件。使用.dockerignore文件排除构建上下文中的无用文件减小镜像体积和构建时间。安全实践不要以root运行容器内进程在Dockerfile中使用USER指令切换到非root用户。定期更新镜像基础镜像和应用本身都可能存在安全漏洞定期docker pull更新到最新版本。限制资源使用--memory,--cpus等参数限制容器能使用的最大资源防止某个容器耗尽主机资源。扫描镜像可以使用docker scan命令需登录Docker Hub或第三方工具如Trivy、Clair对本地镜像进行安全漏洞扫描。8. 推荐学习路径与资源Docker生态庞大入门之后你可以沿着以下路径继续深入官方文档永远是最好、最权威的第一手资料。特别是“Get Started”和“Guide”部分。深入Dockerfile学习多阶段构建、ARG/ENV指令的区别、健康检查HEALTHCHECK等。数据持久化深入研究Docker Volume命名卷、匿名卷、绑定挂载的使用场景和最佳实践。容器网络理解Docker的bridge、host、none网络模式以及如何创建自定义网络让容器间通信。Docker Compose掌握更复杂的多服务编排环境变量管理资源限制配置等。容器编排当需要管理成百上千个容器 across multiple hosts时就需要Kubernetes (K8s) 或 Docker Swarm。这是进阶的必学方向。CI/CD集成学习如何将Docker集成到Jenkins、GitLab CI、GitHub Actions等持续集成/持续部署流程中。我个人习惯把常用的Docker命令和Compose配置片段保存在一个笔记里遇到复杂应用部署时参考之前的成功配置能节省大量时间。记住关键不是死记硬背所有命令而是理解每个操作背后的原理镜像层、联合文件系统、网络命名空间、cgroups等这样遇到新问题才能举一反三。从拉取第一个镜像到编排一个完整的多服务应用这个过程你会遇到很多报错但每一次解决问题的经历都会让你对这套技术的理解更深一层。