侧边栏壁纸
博主头像
术业有道之编程博主等级

亦是三月纷飞雨,亦是人间惊鸿客。亦是秋霜去叶多,亦是风华正当时。

  • 累计撰写 99 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

在docker容器中执行docker命令

Administrator
2021-08-26 / 0 评论 / 0 点赞 / 209 阅读 / 3128 字

写在前面

最近在玩gitlab-runner是基于docker的部署,于是乎出现了一个问题,当我要把编译好的可执行程序打包成docker时,处于容器内部无法使用docker相关命令。本文就是解决了这个问题。

一、docker的一个基本概念

  • docker分为clientserver端,当我们执行apt-get install docker.io 时,实际上安装两个端,本地模式使用的时候都是这样。

  • 安装完成后可以看到/var/run/docker.sock文件,这是个clientserver交互的通讯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
    这个安装会安装clientserver,只不过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命令操作,方便脚本兼容。

个人公众号

0

评论区