Docker目前采用了标准的C/S 架构,客户端和服务端既可以运行在一个机器上,也可以运行在不同的机器上并用过socket或者RESTful API来进行通信
1 | root@admin-dsq:/var/lib/docker# docker version |
1 | [root@docker-study ~]# docker version |
Server
Docker Daemon 一般在宿主机后台运行,作为服务端接受来自客户的请求(bulid、pull、run……)。
在设计上,Docker Daemon 是一个模块化的架构,通过专门的Engine模块来分发管理来自各个客户端的任务。
Docker端默认监听本地的unix:///var/run/docker.sock,只允许本地的root 或者 位于Docker用户组的成员访问。
Client
Docker客户端为用户提供一系列可执行命令,用户使用其与docker daemon 进行交互。
同样客户端默认通过本地的unix:///var/run/docker.sock套接字向server发送命令,如果server没有在监听默认的地址,则需要客户端在执行命令的时候显式指定服务端地址
配置远程访问
unix:///var/run/docker.sock方式(默认)
可以直接通过docker daemon -H 0.0.0.0:2375来进行监听端口的修改,但是修改后本地无法访问
第一个问题,没有daemon命令
1 | [root@docker-study ~]# docker daemon -H 0.0.0.0:2375 |
解决:
1 | [root@docker-study ~]# man docker | grep daemon |
看到里面又指出dockerd,继续看帮助手册
1 | NAME |
在描述中看到可以直接使用dockerd命令
又一个问题:
1 | [root@docker-study ~]# dockerd -H 0.0.0.0:2375 |
linux系统中/var/run/目录下的*.pid文件是一个文本文件,其内容只有一行,即某个进程的PID。.pid文件的作用是防止进程启动多个副本,只有获得特定pid文件(固定路径和文件名)的写入权限(F_WRLCK)的进程才能正常启动并将自身的进程PID写入该文件,其它同一程序的多余进程则自动退出。
原文https://blog.csdn.net/qq_29344757/article/details/79875693
1 | [root@docker-study ~]# systemctl stop docker |
此时另起一个终端
1 | [root@docker-study ~]# netstat -antp | grep 2375 #查看端口 |
回到上一个终端
1 | INFO[2019-04-01T15:37:43.503014754+08:00] API listen on [::]:2375 |
这种方法只是起到运行时的配置,并没有对配置文件进行修改,Ctrl+c 后,处理信号中断,2375端口关闭
tcp://host:port方式
admin-dsq为server,docker-study为client
在Server端对docker.server作如下修改
1 | root@admin-dsq:/var/lib/docker# cat /lib/systemd/system/docker.service |
1 | [root@docker-study ~]# docker -H 172.18.74.62 info |
现在使用命令docker info连接的就是服务端的docker了
关于第一个警告是此方法没有安全认证,任何对远程API的访问等同于对主机根目录的访问,在下一篇文章中在进行安全认证。
关于第二个警告:
摘自http://www.talkwithtrend.com/Question/123541?order=asc
根据错误提示,只是cgroups中的swap account没有开启。这个功能应该是用在 类似docker run -m=1524288 -it ubuntu /bin/bash 的命令,用来限制一个docker容器的内存使用上限,所以这里只是WARNING,不影响使用。
解决办法:
1 | When users run Docker, they may see these messages when working with an image: |
RESTful API方式
1 | [root@docker-study ~]# curl 172.18.74.62:2375/info |
详情见: https://docs.docker.com/develop/sdk/
https://docs.docker.com/engine/api/
https://docs.docker.com/registry/spec/api/
https://docs.docker.com/reference/dtr/2.6/api/
https://docs.docker.com/reference/ucp/3.1/api/