Docker使用笔记

Posted by wsxq2 on 2022-03-16
TAGS:  FROM_DOCXDocker

本文最后一次编辑时间:2022-03-16 15:25:05 +0800

安装

参见官方文档。对于Windows,通常直接安装 Docker Desktop,需要注意的是,如果安装后始终显示“Docker Desktop stopped…”,则最简单的解决方法是从 Windows Store 中安装 WSL 系列的 Ubuntu 发行版(比如 Ubuntu 20.04)。可能还需要以下命令更新 WSL:

1
wsl --update

代理

Docker 的代理逻辑一度让我感到十分混乱,理清楚后发现其实很简单:docker 采用的是 C/S 架构,即 client/server 架构,客户端就是docker命令,服务端就是dockerd命令,ddaemon的缩写,表示后台运行。因此,对于 Docker 的代理主要包括两种,一个是影响客户端的,另一个是影响服务端的。

为了方便说明,官方将客户端称之为 docker cli,服务端称之为 docker daemon。对这两种代理,官方文档中均作出了明确的说明:

具体而言,docker daemon 的代理决定了 docker pull 时是否通过代理去从 Docker Hub 获取 docker 镜像;而 docker cli 的代理决定了 docker 容器内部的 HTTP_PROXY、HTTPS_PROXY 等环境变量是否设置,如果设置,则 curl、wget 等命令均会走这些环境变量指定的代理,而许多命令(如 PHP 的 composer 命令)底层访问 HTTP/HTTPS 时使用的即是 curl,所以会根据 HTTP_PROXY 等环境变量决定是否走代理。

对于每种代理,又有命令行选项和配置文件两种方式可以设置。此外,对于 daemon,如果安装了 Docker Desktop,则其代理又以界面配置为准,会忽略配置文件中的设置。下面具体说明

docker daemon

use docker desktop

Docker Desktop 是 docker 官方现在主推的 docker 使用方式,安装好后会自动安装 docker,dockerd,docker-compose 等相关命令,且能直观简单地管理容器、镜像、卷等。当然如果系统资源有限,或者不支持图形界面,则 Docker Desktop 就没有多大优势了。

如果使用了 Docker Desktop,则直接使用该 GUI 软件中的代理设置功能即可,具体位置在:Settings->Resources->Proxies

Docker Desktop 官方相关文档:

  • https://docs.docker.com/desktop/networking/?uuid=93CAAB76-FC9E-4F21-87E6-9604732B7EC8#httphttps-proxy-support
  • https://docs.docker.com/desktop/settings/windows/#proxies

需要注意的是:代理地址 locahost 或者 127.0.0.1 可能不起效果,这时可使用网卡上设置的 IP 地址(虚拟网卡上设置的也可,例如vEthernet (WSL (Hyper-V firewall)))。当然如果该地址是通过 DHCP 获得的,那么需要注意它可能会改变,需要即时更新。

not use docker desktop

如果未使用 Dockers Desktop,则可通过dockerd的命令行参数传入代理配置或者通过其配置文件设置代理。当然,用得比较多的还是配置文件,其默认配置文件为 daemon.json,添加如下内容即可使用代理:

1
2
3
4
5
6
7
{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

命令参数为--http-proxy--https-proxy。由于使用不多,且官方也不推荐,就不举例了。

除了这两种方式外,还有个环境变量方式。即dockerd也会按照环境变量HTTPS_PROXYHTTP_PROXY等进行代理配置。通常dockerd的启动是在开机时自动进行的,这时可能还未设置环境变量,那我们如何使其生效呢?对于使用systemctl的系统,可以通过 systemd unit file 来达到我们的目的。详见 Daemon proxy configuration | Docker Docs。也可参考 https://blog.csdn.net/omage/article/details/139560401

docker cli

Docker Desktop 中的设置不会影响 docker cli,docker cli 还是根据其配置文件或者命令行参数来设置代理的。其默认配置文件为~/.docker/config.json,故而直接在该文件中添加如下配置即可实现代理:

1
2
3
4
5
6
7
8
9
"proxies":
{
    "default":
    {
        "httpProxy": "http://127.0.0.1:3001",
            "httpsProxy": "http://127.0.0.1:3001",
            "noProxy": "*.test.example.com,.example2.com"
    }
}

例如 Windows 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "auths": {},
    "credsStore": "desktop",
    "proxies": {
        "default": {
            "httpProxy": "http://192.168.56.200:7890",
            "httpsProxy": "https://192.168.56.200:7890",
            "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
        }
    },
    "currentContext": "default",
    "plugins": {
        "-x-cli-hints": {
            "enabled": "true"
        }
    }
}

设置好后,执行docker run或者docker build时会自动设置容器中的相关环境变量,包括HTTP_PROXY等,从而实现容器内部的代理,使内部执行 HTTP/HTTPS 相关命令时走代理,包括apt命令、composer命令等。

也可在执行docker rundocker build时手动在命令行配置代理,例如:

1
2
docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

compose

Compose file version 3 reference | Docker Documentation

遇到过的问题

修订记录

修订时间 修订人 版本 说明
2025-03-07 wsxq2 1.0 初稿