写在前面
最近在玩gitlab-runner
是基于docker
的部署,于是乎出现了一个问题,当我要把编译好的可执行程序打包成docker
时,处于容器内部无法使用docker
相关命令。本文就是解决了这个问题。
一、docker
的一个基本概念
-
docker
分为client
与server
端,当我们执行apt-get install docker.io
时,实际上安装两个端,本地模式使用的时候都是这样。 -
安装完成后可以看到
/var/run/docker.sock
文件,这是个client
与server
交互的通讯sock
。有它你就可以与docker server
通讯,执行一系列操作。 -
docker
的官网文档上有3种API,python、golang、http
,都依赖于/var/run/docker.sock
文件。这三种方式我都不选,原因是,太麻烦。
二、如何实现在容器内调用宿主机的docker
命令
-
需要在创建容器的时候将宿主机的
/var/run/docker.sock
文件,挂载到容器。- 这是一个挂载的例子:
gitlab-runner:
container_name: gitlab-runner
build: docker
restart: always
environment:
TZ: 'Asia/Shanghai'
volumes:
- '/home/devusr/data/gitlab-runner/config:/etc/gitlab-runner'
- '/var/run/docker.sock:/var/run/docker.sock'
-
需要在容器内部安装
docker client
- 我这里以
乌班图
为例
apt-get install docker.io
这个安装会安装
client
与server
,只不过server
无法启动,具体原因想必不用我在这里多说。你可以找其他安装包,选择只安装client
。 - 我这里以
-
将当前虚拟机非
root
用户加入到docker
组- 查看刚刚安装的
docker
是否已经创建了docker
用户组,(如果存在就不要再创建了)
cat /etc/group | grep docker
- 创建
docker
用户组
groupadd -g 999 docker
- 把非
root
用户加入到docker
组
usermod -aG docker gitlab-runner
- 增加执行权限
chmod a+rw /var/run/docker.sock
- 查看刚刚安装的
好了,到这里,已经可以在docker
容器种执行宿主机的docker
命令了,本质是在docker
容器种使用docker client
,利用宿主机的/var/run/docker.sock
与宿主机docker server
进行通信。
三、需要注意的事情
-
将宿主机
docker
的/var/run/docker.sock
映射到容器,这是个非常不安全的操作,相当于打开了大门,容器可以随意操作宿主机docker
上的所有资源(包括所有的容器、镜像等等)。 -
此教程的目的是不改变原有操作
docker
的习惯,保持docker
命令操作,方便脚本兼容。
评论区