写在前面
最近在玩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命令操作,方便脚本兼容。

评论区