拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ubuntu服务器Docker安装与配置全指南:从基础到生产环境

1. 为什么在Ubuntu服务器上安装Docker是运维的必修课如果你刚接手一台崭新的Ubuntu服务器或者准备将本地开发环境迁移到云端那么安装Docker几乎是你需要执行的第一条命令。这听起来像是一句陈词滥调但背后有非常实际的考量。在服务器环境中我们追求的不仅仅是“能跑起来”而是稳定、可复现、易管理和资源隔离。传统的“apt-get install”方式安装应用虽然直接却带来了“依赖地狱”、环境冲突和“在我的机器上能跑”的经典难题。Docker通过容器化技术将应用及其所有依赖打包成一个标准化的单元从根本上解决了这些问题。对于服务器运维和开发部署而言在Ubuntu上安装Docker意味着你获得了一个强大的基础设施层。你可以用一条命令启动一个MySQL数据库其配置和数据卷与宿主机隔离不会影响系统已有的任何服务你可以快速部署一个用不同语言版本比如Python 3.8和3.11编写的微服务而无需担心系统级冲突更重要的是整个部署过程可以通过一个Dockerfile或docker-compose.yml文件描述实现真正的“基础设施即代码”。无论是单台服务器还是未来的服务器集群这种一致性都是无价的。因此掌握在Ubuntu服务器上纯净、正确地安装Docker是构建现代应用架构的基石。2. 安装前的关键决策版本、存储驱动与系统准备在运行安装脚本之前有几个关键决策点需要明确这些选择会直接影响后续使用的稳定性和性能。盲目执行网上搜到的第一条命令往往是后期各种诡异问题的根源。2.1 选择Docker源官方仓库 vs 系统默认仓库Ubuntu的默认APT仓库里通常也包含Docker包名为docker.io但强烈建议使用Docker官方提供的APT仓库。原因有三点一是版本更新更快能第一时间获得安全补丁和新功能二是软件包命名为docker-ce社区版其发布节奏和质量控制更规范三是避免了与系统旧版或衍生版本如docker.io可能发生的冲突。我们追求的是生产环境的可靠性因此从官方源安装是更稳妥的选择。2.2 理解存储驱动overlay2是默认且最佳选择Docker需要存储驱动来管理镜像和容器的分层文件系统。在Ubuntu上自内核版本4.0以上overlay2驱动已成为默认且推荐的选择。它相比旧的aufs或devicemapper驱动具有更好的性能、更稳定的表现以及更低的资源开销。在大多数情况下你不需要手动配置Docker安装程序会自动检测并选用overlay2。但了解这一点很重要因为如果你遇到奇怪的磁盘空间问题或性能瓶颈存储驱动将是首要排查方向之一。2.3 系统准备清理旧版本与内核检查这是一个容易被忽略但至关重要的步骤。如果系统上存在旧版本的Docker或称为docker、docker-engine、docker.io的包必须彻底清除否则会导致依赖冲突和安装失败。执行以下命令进行清理sudo apt-get remove docker docker-engine docker.io containerd runc注意这条命令执行后/var/lib/docker/目录下的镜像、容器、卷和网络配置通常会被保留。如果你是想全新安装或者旧环境有问题可以手动删除这个目录sudo rm -rf /var/lib/docker但务必确认其中没有你需要的数据。接下来检查内核版本和必要的模块uname -r确保内核版本高于4.0。然后加载overlay和br_netfilter内核模块并为IPv4转发和iptables桥接流量设置系统参数这些是Docker网络正常工作的基础sudo modprobe overlay sudo modprobe br_netfilter cat EOF | sudo tee /etc/modules-load.d/docker.conf overlay br_netfilter EOF cat EOF | sudo tee /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system3. 一步步详解Docker CE在Ubuntu上的安装流程现在进入核心的安装环节。我们将遵循Docker官方文档的推荐步骤确保过程清晰可复现。3.1 第一步安装必要的工具并添加Docker官方GPG密钥首先更新APT包索引并安装一些用于通过HTTPS使用仓库的工具sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release接着添加Docker官方的GPG密钥。这个密钥用于验证从Docker仓库下载的软件包的完整性是安全安装的保障。注意这里的密钥指纹可以通过官方渠道验证。sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg3.2 第二步设置稳定的Docker APT仓库根据你的Ubuntu发行版代号例如Ubuntu 22.04是jammy设置仓库。你可以通过lsb_release -cs命令自动获取代号。以下命令一次性完成仓库设置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这条命令做了几件事指定系统架构、指定用于验签的密钥环文件、指向Docker的Ubuntu稳定版仓库地址并将配置写入/etc/apt/sources.list.d/docker.list文件。这种将源文件分离管理的方式比直接修改/etc/apt/sources.list更清晰。3.3 第三步安装Docker引擎及相关组件更新APT包索引使其包含新添加的Docker仓库sudo apt-get update然后安装Docker引擎社区版、命令行工具docker-compose-plugin以及容器运行时containerd.iosudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin这里解释一下这几个包docker-ce: Docker引擎本身核心守护进程。docker-ce-cli: Docker命令行客户端用于执行docker命令。containerd.io: 行业标准的容器运行时Docker引擎在其之上运行。docker-compose-plugin: 这是Docker Compose的V2版本它作为一个Docker CLI插件安装使用命令是docker compose注意没有横杠。它比独立的Python版Compose更集成、性能更好。安装完成后Docker服务会自动启动。你可以通过以下命令验证sudo systemctl status docker你应该看到服务状态为active (running)。3.4 第四步以非root用户身份管理Docker关键步骤默认情况下docker命令需要root权限。每次都要输入sudo既麻烦又不安全因为这意味着docker命令拥有root权限。标准的做法是将你的普通用户添加到docker用户组中。sudo usermod -aG docker $USER执行此命令后必须完全退出当前终端会话并重新登录或者新开一个终端窗口用户组的更改才会生效。这是很多新手会卡住的地方——他们执行了命令但发现仍然需要sudo原因就是没有重新加载会话。验证是否成功docker run hello-world如果安装和配置正确这条命令会下载一个测试镜像并运行一个容器输出一段“Hello from Docker!”的信息。这标志着Docker已经成功安装并可以正常工作。4. 安装后的必须配置与优化调优安装成功只是第一步针对生产环境或长期使用的服务器以下几项配置能极大提升体验和安全性。4.1 配置国内镜像加速器从Docker Hub拉取镜像在境内可能速度缓慢甚至超时。配置一个国内镜像加速器是必选项。这里以阿里云镜像加速器为例你需要拥有阿里云账号在容器镜像服务中获取专属加速器地址。编辑或创建Docker守护进程配置文件sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://your_mirror.mirror.aliyuncs.com], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker } EOF将https://your_mirror.mirror.aliyuncs.com替换为你从阿里云控制台获取的实际地址。这个配置文件还做了其他几项重要设置native.cgroupdriversystemd: 对于使用systemd作为初始化系统的Ubuntu将cgroup驱动设置为systemd可以提高系统稳定性这也是Kubernetes的推荐配置。log-driver和log-opts: 限制容器日志文件的大小和数量避免日志占满磁盘。>sudo systemctl daemon-reload sudo systemctl restart docker4.2 管理Docker服务与开机自启在服务器上我们通常希望Docker随着系统启动而自动运行。sudo systemctl enable docker.service sudo systemctl enable containerd.service要检查是否已启用可以使用systemctl is-enabled docker。日常运维中你可能会用到这些命令sudo systemctl start docker: 启动。sudo systemctl stop docker: 停止会停止所有运行中的容器。sudo systemctl restart docker: 重启。sudo systemctl status docker: 查看状态和最新日志。4.3 磁盘空间管理预警Docker会持续占用磁盘空间镜像、容器、构建缓存。一个健康的习惯是定期检查并清理。以下是一些实用命令docker system df: 查看Docker磁盘使用概况。docker image prune -a: 删除所有未被容器使用的镜像加-a表示包括未被引用的镜像。docker container prune: 删除所有已停止的容器。docker system prune -a:谨慎使用一键清理所有未使用的镜像、容器、卷和网络。在生产环境执行前务必确认。我个人的经验是将/var/lib/docker挂载到一块独立的、容量较大的磁盘或分区上是一个非常好的实践可以避免Docker写满系统根分区导致服务器宕机。5. 从安装到实战验证与运行你的第一个容器安装和配置完成后我们通过几个实际操作来验证环境并感受Docker的便利。5.1 运行一个Nginx Web服务器让我们运行一个最常用的Web服务器来测试docker run -d --name my-nginx -p 8080:80 nginx:alpine-d: 后台运行detached mode。--name my-nginx: 给容器起个名字方便管理。-p 8080:80: 端口映射将宿主机的8080端口映射到容器的80端口。nginx:alpine: 使用基于Alpine Linux的Nginx镜像体积更小。运行后在浏览器访问http://你的服务器IP:8080就能看到Nginx的欢迎页面。通过docker ps可以查看运行中的容器docker logs my-nginx可以查看容器日志。5.2 使用Docker Compose部署一个简单应用栈Docker Compose V2我们安装的插件版允许你用YAML文件定义和运行多容器应用。创建一个docker-compose.yml文件version: 3.8 services: web: image: nginx:alpine ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: example_root_password MYSQL_DATABASE: myapp MYSQL_USER: myuser MYSQL_PASSWORD: mypassword volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:这个文件定义了一个包含Nginx和MySQL的服务栈并配置了数据卷。在文件所在目录只需执行docker compose up -d所有服务就会按定义启动。docker compose ps查看状态docker compose down停止并移除所有相关容器。这种“一键部署”的能力正是Docker在服务器上价值的体现。6. 高级话题与故障排查指南即使按照标准流程操作你也可能遇到一些问题。这里总结几个常见场景及其解决方案。6.1 安装失败依赖冲突或GPG密钥错误如果在sudo apt-get update时遇到GPG密钥错误可能是网络问题导致密钥下载不完整或仓库配置有误。可以尝试重新下载密钥或者暂时忽略签名检查不推荐长期使用sudo rm /etc/apt/keyrings/docker.gpg # 重新执行添加密钥和仓库的步骤如果遇到依赖冲突比如系统中有其他软件包要求特定版本的containerd可以尝试先单独安装containerd.io或者使用apt-cache policy命令查看可用的版本选择兼容的版本进行安装。6.2 运行权限问题用户组未生效或/var/run/docker.sock权限执行docker ps时如果提示“权限被拒绝”首先确认你是否已重新登录终端。如果问题依旧检查/var/run/docker.sock文件的权限ls -l /var/run/docker.sock其所属组应为docker。如果不是可以手动修正但重启后可能恢复这通常意味着服务启动时用户组配置有问题sudo chown root:docker /var/run/docker.sock最根本的解决办法是确保docker服务在启动时正确识别了docker用户组这通常由安装包自动配置好。6.3 镜像拉取失败网络超时或TLS证书问题如果配置了镜像加速器后仍然拉取很慢或失败首先用docker info命令检查Registry Mirrors配置是否生效。如果未生效检查/etc/docker/daemon.json文件格式是否正确必须是合法的JSON然后重启Docker。对于某些企业内部镜像仓库或自签证书的仓库可能需要配置Docker信任该仓库的CA证书。将CA证书文件如ca.crt放入/etc/docker/certs.d/your.registry.com/目录下然后重启Docker。6.4 容器无法连接到外部网络或宿主机如果容器内部无法访问互联网或宿主机服务首先检查宿主机是否开启了IP转发我们在准备阶段已设置net.ipv4.ip_forward1。然后检查Docker的网络配置特别是iptables规则是否被其他防火墙软件如ufw干扰。在Ubuntu上如果你使用了ufw需要允许Docker的网桥流量sudo ufw allow from 172.17.0.0/16假设Docker默认网桥是172.17.0.0/16可以用docker network inspect bridge查看7. 生产环境下的安全与维护考量在个人开发机上安装Docker可以随意一些但在服务器上尤其是面向公网的生产服务器安全必须放在首位。7.1 非Root用户运行Docker守护进程高级虽然不常见但你可以配置Docker守护进程以非root用户运行这能进一步降低攻击面。但这需要更复杂的设置包括处理/var/run/docker.sock的权限和可能的数据目录迁移通常仅在极高安全要求的环境下考虑。7.2 定期更新与漏洞扫描Docker引擎和镜像本身也可能存在漏洞。务必定期更新sudo apt-get update sudo apt-get upgrade docker-ce docker-ce-cli containerd.io docker-compose-plugin对于镜像应定期拉取新版本的基础镜像并重建你的应用镜像。可以使用docker scan命令需要Docker Hub账号或集成第三方漏洞扫描工具如Trivy、Clair到你的CI/CD流程中对镜像进行安全扫描。7.3 资源限制与监控默认情况下容器可以使用宿主机的所有资源。为防止某个容器耗尽资源导致系统不稳定应在运行容器时设置资源限制docker run -d --name my-app --memory512m --cpus1.5 my-app-image同时建议部署监控系统如Prometheus Grafana配合cAdvisor或Node Exporter来监控服务器和容器的资源使用情况CPU、内存、磁盘、网络做到事前预警。7.4 日志与审计确保容器日志被妥善收集和轮转我们在daemon.json中已配置。对于生产环境应考虑将容器日志集中收集到如ELKElasticsearch, Logstash, Kibana或Loki等日志系统中便于检索和分析。此外启用Docker守护进程的审计日志记录所有Docker API的调用对于安全事件追溯至关重要。在Ubuntu服务器上成功安装和配置Docker远不止是执行几条命令。它意味着你为这台服务器引入了一套现代化的应用封装、分发和运行标准。从最初的系统准备、源的选择到安装后的镜像加速、用户权限管理再到生产级别的安全与维护考量每一步都蕴含着对稳定性、效率和安全的权衡。我个人的体会是越是基础的环节越值得投入时间理解透彻。一个扎实的Docker基础环境能让你在后续部署微服务、搭建CI/CD流水线、甚至探索Kubernetes时更加得心应手避免很多因环境差异导致的“玄学”问题。把这份安装指南作为你的检查清单下次面对新的Ubuntu服务器时你就能自信地快速搭建出一个可靠且高效的容器化基础平台。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门