docker中使用docker

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker中使用docker相关的知识,希望对你有一定的参考价值。

参考技术A

Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。

为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。
Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。
或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。

我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的, 该如何在这些容器里面调用 docker run 命令启动包含 CI 环境的镜像呢?
在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build 将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?

答案下面揭晓。

Docker 采取的是 Client/Server 架构,我们常用的 docker xxx 命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。

我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service 来启用该服务。
这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service ,能看到有这样一条语句:

默认情况下,Docker守护进程会生成一个 socket( /var/run/docker.sock )文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。

sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。

因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。

要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".

运行过Docker Hub的Docker镜像的话,会发现其中一些容器时需要挂载/var/run/docker.sock文件。这个文件是什么呢?为什么有些容器需要使用它?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。

在容器内部使用宿主机的 docker,方法有二:

容器的启动方式也有两种,如下:

示例命令如下:

必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock 的用户) 然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。

docker-compose.yml 文件内容如下:

然后通过 docker-compose up -d 即可后台启动容器。

通过上面的操作,我们在容器内执行 docker ps 时,还是很可能会遇到一个问题: 权限问题

如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock 的 onwer 就是 root.

但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock 了。

解决办法:

方法一(不一定有效):在构建镜像时,最后一层添加如下内容:

方法二:经测试一定有效,在Dockerfile中使用USER参数

这样我们构建的镜像就是root用户了,经测试在docker-compose.yaml文件中user参数并不好用,类似如下

这样我们的默认用户,就能使用 docker 命令了。

参考

以上是关于docker中使用docker的主要内容,如果未能解决你的问题,请参考以下文章

dockerdocker虚拟容器的使用大全

Docker学习总结(61)——DockerDocker-ComposeDocker swarm K8s 之间的区别

Docker学习总结(61)——DockerDocker-ComposeDocker swarm K8s 之间的区别

DockerDocker配置

DockerDocker数据卷模式(bind mount与docker managed volume)数据卷插件convoy之NDF部署使用

云原生 • DockerDocker常用命令总结(值得收藏)