Docker配置远程连接

Docker配置远程连接

还是惯例,先贴官网地址

Docker架构

Docker基于CS(client-server)架构,Docker client简单来说就是执行docker ps, docker image list等命令的客户端,Docker daemon即运行在后台的dockerd进程,负责处理请求、运行、管理容器等工作,下图来自Docker官网,简单展示了Docker的架构。
在这里插入图片描述
既然是CS架构,Docker客户端就要连接Docker服务,二者可以作为同一主机上的两个进程,也可以是不同主机上的两个进程进行通信,都是使用REST API。另外,Docker Compose也是另一个单独的Docker client。

Docker Daemon

Docker daemon(dockerd)监听API请求并管理各种Docker对象,镜像、容器、网络和卷(volumes)。Docker daemon也可以与其他的daemon交互,管理docker服务。

Docker Client

Docker client(docker)是我们操作docker的接口,执行的docker命令被发送到Docker Daemon,处理后返回结果呈现在前端。Docker client可以同时与多个Docker Daemon交互。

Docker Desktop

Docker提供的图形化桌面应用,有Windows、Linux、Mac版本,涵盖了Docker Daemon、Docker client、Docker Compose、Docker Content Trust, Kubernetes,和Credential Helper,其中Windows是基于WSL的。

Docker registries

存储Docker镜像的地方,Pypi,Maven仓库类似。

Docker Daemon配置

配置Docker Daemon有两种方式

  • 使用JSON文件,默认位置是/etc/docker/daemon.json
  • dockerd启动参数
    这种方式又有两个位置可以配置
    1. /usr/lib/systemd/system/docker.service
    2. rootless模式下,/etc/systemd/system/docker.service.d/下所有的conf配置文件
      推荐使用第二种方式,如果没有找到docker.sevice文件,可能你不是使用包安装管理器安装的docker,可以参考这个github仓库安装服务。

可以同时使用两种方式,dockerd会将启动参数和JSON文件中的配置合并,前提是两个位置的配置不能冲突,不能出现相同的配置选项(key)。

配置Docker远程连接

Docker配置远程连接
默认情况下,dockerd在unix套接字上监听本地docker client连接。配置远程连接有加密(基于TLS)和不加密两种方式,都可以通过systemd或者daemon.json完成,两种配置不能有冲突,否则会导致dockerd启动失败

非安全方式

无需任何认证,任何客户端均可以与dockerd通信,不安全,不推荐。

TLS(HTTPS)安全方式

  1. 使用HTTPS会生成各种认证文件,新建文件夹用于生成这些文件。
mkdir /root/tls
cd /root/tls

# 环境变量,后面使用
HOST=服务器IP
  1. 生成CA证书
openssl genrsa -aes256 -out ca-key.pem 4096

以下是示例输出

Generating RSA private key, 4096 bit long modulus
…++
…++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Queensland
Locality Name (eg, city) []:Brisbane
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
Organizational Unit Name (eg, section) []:Sales
Common Name (e.g. server FQDN or YOUR name) []:$HOST
Email Address []:Sven@home.org.au

$HOST即上面设置的服务器IP

  1. 生成服务器公钥
openssl genrsa -out server-key.pem 4096
# Generating RSA private key, 4096 bit long modulus
#.....................................................................++
#.................................................................................................++
#e is 65537 (0x10001)
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
  1. 公钥签名
echo subjectAltName = DNS:$HOST,IP:$HOST,IP:127.0.0.1 >> extfile.cnf

echo extendedKeyUsage = serverAuth >> extfile.cnf
  1. 生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# Signature ok
# subject=/CN=your.host.com
# Getting CA Private Key
# Enter pass phrase for ca-key.pem:
  1. 为客户端生成证书
openssl genrsa -out key.pem 4096
# Generating RSA private key, 4096 bit long modulus
# .........................................................++
................++
# e is 65537 (0x10001)
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# Signature ok
# subject=/CN=client
# Getting CA Private Key
# Enter pass phrase for ca-key.pem:
  1. 删除无用文件,修改权限
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

最后有以下几个文件

-r-------- 1 root root 3326 Aug 19 08:27 ca-key.pem
-r--r--r-- 1 root root 2130 Aug 19 08:27 ca.pem
-rw-r--r-- 1 root root   41 Aug 19 08:44 ca.srl
-r--r--r-- 1 root root 1883 Aug 19 08:44 cert.pem
-r-------- 1 root root 3243 Aug 19 08:43 key.pem
-r--r--r-- 1 root root 1948 Aug 19 08:30 server-cert.pem
-r-------- 1 root root 3243 Aug 19 08:28 server-key.pem
  1. 配置Docker Daemon启动
    首先复制认证文件到/etc/docker
    cp -v {ca,cert,key}.pem /etc/docker
    
  • daemon.json方式,推荐
    1. vim /etc/docker/daemon.json,添加以下内容
    {
        "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
        "tls": true,
        "tlscacert": "/etc/docker/ca.pem",
        "tlscert": "/etc/docker/server-cert.pem",
        "tlskey": "/etc/docker/server-key.pem",
        "tlsverify": true
    }
    
    1. 覆盖systemd中host配置,否则会启动失败,vim /etc/systemd/system/docker.service.d/exec-start-conflit.conf
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
    
  • systemd方式
    vim /etc/systemd/system/docker.service.d/exec-start-conflit.conf
    [Service]
    ExecStart=
    ExecStart= --tlsverify --tls --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock
    

两种方式配置完后,都需要重启docker

systemctl daemon-reload
systemctl restart docker
# 检查2376端口是否打开
netstat -nltp | grep 2376
# 本地是否正常执行
docker ps

客户端连接Docker Daemon

拷贝ca.pem、cert.pem、key.pem到客户端主机指定文件夹。

docker --tlsverify \
    --tlscacert=ca.pem \
    --tlscert=cert.pem \
    --tlskey=key.pem \
    -H=$HOST:2376 version
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值