K8S系列文章之 docker配置远程访问

Docker Daemon 默认情况下是只允许本地访问的,不允许远程访问。本文将首先介绍 Docker Daemon 的连接方式,然后说明如何配置远程访问。即实现通过本地 docker 客户端访问远程主机的 docker 服务端,以此来监控远程主机上的 Docker 容器。

如何配置:

有两种方式:

第一种(推荐)

是使用 systemctl edit docker 来调用文本编辑器修改指定的单元或单元实例,ubuntu 默认调用的是 nano 编辑器,不是很好用,如果不熟悉 nano 编辑器的操作可以使用 vim 编辑器。

主要也就是新建或修改 /etc/systemd/system/docker.service.d/override.conf,其内容如下:

复制代码
##Add this to the file for the docker daemon to use different ExecStart parameters (more things can be added here)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

解释一下:

默认情况下使用 systemd 时,docker.service 的设置为:ExecStart=/usr/bin/dockerd -H fd://,这将覆盖写到 daemon.json 中的任何 hosts 。通过在 override.conf 文件中将 ExecStart 仅仅定义为:ExecStart=/usr/bin/dockerd,这将会使用在 daemon.json 中设置的 hosts 。这个文件中的第一行ExecStart= 必须要有,因为它将用于清除默认的 ExecStart 参数。如果是修改 docker.service 的文件而不是创建 override.conf,那么下次 systemd 重启时,docker.service 文件也会被重新创建。

然后在 /etc/docker/daemon.json (没有就新建一个,下文统一简称 daemon.json)中写入以下内容

复制代码
{
  "hosts":[
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2375"
  ]
}

该文件必须符合 json 规范写法,否则 Docker 将不能启动

重新加载 daemon 并重启 docker 服务:

复制代码
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

检查端口监听:

复制代码
$ sudo netstat -ntlp |grep dockerd
tcp6       0      0 :::2375                 :::*                    LISTEN      2439/dockerd

在远程主机上面通过 tcp socket 来访问本机的 Docker Daemon 服务:

复制代码
$ docker -H  192.168.205.10:2375 images

$ docker -H  192.168.205.10:2375 ps

其中 192.168.1.130 是开放了远程访问的主机的 IP。

第二种

这种就很简单暴力,直接修改/lib/systemd/system/docker.service文件,注释掉默认的 ExecStart 并添加新的 ExecStart 配置:

复制代码
# ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

然后重启 docker.service:

复制代码
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

这样 dockerd 就开始监听 tcp 端口 2375 了

Docker 与 Dockerd 的交互

Docker 客户端与 dockerd 之间就是通过 REST 的方式通信的。前面我们已经让 dockerd 监听 tcp 端口了,所以我们可以使用 curl 来代替 docker 客户端。这里我们简单的演示如何请求 dockerd 从 docker hub 上下载 hello-world 镜像:

复制代码
$ curl '127.0.0.1:2375/images/create?fromImage=hello-world&tag=latest' -X POST

{"status":"Pulling from library/hello-world","id":"latest"}
{"status":"Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0"}
{"status":"Status: Image is up to date for hello-world:latest"}

如果去看看 Engine API,你会发现其它的请求也都是用类似方式发送的,更多API可以参考官方文档,目前最新的版本是v1.40:Docker Engine API v1.40 Reference

相关推荐
xhaxy4 小时前
docker
docker·容器·eureka
上火的金鱼妹7 小时前
K8S基础组件作用和关系整理
linux·运维·服务器·kubernetes
一技安身7 小时前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka
鸿观工坊11 小时前
Docker 多阶段构建实践指南
docker
大牧师13 小时前
MySQL 学习教程
数据库·sql·mysql·docker·node·全栈·后端数据
MC丶科14 小时前
软考架构师90天冲刺|DAY44·Redis高级应用
数据库·数据仓库·redis·缓存·oracle·容器·规格说明书
天外天-亮15 小时前
docker + window 安装
运维·docker·容器
进击的小菜鸡dd15 小时前
docker 容器的挂载映射关系查看
运维·docker·容器
SLD_Allen15 小时前
从 HPA 到 KEDA:Kubernetes 弹性伸缩的进阶实践
云原生·容器·kubernetes
程序员老赵15 小时前
Docker 部署 TeX Live:轻松搭建 LaTeX 论文排版编译平台
前端·docker·latex