如何获取从 docker-in-docker 创建的 docker 镜像

时间:2021-01-28 19:56:54

标签: docker

我正在使用 docker:dind 创建一些图像。它工作正常。当我在 docker:dind 容器中执行并执行 docker imagesdocker ps 时,我可以分别看到图像和容器。

但不总是在 docker:dind 容器中执行,如何从外部列出图像和容器?

(我知道这是可能的,因为我读过一篇关于此的文章。但我似乎找不到那篇好文章。)

1 个答案:

答案 0 :(得分:0)

Docker 套接字

Docker 使用 unix(在大多数情况下)套接字与其 Daemon 通信,因此您需要将此套接字文件挂载到正在运行的容器中。

Docker 套接字通常在 /var/run/docker.sock

如果 docker 在 VM 上运行,docker 中的 Docker 可能会很困难。


docker 中的 Docker

让我们做一些简单的例子。

1.拉取docker镜像

$ docker pull docker:latest

2.在docker中启动docker

首先,您需要找到您的 unix 套接字并将其挂载到带有 -v 标志的 docker 容器中。 Docker 将在完成执行传递的命令时执行。所以让我们为 sleep

执行 1 hour
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -d docker:latest sleep 3600
52201aaa3e6ebaaafab0a7323fd621f9f41765bad6363bf4eae43bf06c5825ee

3.让我们shell进入启动的容器

我们可以使用带有 exec 标志的 -ti 命令

$ docker exec -ti 52201aaa3e6ebaaafab0a7323fd621f9f41765bad6363bf4eae43bf06c5825ee sh
/ # 

4.尝试从docker容器启动MySQL

/ # docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=true  mysql:5.7

2021-01-28 20:17:24+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started.
2021-01-28 20:17:24+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-01-28 20:17:24+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started.
2021-01-28 20:17:24+00:00 [Note] [Entrypoint]: Initializing database files
...
...
...

2021-01-28T20:17:33.146086Z 0 [Note] Server socket created on IP: '::'.
2021-01-28T20:17:33.147569Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2021-01-28T20:17:33.156949Z 0 [Note] Event Scheduler: Loaded 0 events
2021-01-28T20:17:33.157405Z 0 [Note] mysqld: ready for connections.
Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

5.验证它是否正常工作

让我们在主机上打开另一个终端选项卡并验证启动的容器是否正常工作

$ docker ps | grep mysql:5.7
bc90ce617ee4        mysql:5.7              "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp                   trusting_neumann

就是这样。您正在 Docker 中运行 Docker。


另一个主机上的Docker

你也可以在你的电脑上启动 docker 容器,你可以在另一台机器上控制 Docker。要求是,远程计算机上的 docker 具有侦听 TCP 套接字的套接字,并且您可以与该端点进行通信。这是在VM中使用docker时常用的docker控制方式,可以在本地笔记本上,也可以在机房的某台服务器上进行开发。

要阅读更多内容,您可以在 the official docker documentation 中查看如何设置 docker daemon 监听 TCP 套接字以及如何连接到远程套接字