Docker Remote API

环境 Ubuntu 20.04

启用API

为了保证安全,Docker 安装后默认不会启用远程 API 服务,因为这个服务默认不做权限认证。本文主要是做实践分享,且用于内网生产环境,安全上会有保证,如果是外网生产环境建议做好 iptables 安全加固或用完即焚或 使用 TLS 安全认证,此处不表。

方式一

sudo vim /etc/default/docker
DOCKER_OPTS="-H tcp://0.0.0.0:2375"

重启docker即可:

sudo systemctl daemon-reload
sudo systemctl restart docker

PS: 这是网上给的配置方法,也是这种简单配置让 Docker Daemon 把服务暴露在 TCP 的 2375 端口上,这样就可以在网络上操作 Docker 了。Docker 本身没有身份认证的功能,只要网络上能访问到服务端口,就可以操作 Docker。

方式二

1. 修改配置

sudo vim /usr/lib/systemd/system/docker.service

找到 ExecStart 配置项

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

在其中插入监听选项 -H tcp://0.0.0.0:2375( 如果是内网生产环境,请将 0.0.0.0 改为内网 IP ),最后为:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

2. 重启 Docker

systemctl daemon-reload 
systemctl restart docker

方式三

1. 修改配置

修改 /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 删掉 -H fd:// 防止冲突。

vim /etc/docker/daemon.json

{
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
  • unix:///var/run/docker.sock unix socket,本地客户端将通过这个来连接 Docker Daemon。
  • tcp://0.0.0.0:2375 tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon。

修改配置以后

然后让 docker 重新读取配置文件,并重启 docker 服务

2. 重启 Docker

systemctl daemon-reload
systemctl restart docker

3. 查看结果,如下即为成功

[root@xyzla ~]# netstat -nutlp | grep 2375
tcp6       0      0 :::2375                 :::*                    LISTEN      3586/dockerd
root@xyzla:~# sudo lsof -i:2375
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
dockerd 192550 root    7u  IPv4 2033115      0t0  TCP localhost:2375 (LISTEN)
[root@xyzla ~]# ps -ef|grep docker
root      44221      1  1 18:16 ?        00:00:06 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

4. 查看 API 版本

docker version

[root@xyzla ~]# docker -H tcp://127.0.0.1:2375 version
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40                         # 本机 Docker 作为客户端的版本
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:45:44 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)  # 本机 Docker 作为服务端的版本
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:44:15 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

5. 验证是否配置成功

[root@xyzla ~]# docker -H tcp://127.0.0.1:2375 ps
CONTAINER ID        IMAGE                                                   COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                                                                                                                                                                                                                                NAMES
01ec6c9e3cb9        docker.elastic.co/kibana/kibana:6.2.4                   "/bin/bash /usr/lo..."   33 hours ago        Up 33 hours         0.0.0.0:5601->5601/tcp                                                                                                                                                                                                                                                                                                                                              kibaba_kibana_1
ea57c86d7fd8        nginx                                                   "nginx -g 'daemon ..."   2 days ago          Up 2 days           80/tcp, 0.0.0.0:80->80/tcp                       
  • https://zhangge.net/5152.html