目录

Docker 安装和网络代理

1 Docker

Docker是一个开放平台,可用于容器镜像的开发、交付和运行。

Docker名词一般是泛指。一般会代指Docker引擎(Docker Engine)或Docker注册中心(Docker registry)。

我们这边讨论的是Docker引擎。其主要有3部分组成:

  • Docker守护进程(Docker daemon / dockerd)。
  • Docker Engine API。
  • Docker 客户端。

2 Docker的安装卸载

Docker的版本自17.03后分为CE(Community Edition)和EE(Enterprise Edition),个人使用安装CE版本。

推荐安装方法

Linux的发行版一般会自带docker的软件包或者下载.deb文件手动安装, 但是本文推荐的安装方法是通过apt包管理工具安装,参照官网安装向导

安装之前建议先卸载旧版本:

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

添加使用HTTPS传输的软件包和CA证书:

1
2
3
4
5
6
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

添加软件源需要的GPG密钥:

1
2
3
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 如果是国内源:
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

配置仓库:

1
2
3
$ sudo add-apt-repository \
    "deb [arch=$(dpkg --print-architecture) https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable"

或者直接在/etc/apt/sources.list.d/创建一个docker.list文件,添加上式中的引号中的内容, 并修改内容中修改架构和发行版名称。

执行安装:

1
2
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

建立docker用户组:

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

如果一切顺利的话,就安装成功了。

卸载方法

卸载Docker Engine:

1
2
sudo apt-get purge -y docker-engine docker docker-ce docker-ce-cli containerd.io
sudo apt-get autoremove -y --purge docker-engine docker docker-ce docker-ce-cli containerd.io

以上的命令不会删除主机上的镜像、容器、卷和用户创建的配置文件等,如需清理:

1
2
3
4
sudo rm -rf /var/lib/docker /var/lib/containerd /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock

3 网络代理配置

在公司经常需要挂代理才可以正常访问互联网。如果是这种情况,需要为Docker配置代理。 在Docker的使用中,需要访问外网的场景一般有:

  • dockerd代理配置
  • Container代理配置
  • docker build代理配置

下文主要参考:Docker的三种网络代理配置

dockerd代理配置

当你执行docker logindocker pushdocker pull时,实际上是在和docker-client交互, 这时候docker-client操作dockerd去访问外网的镜像仓库时,就会有相关的API发出,这时候需要给dockerd去配置代理。 docker受到systemd的管控,所以需要修改的是systemd的配置。

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

这里新创建的配置文件的命名只要符合*.conf的形式即可。添加内容如下:

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://<proxy-addr>:<proxy-port>"
Environment="HTTPS_PROXY=http://<proxy-addr>:<proxy-port>"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

其中的代理要换成可用的免密代理。

生效条件

需要重启dockerd才可生效。

重启指令:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

Container代理配置

配置文件

当容器运行时,容器内的运用需要代理访问时,需要配置~/.docker/config.json,当然只生效在Docker的17.07及其以后版本。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://<proxy-addr>:<proxy-port>",
     "httpsProxy": "http://<proxy-addr>:<proxy-port>",
     "noProxy": "localhost,127.0.0.1,docker-registry.somecorporation.com"
   }
 }
}

以上的配置可以一劳永逸。

环境变量

当然,还有一种是在运行容器时通过环境变量的形式注入,命令是-e或者--env

注意
注入的代理根据真实需要,如容器是基于ubuntu系统的应该配置http_proxyhttps_proxyno_proxy等。
生效条件
对已经启动的容器无效,对配置后启动的容器立即生效。

docker build代理配置

通过docker build构建镜像,是启动容器并逐层构建。但是上文中的配置文件对其无效。

Dockerfile也可以设置环境变量,有ENVARG,这两者的作用一致,但是通过ENV设置的环境变量会一并带到生成的镜像中。 ARG则不会,只在构建的阶段有效。

Dockerfile的ARGdocker build--build-arg是一致的, 建议在构建时通过--build-arg <varname>=<value>参数来指定或重设置这些变量的值。

所以,docker build配置代理:

1
2
3
4
5
docker build . \
    --build-arg "http_proxy=http://<proxy-addr>:<proxy-port>" \
    --build-arg "https_proxy=http://<proxy-addr>:<proxy-port>" \
    --build-arg "no_proxy=localhost,127.0.0.1,docker-registry.somecorporation.com" \
    -t your/image:tag

同样,由于是通过环境变量来配置代理,配置生效的环境变量应该要符合实际镜像的要求。

注意
如果代理使用的是localhost:3128这类,必须加上--network host代理才能生效。 或者直接配置代理的外部IP。
生效条件
执行docker build构建镜像时立即生效。