连接到远程 Docker 守护进程
Connecting to a Remote Docker Daemon
我已经安装了VirtualBox,并且在VirtualBox VM中安装了Ubuntu服务器版本。我的主机是Windows10.
我还在主机 Windows 框中安装了 Docker。我的意图是使用 Windows 中的 docker CLI 连接到 VM 内的 docker 守护程序(服务器)。
我已经在 Ubuntu VM 中进行了更改,它正在侦听端口 2375。
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 2305/dockerd
另外,我在主机(Windows)中设置了环境变量DOCKER_HOST为虚拟机IP和端口。
set DOCKER_HOST=tcp://192.168.56.107:2375
我的 Windows 机器 IP 是 192.168.56.1 并且 ping 正常。
Pinging 192.168.56.107 with 32 bytes of data:
Reply from 192.168.56.107: bytes=32 time<1ms TTL=64
Reply from 192.168.56.107: bytes=32 time<1ms TTL=64
但是当我尝试从我的 Windows 机器连接时,出现以下错误:
error during connect: Get http://192.168.56.107:2375/v1.27/info: dial tcp 192.168.56.107:2375: connectex: No connection could be made because the target machine actively refused it.
请查找docker信息输出:
controller@ubuntuserver:~$ docker info
Containers: 4
Running: 0
Paused: 0
Stopped: 4
Images: 2
Server Version: 18.09.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-50-generic
Operating System: Ubuntu 18.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.79GiB
Name: ubuntuserver
ID: AWDW:34ET:4J2J:2NWB:UPK7:EQHB:W64E:22AT:W6J4:BMRD:NDO6:CNR2
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
WARNING: API is accessible on http://127.0.0.1:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
WARNING: No swap limit support
cat /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
你能帮我解决这个问题吗?
您需要在 ubuntu 服务器中配置 Docker 守护程序,以便它接受 tcp 连接。
默认情况下 Docker 监听 unix 套接字 /var/run/docker.sock
。
要配置您的守护进程,您可以查看文档 here
Step-by-step 配置(在这个例子中,一切都在 Ubuntu VM 上完成):
配置守护进程
在 Ubuntu,默认情况下您使用的是 systemd。您需要编辑配置文件(通常位于/lib/systemd/system/docker.service
):
[Service]
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
在这个例子中,Docker 守护进程不再监听 unix 套接字。它只监听来自本地主机的 tcp 调用。
重启守护进程:
$> sudo systemctl daemon-reload
$> sudo systemctl restart docker.service
配置客户端(仍在虚拟机上)
重新启动守护程序后,您的 docker 客户端不再工作(因为您刚刚告诉客户端只监听 tcp 连接)。因此,如果您执行 docker image ls
它不应该响应。为了让您的客户端工作,您需要告诉它连接到哪个服务器:
$> export DOCKER_HOST="tcp://0.0.0.0:2375"
现在,您的客户端应该能够连接到守护程序(即:docker image ls
应该打印所有图像)
这应该可以在您的 Ubuntu 服务器上正常工作。您只需要在 Windows 上应用相同的客户端配置。如果它在 Windows 上不起作用,则意味着有其他东西阻止了流量(可能是防火墙)。
希望对您有所帮助。
我已经安装了VirtualBox,并且在VirtualBox VM中安装了Ubuntu服务器版本。我的主机是Windows10.
我还在主机 Windows 框中安装了 Docker。我的意图是使用 Windows 中的 docker CLI 连接到 VM 内的 docker 守护程序(服务器)。
我已经在 Ubuntu VM 中进行了更改,它正在侦听端口 2375。
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 2305/dockerd
另外,我在主机(Windows)中设置了环境变量DOCKER_HOST为虚拟机IP和端口。
set DOCKER_HOST=tcp://192.168.56.107:2375
我的 Windows 机器 IP 是 192.168.56.1 并且 ping 正常。
Pinging 192.168.56.107 with 32 bytes of data:
Reply from 192.168.56.107: bytes=32 time<1ms TTL=64
Reply from 192.168.56.107: bytes=32 time<1ms TTL=64
但是当我尝试从我的 Windows 机器连接时,出现以下错误:
error during connect: Get http://192.168.56.107:2375/v1.27/info: dial tcp 192.168.56.107:2375: connectex: No connection could be made because the target machine actively refused it.
请查找docker信息输出:
controller@ubuntuserver:~$ docker info
Containers: 4
Running: 0
Paused: 0
Stopped: 4
Images: 2
Server Version: 18.09.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-50-generic
Operating System: Ubuntu 18.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.79GiB
Name: ubuntuserver
ID: AWDW:34ET:4J2J:2NWB:UPK7:EQHB:W64E:22AT:W6J4:BMRD:NDO6:CNR2
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
WARNING: API is accessible on http://127.0.0.1:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
WARNING: No swap limit support
cat /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
你能帮我解决这个问题吗?
您需要在 ubuntu 服务器中配置 Docker 守护程序,以便它接受 tcp 连接。
默认情况下 Docker 监听 unix 套接字 /var/run/docker.sock
。
要配置您的守护进程,您可以查看文档 here
Step-by-step 配置(在这个例子中,一切都在 Ubuntu VM 上完成):
配置守护进程
在 Ubuntu,默认情况下您使用的是 systemd。您需要编辑配置文件(通常位于/lib/systemd/system/docker.service
):
[Service]
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
在这个例子中,Docker 守护进程不再监听 unix 套接字。它只监听来自本地主机的 tcp 调用。
重启守护进程:
$> sudo systemctl daemon-reload
$> sudo systemctl restart docker.service
配置客户端(仍在虚拟机上)
重新启动守护程序后,您的 docker 客户端不再工作(因为您刚刚告诉客户端只监听 tcp 连接)。因此,如果您执行 docker image ls
它不应该响应。为了让您的客户端工作,您需要告诉它连接到哪个服务器:
$> export DOCKER_HOST="tcp://0.0.0.0:2375"
现在,您的客户端应该能够连接到守护程序(即:docker image ls
应该打印所有图像)
这应该可以在您的 Ubuntu 服务器上正常工作。您只需要在 Windows 上应用相同的客户端配置。如果它在 Windows 上不起作用,则意味着有其他东西阻止了流量(可能是防火墙)。
希望对您有所帮助。