我们使用的docker,都是在本机之内使用的,即docker服务端与客户端都有同一个机器,但是,有时候,需要在本机连接远程服务器的docker,本文就此情形展开研究。
基础知识:docker的运行
我们使用apt安装docker后,会自动配置很多东西,只是这些操作隐藏起来了,让我们使用一个apt-get install
就完成操作。docker分服务端和客户端,但是在命令形式上区分不出来。我们在运行service docker start
之后,docker服务就启动了,可以使用ps aux | grep docker
来查询,如下:
1 | root 11602 0.5 2.3 570236 47856 ? Ssl 11:57 0:00 /usr/bin/dockerd -H fd:// |
可以看到,有一个名称为dockerd
的进程,从名称看出,这是一个守护进程(d
为daemon
的首字母),所以它就是docker的服务器。这个服务器必须运行,如果不运行,是无法正常使用大部分的docker命令的(但docker -v
不受影响)。比如:
1 | # docker images |
错误提示信息十分明显:就是没有运行服务器。
只是平常我们都在同一机子上使用docker,对这些没有留意,以为只有一个docker
程序。
既然有服务器,那么就可以将docker服务布置到其它机器,或者使用其它机器上的docker服务。
问题提出
考虑以下场合:
jenkins部署在docker里,但CICD中需要在jenkins中构建docker镜像。方法有:
- docker in docker,在docker容器中安装docker服务,需要在docker run 时添加特权选项。
- docker in docker,挂载宿主的docker服务,jenkins只需要docker客户端。
- jekins远程到其它主机,在该主机上进行构建。
本文使用第三方的docker服务器。
实现方案
首先停止docker服务:
1 | service docker stop |
修改/lib/systemd/system/docker.service
文件,将原来的:
1 | ExecStart=/usr/bin/dockerd -H fd:// |
修改为:
1 | ExecStart=/usr/bin/dockerd -H tcp://192.168.1.78:2376 |
注意,tcp://192.168.1.78
本笔者的测试机器IP,需要根据实际情况修改。
重新启动:
1 | systemctl daemon-reload |
使用示例:
1 | docker -H tcp://192.168.1.78:2376 build -t busybox_t . |
生成的镜像位于192.168.1.78。
如果服务没运行,则会提示Cannot connect to the Docker daemon at tcp://192.168.1.78:2376. Is the docker daemon running?
。这也前面的错误消息是类似的。
在docker服务器上查看:
1 | docker -H tcp://192.168.1.78:2376 images |
小结
1、只能将docker服务器单独针对此场合而用。在命令操作上,必须在docker后添加-H tcp://192.168.1.78:2376
。其它选项、参数无变化。如果不添加会卡住,因为没有指定docker服务器。
2、本文仅仅进行尝试,对此种方法还没有太多的认识和实践指导。