3、Docker安装与配置:在Linux(Ubuntu/CentOS)上安装Docker、在Windows/Mac上安装Docker Desktop、Docker Daemon配置、非root用户运行Docker

3.1 为什么安装Docker比想象中“讲究”

说实话,Docker的安装本身并不复杂。但我在项目中见过太多人因为安装时的小疏忽,后面排查问题花了一整天。比如版本不兼容、权限没配好、或者daemon配置不对导致容器跑不起来。

所以这一章,我会把每个平台的安装细节都讲透。你跟着做就行,别跳步骤。

3.2 在Ubuntu上安装Docker

我个人习惯用Ubuntu做开发环境。它社区活跃,文档也全。安装Docker其实就几步,但每一步都有坑。

3.2.1 卸载旧版本

先看看系统里有没有老版本的Docker。如果有,先卸掉。不然新老版本冲突,你会很头疼。

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

嗯,这一步不是必须的。但如果你之前装过,建议跑一下。我曾经遇到过旧版docker.io和新版冲突,导致容器网络一直不通。

3.2.2 安装依赖

Docker需要一些基础工具来支持HTTPS和软件源管理。

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

3.2.3 添加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.gpg

3.2.4 添加软件源

把Docker的仓库加到你的apt源列表里。这样以后更新也方便。

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

3.2.5 安装Docker引擎

终于到正题了。直接安装最新版。

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
小提示: 如果你需要特定版本,可以用 apt-cache madison docker-ce 查看可用版本列表,然后指定版本号安装。

3.2.6 验证安装

跑一下hello-world镜像,看看Docker能不能正常工作。

sudo docker run hello-world

看到“Hello from Docker!”就说明成功了。我第一次看到这个输出时,还挺有成就感的。

3.3 在CentOS上安装Docker

CentOS和Ubuntu的安装流程大同小异。但有几个细节不一样,我单独拎出来说。

3.3.1 卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

3.3.2 安装yum-utils

sudo yum install -y yum-utils

3.3.3 添加软件源

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3.3.4 安装Docker引擎

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

3.3.5 启动Docker并设置开机自启

CentOS不会自动启动Docker服务。你需要手动启动,并设置开机自启。

sudo systemctl start docker
sudo systemctl enable docker
注意: 在CentOS上,如果你用的是旧版内核(3.10以下),可能会遇到一些兼容性问题。我建议至少用CentOS 7.6以上版本。

3.4 在Windows/Mac上安装Docker Desktop

Windows和Mac的安装就简单多了。说白了,就是下载一个安装包,双击运行。但有几个关键点要注意。

3.4.1 Windows上的安装

Windows上安装Docker Desktop,需要满足两个前提:

  • Windows 10 64位专业版/企业版/教育版(或Windows 11)
  • 启用Hyper-V和容器功能

安装步骤:

  1. 去Docker官网下载Docker Desktop for Windows
  2. 双击安装包,一路默认就行
  3. 安装完成后,重启电脑
  4. 启动Docker Desktop,接受许可协议

我记得第一次在Windows上装Docker时,卡在了Hyper-V没开启这一步。后来发现需要在“启用或关闭Windows功能”里手动勾选Hyper-V。嗯,这个坑我踩过。

3.4.2 Mac上的安装

Mac上就简单多了。直接下载Docker Desktop for Mac,拖到Applications文件夹就行。

不过要注意:

  • Mac需要是2010年以后的型号(支持Apple Silicon或Intel芯片)
  • macOS版本至少是10.15 Catalina

如果你是M1/M2芯片的Mac,记得下载Apple Silicon版本。我有个同事用Intel版本在M1上跑,结果容器启动不了,折腾了半天才发现是版本下错了。

3.5 Docker Daemon配置

Docker Daemon是Docker的后台守护进程。说白了,所有容器操作都是通过它来完成的。默认配置够用,但有些场景需要调整。

3.5.1 配置文件位置

Daemon的配置文件在 /etc/docker/daemon.json。如果这个文件不存在,你可以手动创建。

3.5.2 常用配置项

配置项 说明 示例
registry-mirrors 镜像加速器地址 ["https://your-mirror.com"]
log-driver 日志驱动类型 "json-file"
log-opts 日志参数 {"max-size": "10m", "max-file": "3"}
storage-driver 存储驱动 "overlay2"
data-root 数据存储目录 "/data/docker"

举个例子,配置镜像加速和日志限制:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
重要: 修改完daemon.json后,需要重启Docker服务才能生效:sudo systemctl restart docker

3.5.3 配置镜像加速器

国内访问Docker Hub经常很慢。我建议配置一个镜像加速器。常用的有阿里云、中科大、网易等。

配置方法就是在daemon.json里加一行:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

我曾经在项目上线前,因为没配镜像加速器,拉取一个200MB的镜像花了20分钟。后来配了加速器,3分钟就搞定了。你想想看,这差距有多大。

3.6 非root用户运行Docker

默认情况下,Docker命令需要root权限。每次都要加sudo,很烦对吧?

解决办法很简单:把当前用户加到docker用户组里。

3.6.1 创建docker用户组

如果docker用户组不存在,先创建它。

sudo groupadd docker

3.6.2 将用户加入docker组

sudo usermod -aG docker $USER

这里的 $USER 就是你的当前用户名。如果你要指定其他用户,直接写用户名就行。

3.6.3 重新登录

退出当前终端,重新登录。或者直接重启电脑。这样才能让用户组变更生效。

验证一下:

docker run hello-world

如果不用sudo也能跑,就说明配置成功了。

安全警告: 把用户加到docker组,相当于给了这个用户root权限。因为docker组里的用户可以启动特权容器,挂载宿主机目录。所以生产环境要谨慎使用。我一般只在开发环境这么做。

3.7 避坑指南

最后,分享几个我踩过的坑:

  • 版本不兼容: 我曾经在Ubuntu 18.04上装了最新版Docker,结果内核太老,overlay2驱动不支持。后来换了Ubuntu 20.04才解决。
  • 磁盘空间不足: Docker默认把数据存在 /var/lib/docker。如果你的根分区空间不大,建议改到其他分区。我就是因为没改,有一次磁盘满了,所有容器都挂了。
  • 防火墙规则: Docker会修改iptables规则。如果你自己配了防火墙,可能会冲突。我建议用Docker自带的网络管理,别手动改iptables。

好了,安装配置就讲到这里。下一章我们聊聊Docker的常用命令,到时候你会发现自己已经能熟练操作Docker了。