1. 项目概述:为什么在Ubuntu 22.04上拥抱Docker?

如果你是一名开发者、运维工程师,或者仅仅是技术爱好者,最近在Ubuntu 22.04 LTS上折腾环境时,大概率会听到“Docker”这个词。它就像一个魔法盒,能把你的应用及其所有依赖——从运行时、系统工具到库文件——打包成一个标准化的单元。这意味着,你再也不用在本地机器上为不同项目安装不同版本的Python、Node.js或者MySQL而头疼,也不用担心“在我机器上好好的,怎么到你那就跑不起来了”这种经典问题。

简单来说,Docker提供了一种轻量级的虚拟化方案,它不像传统虚拟机那样需要模拟整个操作系统,而是直接利用宿主机的内核,通过容器(Container)技术实现隔离。这带来的好处是启动速度极快、资源开销极小。在Ubuntu 22.04这个长期支持、稳定且性能优秀的Linux发行版上部署Docker,可以说是如虎添翼,无论是用于本地开发、测试,还是作为生产环境的基石,都是目前业界的标准做法之一。

我自己的经验是,自从在Ubuntu上系统性地使用Docker后,开发环境的搭建时间从以小时计缩短到了分钟级别,团队协作的摩擦也大大减少。这篇内容,就是为你梳理在Ubuntu 22.04 LTS上从零开始安装、配置到初步使用Docker的完整路径,并分享一些我踩过坑后才明白的实操细节。无论你是刚接触Linux的新手,还是想系统化自己Docker知识的老兵,都能从这里找到可操作的步骤和背后的逻辑。

2. 核心需求解析:我们到底需要Docker解决什么?

在动手安装之前,我们先花点时间想清楚,为什么是Docker,以及我们期望它带来什么。这能帮助你在后续的配置和选择中做出更明智的决定。

2.1 环境一致性与隔离性

这是Docker最核心的价值。想象一下,你正在开发一个基于Python 3.9和PostgreSQL 14的Web应用,而你的同事可能还在用Python 3.7和PostgreSQL 12。如果没有容器,你们要么统一开发环境(这往往很困难),要么各自维护一套复杂的虚拟环境,极易冲突。Docker容器将应用及其环境封装在一起,确保了从开发、测试到生产,应用运行的环境完全一致。每个容器都是相互隔离的沙箱,一个容器里的库版本更新不会影响到其他容器。

2.2 快速部署与弹性伸缩

传统部署应用,需要在新服务器上安装操作系统、配置环境、部署代码,流程繁琐。而使用Docker,你只需要将构建好的镜像(Image)拉到任何安装了Docker引擎的服务器上,一条命令即可运行。这对于微服务架构尤其重要,每个服务都可以独立打包、部署和伸缩。在云原生和DevOps实践中,Docker镜像是CI/CD(持续集成/持续部署)流水线中不可或缺的交付物。

2.3 资源利用效率

与完整的虚拟机(VM)相比,Docker容器共享宿主机的操作系统内核,因此不需要为每个应用加载一个完整的操作系统。这使得容器启动速度极快(秒级甚至毫秒级),并且占用更少的内存和磁盘空间。在同一台物理机上,你可以运行数十个甚至数百个容器,而运行同样数量的VM几乎是不可能的。

2.4 简化复杂应用依赖管理

有些应用依赖关系复杂,比如同时需要特定版本的Java、Redis和Elasticsearch。手动安装和配置这些服务,并确保它们能协同工作,是一项耗时且容易出错的任务。使用Docker Compose,你可以通过一个YAML文件定义所有服务,然后一键启动整个应用栈,极大地简化了本地开发环境的搭建。

基于以上需求,在Ubuntu 22.04上安装Docker,目标就是建立一个稳定、高效、易于管理的容器化基础平台。

3. 安装前准备:系统检查与依赖确认

在Ubuntu 22.04上安装Docker本身并不复杂,但“磨刀不误砍柴工”,做好前期准备能避免很多后续的奇怪问题。很多人安装失败,问题往往就出在这一步。

3.1 系统更新与升级

首先,确保你的系统是最新的。打开终端,执行以下命令:

sudo apt update
sudo apt upgrade -y

apt update 是刷新软件包索引,获取最新的软件源信息。 apt upgrade -y 则是升级所有已安装的软件包到最新版本, -y 参数表示自动确认,避免中途需要手动输入。保持系统更新可以修复已知的安全漏洞和软件缺陷,为Docker提供一个稳定的运行基础。

3.2 卸载旧版本Docker(如有)

如果你的系统上曾经安装过旧版本的Docker(可能叫 docker , docker.io , 或 docker-engine ),为了避免冲突,最好先清理干净。

sudo apt remove docker docker-engine docker.io containerd runc

这条命令会移除这些旧的软件包。 containerd runc 是容器运行时的核心组件,但旧版本的也可能不兼容,一并移除。系统可能会提示这些包未被安装,这是正常的,忽略即可。

3.3 安装必要的依赖工具

我们需要一些工具来帮助后续安装和管理Docker仓库。

sudo apt install -y ca-certificates curl gnupg lsb-release
  • ca-certificates : 用于验证HTTPS连接的安全性,从Docker官方仓库下载时需要。
  • curl : 命令行工具,用于从网络下载文件或数据。
  • gnupg : GNU隐私卫士,用于添加和验证GPG密钥,确保软件源的可靠性。
  • lsb-release : 一个工具,可以方便地获取LSB(Linux标准基础)和发行版的具体信息,我们用它来获取系统代号。

注意 :有些精简版的Ubuntu Server或云镜像可能默认没有安装 curl gnupg ,这一步可以确保它们存在。

3.4 添加Docker官方GPG密钥

为了确保从Docker仓库下载的软件包是真实且未被篡改的,我们需要添加Docker官方的GPG(GNU Privacy Guard)公钥。

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • sudo mkdir -p /etc/apt/keyrings : 创建目录用于存放密钥环文件, -p 参数确保如果目录不存在则创建它。
  • curl -fsSL ... : -f 表示静默失败, -s 静默模式, -S 显示错误, -L 跟随重定向。这条命令从Docker官网下载GPG密钥。
  • | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg : 管道符将下载的内容传递给 gpg 命令。 --dearmor 选项将ASCII格式的密钥转换为二进制格式(.gpg), -o 指定输出文件。

3.5 设置Docker的APT软件源

接下来,我们需要告诉APT包管理器从哪里获取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

这条命令看起来复杂,我们拆解一下:

  • deb [...] : 表示这是一个Debian系的二进制软件源。
  • [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] : 这是源的选项。
    • arch=$(dpkg --print-architecture) : 动态获取当前系统的架构(如amd64, arm64),确保安装对应架构的包。
    • signed-by=... : 指定验证软件包签名的密钥文件,就是我们上一步创建的 docker.gpg
  • https://download.docker.com/linux/ubuntu : Docker官方仓库的地址。
  • $(lsb_release -cs) : 动态获取当前Ubuntu版本的代号,对于Ubuntu 22.04就是 jammy 。这确保了源地址指向正确的版本仓库。
  • stable : 使用稳定版仓库。
  • | sudo tee /etc/apt/sources.list.d/docker.list : 将前面 echo 输出的内容,通过 tee 命令写入到 /etc/apt/sources.list.d/docker.list 文件中。在 /etc/apt/sources.list.d/ 目录下创建单独的源列表文件是一种好习惯,便于管理。
  • > /dev/null : 将 tee 命令的标准输出重定向到空设备,避免在终端上显示多余信息。

完成以上步骤后,再次更新APT包索引,让系统识别新添加的Docker源:

sudo apt update

4. Docker引擎的安装与验证

准备工作就绪,现在可以正式安装Docker引擎了。Docker引擎的核心组件包括: docker-ce (社区版), docker-ce-cli (命令行接口), containerd.io (容器运行时),以及一些插件。

4.1 执行安装命令

运行以下命令安装最新稳定版的Docker引擎:

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • docker-ce : Docker Community Edition,即Docker社区版,是核心引擎。
  • docker-ce-cli : Docker命令行工具,我们通过它与Docker守护进程交互。
  • containerd.io : 一个行业标准的容器运行时,负责管理容器的生命周期(创建、启动、停止等)。Docker底层使用它。
  • docker-buildx-plugin : 一个扩展插件,支持更强大的镜像构建功能,如多平台构建(在AMD64机器上构建ARM64的镜像)。
  • docker-compose-plugin : 这是Docker Compose的插件版本。从Docker v20.10.0+ 开始,推荐使用 docker compose (作为插件)而非独立的 docker-compose 二进制文件。它允许你使用 docker compose 命令来管理多容器应用。

安装过程会自动处理所有依赖关系。 -y 参数同样用于自动确认。

4.2 验证安装与守护进程状态

安装完成后,Docker服务(守护进程)默认是启动并设置为开机自启的。我们可以通过以下命令验证:

sudo systemctl status docker

你会看到类似下面的输出,其中 active (running) 表示服务正在运行:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since ...

如果状态不是 active ,可以使用 sudo systemctl start docker 启动它。使用 sudo systemctl enable docker 确保开机自启。

4.3 运行测试容器

最直接的验证方法是运行一个测试容器。Docker官方提供了一个轻量级的测试镜像 hello-world

sudo docker run hello-world

这条命令会执行以下操作:

  1. Docker客户端 ( docker ) 联系Docker守护进程。
  2. 守护进程检查本地是否有 hello-world:latest 镜像,如果没有,则从默认的Docker Hub仓库拉取(pull)该镜像。
  3. 拉取成功后,守护进程根据该镜像创建一个新的容器并运行。
  4. 容器内运行一个简单的程序,输出一段欢迎信息到终端,然后容器自动停止。

如果你看到 “Hello from Docker!” 等字样,恭喜你,Docker已经成功安装并可以正常工作!

4.4 将当前用户加入docker组(重要!)

你可能注意到了,前面的命令都加了 sudo 。这是因为Docker守护进程默认以root用户运行,而Docker CLI通过Unix socket ( /var/run/docker.sock ) 与守护进程通信,该socket默认属于 docker 用户组。为了让普通用户也能直接运行 docker 命令(避免每次输入sudo密码),我们需要将当前用户加入 docker 组。

sudo usermod -aG docker $USER
  • usermod : 修改用户属性的命令。
  • -aG : -a 表示追加(append)用户到组, -G 指定组名。合起来就是将用户追加到 docker 组。
  • $USER : 环境变量,代表当前登录的用户名。

关键一步 :这个组变更不会立即生效于当前已登录的会话。你需要 完全注销并重新登录 ,或者打开一个新的终端窗口(如果使用SSH,需要断开重连),新的组权限才会生效。

验证是否成功:

docker run hello-world

现在,你应该可以不加 sudo 直接运行 docker 命令了。这是一个非常重要的安全与便利性平衡的设置。

5. 核心配置优化与国内镜像加速

默认安装的Docker可以工作,但为了获得更好的体验(尤其是在国内),我们还需要进行一些关键配置。

5.1 配置Docker守护进程(daemon.json)

Docker守护进程的配置主要通过 /etc/docker/daemon.json 文件进行。如果文件不存在,创建它。

sudo nano /etc/docker/daemon.json

你可以使用 vim 或其他你熟悉的编辑器。

5.2 设置国内镜像加速器

从Docker Hub拉取镜像,在国内速度可能很慢甚至失败。配置一个国内的镜像加速器是必做操作。这里以阿里云镜像加速器为例(你需要有自己的阿里云账号获取专属地址),其他服务商(如腾讯云、网易云、中科大等)类似。

  1. 获取加速器地址 :登录阿里云容器镜像服务控制台,在“镜像工具” -> “镜像加速器”中,找到属于你的加速器地址。格式类似 https://xxxx.mirror.aliyuncs.com

  2. 编辑配置文件 :在 /etc/docker/daemon.json 中,输入以下内容(将 your-mirror-address 替换为你的实际地址):

    {
      "registry-mirrors": ["https://your-mirror-address"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m",
        "max-file": "3"
      },
      "storage-driver": "overlay2"
    }
    

配置项详解

  • "registry-mirrors" : 指定镜像加速器地址,可以配置多个,用逗号分隔。
  • "exec-opts": ["native.cgroupdriver=systemd"] : 将cgroup驱动设置为 systemd 。对于使用systemd作为初始化系统的Ubuntu 22.04,这能提供更好的兼容性和稳定性,尤其是在与Kubernetes集成时。
  • "log-driver": "json-file" "log-opts" : 配置Docker容器的日志驱动和选项。这里设置为 json-file ,并限制单个日志文件最大100MB,最多保留3个文件,防止日志无限增长占用磁盘。
  • "storage-driver": "overlay2" : 指定存储驱动。 overlay2 是当前Linux内核推荐且性能较好的存储驱动,适用于Ubuntu 22.04。

5.3 应用配置并重启服务

保存并关闭 daemon.json 文件后,需要重启Docker服务使配置生效。

sudo systemctl daemon-reload
sudo systemctl restart docker
  • sudo systemctl daemon-reload : 重新加载systemd管理器的配置,确保它读取了新的 daemon.json 配置。
  • sudo systemctl restart docker : 重启Docker服务。

验证配置是否生效:

docker info

在输出的信息中,找到 Registry Mirrors 部分,你应该能看到你配置的镜像加速器地址。同时,检查 Cgroup Driver 是否为 systemd

5.4 验证镜像加速效果

可以拉取一个较大的镜像来测试速度,例如:

docker pull ubuntu:22.04

观察下载速度,应该比不配置加速器时有显著提升。

6. Docker基础使用与核心概念实战

安装配置好后,我们来实际操作几个最常用的命令,并理解背后的核心概念:镜像(Image)和容器(Container)。

6.1 镜像(Image)操作

镜像是容器的模板,是一个只读的静态文件层集合。它包含了运行应用所需的代码、运行时、库、环境变量和配置文件。

  • 搜索镜像 :在Docker Hub上查找镜像。

    docker search nginx
    

    这会列出所有包含 “nginx” 关键词的公共镜像,包括官方镜像(OFFICIAL 列为 OK)和用户贡献的镜像。

  • 拉取镜像 :从仓库下载镜像到本地。

    docker pull nginx:latest
    

    nginx 是镜像名, latest 是标签(Tag),通常代表最新稳定版。不指定标签时默认为 latest 。建议在生产中指定具体版本标签,如 nginx:1.24-alpine ,以确保一致性。

  • 列出本地镜像

    docker images
    # 或使用更详细的格式
    docker image ls
    

    这会显示镜像仓库名(REPOSITORY)、标签(TAG)、镜像ID(IMAGE ID)、创建时间(CREATED)和大小(SIZE)。

  • 删除镜像

    docker rmi <image_id_or_name>
    # 例如:docker rmi hello-world
    # 强制删除(即使有容器基于它):docker rmi -f <image_id>
    

    如果镜像有对应的容器(即使已停止)存在,需要先删除容器才能删除镜像,或者使用 -f 强制删除(不推荐,可能造成混乱)。

6.2 容器(Container)操作

容器是镜像的运行实例。你可以创建、启动、停止、移动或删除容器。

  • 运行容器 :这是最常用的命令。

    docker run -d --name my-nginx -p 8080:80 nginx
    
    • -d : 后台运行(detached mode)。
    • --name my-nginx : 为容器指定一个自定义名称,便于后续管理。如果不指定,Docker会随机生成一个名字。
    • -p 8080:80 : 端口映射。将宿主机的8080端口映射到容器的80端口(Nginx默认监听80)。这样,你访问 http://localhost:8080 就能看到容器内的Nginx欢迎页面。
    • nginx : 使用的镜像名。
  • 列出容器

    docker ps          # 查看正在运行的容器
    docker ps -a       # 查看所有容器(包括已停止的)
    
  • 停止容器

    docker stop my-nginx
    
  • 启动已停止的容器

    docker start my-nginx
    
  • 进入运行中的容器 :有时需要进入容器内部执行命令或调试。

    docker exec -it my-nginx /bin/bash
    
    • exec : 在运行的容器中执行命令。
    • -it : -i 保持标准输入打开, -t 分配一个伪终端。合起来提供交互式Shell体验。
    • my-nginx : 容器名。
    • /bin/bash : 要执行的命令,这里是启动一个Bash Shell。有些精简镜像(如Alpine Linux)可能使用 /bin/sh
  • 查看容器日志

    docker logs my-nginx
    docker logs -f my-nginx  # -f 参数可以持续跟踪(follow)日志输出
    
  • 删除容器

    docker rm my-nginx  # 删除已停止的容器
    docker rm -f my-nginx # -f 强制删除运行中的容器
    

6.3 数据持久化:挂载卷(Volume)

默认情况下,容器内创建的文件都存储在可写的容器层中。当容器被删除时,这些数据也会丢失。为了持久化数据(如数据库文件、配置文件、日志),我们需要使用 卷(Volume) 绑定挂载(Bind Mount)

  • 创建和管理卷

    docker volume create my-data-volume  # 创建一个名为my-data-volume的卷
    docker volume ls                     # 列出所有卷
    docker volume inspect my-data-volume # 查看卷的详细信息,包括在宿主机上的存储路径
    
  • 运行容器时使用卷

    docker run -d --name mysql-db \
      -v my-data-volume:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=my-secret-pw \
      mysql:8.0
    
    • -v my-data-volume:/var/lib/mysql : 将名为 my-data-volume 的卷挂载到容器内的 /var/lib/mysql 目录。这样,MySQL的数据就持久化存储在卷中,即使容器删除,数据也不会丢失。
  • 使用绑定挂载 :直接将宿主机的一个目录挂载到容器内。

    docker run -d --name nginx-with-config \
      -v /home/user/nginx-config:/etc/nginx/conf.d \
      -p 80:80 \
      nginx
    

    这允许你在宿主机上编辑 /home/user/nginx-config 目录下的配置文件,改动会实时反映到容器内的Nginx中,非常适合开发调试。

7. 使用Docker Compose编排多容器应用

对于由多个服务(如Web应用、数据库、缓存)组成的复杂应用,手动用 docker run 启动每个容器并管理它们之间的网络连接非常繁琐。Docker Compose就是为解决这个问题而生的工具。它允许你使用一个YAML文件( docker-compose.yml )来定义和运行多容器应用。

7.1 安装验证与基础语法

我们在安装 docker-compose-plugin 后,可以使用 docker compose 命令(注意是 compose ,不是 docker-compose )。

验证安装:

docker compose version

一个最简单的 docker-compose.yml 示例如下,它定义了一个WordPress应用栈,包含WordPress和MySQL数据库:

version: '3.8'  # 指定Compose文件格式版本

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

关键部分解析

  • services : 定义所有需要运行的服务(容器)。
  • db wordpress : 服务名称。
  • image : 指定使用的Docker镜像。
  • ports : 端口映射,格式为 "宿主机端口:容器端口"
  • volumes : 定义数据卷挂载。示例中使用了命名卷( db_data , wp_data ),Compose会自动创建和管理它们。
  • environment : 设置容器内的环境变量,常用于传递配置(如数据库密码)。
  • depends_on : 声明服务依赖关系,确保 db 服务先于 wordpress 启动。
  • restart: always : 容器退出时总是重启,确保服务高可用。
  • 文件底部的 volumes : 声明在Compose级别使用的命名卷。

7.2 常用Compose命令

在包含 docker-compose.yml 文件的目录下执行:

  • 启动所有服务(后台运行)

    docker compose up -d
    

    -d 表示后台运行。

  • 查看服务状态

    docker compose ps
    
  • 查看服务日志

    docker compose logs   # 查看所有服务日志
    docker compose logs wordpress # 查看指定服务日志
    docker compose logs -f wordpress # 跟踪日志
    
  • 停止所有服务

    docker compose down
    

    此命令会停止并删除所有由 up 创建的容器、网络,但 默认不会删除卷 。如果你想同时删除卷,需要加 -v 参数: docker compose down -v 请谨慎使用,这会删除所有数据!

  • 在运行的服务中执行命令

    docker compose exec db mysql -u root -p
    

    这会在名为 db 的服务容器中执行 mysql -u root -p 命令。

使用Docker Compose,你可以用一行命令管理整个复杂的应用环境,极大地简化了开发和部署流程。

8. 常见问题与排查技巧实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了一些我亲身经历过的典型问题和解决方法。

8.1 安装后 docker 命令报错:权限拒绝

问题 :执行 docker ps 等命令时,提示 Got permission denied while trying to connect to the Docker daemon socket...

原因 :当前用户不在 docker 用户组中,或者组权限未生效。

解决

  1. 确认已将用户加入 docker 组: groups $USER ,查看输出中是否包含 docker
  2. 如果已加入,确保你已 注销并重新登录 ,或者开启一个新的终端会话。
  3. 如果问题依旧,可以尝试重启Docker服务: sudo systemctl restart docker
  4. 作为临时解决方案(不推荐长期使用),可以用 sudo 执行命令,但这违背了便利性的初衷。

8.2 拉取镜像速度极慢或失败

问题 docker pull 命令卡住或报网络错误。

原因 :网络连接Docker Hub不稳定,或未正确配置镜像加速器。

解决

  1. 首要检查 :确认 /etc/docker/daemon.json 中的 registry-mirrors 配置正确无误,并且已重启Docker服务。
  2. 测试加速器 :可以 ping 一下你的镜像加速器地址,看是否能通。
  3. 更换加速器 :如果某个加速器不稳定,可以尝试换一个。国内常用的还有:
    • 腾讯云: https://mirror.ccs.tencentyun.com
    • 网易云: https://hub-mirror.c.163.com
    • 中科大: https://docker.mirrors.ustc.edu.cn 可以配置多个镜像地址,Docker会按顺序尝试。
  4. 检查DNS :有时是DNS解析问题。可以尝试修改宿主机的DNS服务器为 114.114.114.114 8.8.8.8

8.3 运行容器时端口冲突

问题 docker run -p 80:80 ... 时报错 Bind for 0.0.0.0:80 failed: port is already allocated

原因 :宿主机上的80端口已被其他程序占用(可能是另一个Nginx、Apache或已有的Docker容器)。

解决

  1. 找出占用端口的进程: sudo netstat -tulpn | grep :80
  2. 根据PID停止该进程,或者修改你的Docker容器映射到其他端口,例如 -p 8080:80
  3. 如果占用端口的是另一个Docker容器,可以使用 docker ps 查看,并用 docker stop <container_name> 停止它,或者修改那个容器的端口映射。

8.4 容器内无法连接外部网络或宿主机

问题 :在容器内 ping www.baidu.com 失败,或者从容器内无法连接宿主机上运行的服务(如数据库)。

原因与解决

  • 容器内无网络 :检查宿主机的网络连接,以及Docker服务状态。确保 docker run 时没有使用 --network none 参数。
  • 连接宿主机服务 :从容器内连接宿主机,不能使用 localhost 127.0.0.1 ,因为这是容器自己的回环地址。Docker为宿主机在容器网络内创建了一个特殊的主机名 host.docker.internal (在Linux上需要Docker 20.10+版本,并在 docker run 时添加 --add-host=host.docker.internal:host-gateway 参数)。更通用的方法是使用宿主机的真实IP地址(如 192.168.1.100 ),可以通过 ip addr show hostname -I 命令查看。
  • 防火墙干扰 :Ubuntu 22.04默认使用 ufw 防火墙。如果宿主机防火墙开启,可能会阻止容器与外部或宿主机之间的通信。你可以暂时禁用防火墙测试 ( sudo ufw disable ),或者为Docker添加规则: sudo ufw allow from 172.17.0.0/16 (假设Docker默认网桥是 172.17.0.0/16 )。更安全的方法是针对特定端口放行。

8.5 磁盘空间不足

问题 :一段时间后,系统提示磁盘空间不足, /var/lib/docker 目录变得非常大。

原因 :Docker的镜像、容器、卷和构建缓存都默认存储在 /var/lib/docker 。如果不定期清理,会占用大量空间。

解决

  • 查看磁盘使用情况

    docker system df
    

    这个命令会详细显示镜像、容器、本地卷和构建缓存各占用了多少空间。

  • 清理无用资源

    docker system prune -a
    

    警告 :这个命令会删除所有已停止的容器、所有未被任何容器使用的网络、所有悬空镜像(未被任何镜像引用的中间层镜像)和所有构建缓存。 -a 参数还会删除所有未被容器使用的镜像。执行前请务必确认!对于生产环境,建议有选择性地清理。

  • 定期清理 :可以将清理命令加入定时任务(cron job),例如每周日凌晨执行一次 docker system prune -f -f 免确认)。

8.6 Docker Desktop相关错误提示的应对

注意 :本文介绍的是在Linux原生环境(Ubuntu)上安装 Docker Engine ,而非 Docker Desktop 。Docker Desktop是一个包含Docker Engine、GUI管理工具等的桌面应用程序,主要用于macOS和Windows。在Linux上,通常直接安装Docker Engine即可。

如果你在网络上看到类似 “virtualization support not detected” “docker desktop failed to start” “WSL2” 相关的错误,那都是针对在Windows或macOS上安装Docker Desktop的。在纯Ubuntu系统上,只要你的CPU支持虚拟化(VT-x/AMD-V)并且在BIOS中已开启,安装Docker Engine一般不会遇到这些问题。如果遇到内核模块问题,可以尝试更新内核或检查 linux-modules-extra 包是否已安装。

在Ubuntu上,如果你需要图形化管理界面,可以考虑安装Portainer(一个基于Web的Docker管理UI),而不是Docker Desktop。

docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

然后通过浏览器访问 http://localhost:9000 即可。

更多推荐