运行 Docker 来自 Docker 容器

Running Docker from a Docker container

为我的论文做一个项目,其中涉及一个 angular 前端,它与一个节点 API 后端对话,该后端需要使用 docker 从图像 运行 创建容器控制台输出的几行代码。

我已经使用 docker-compose 为我的前端和后端创建了两个 docker 容器。

我的后端 (api) 容器需要一种使用 dockerode 连接到 docker 的方法,但我不确定该怎么做。

version: "3"
services:
  app:
    build: ./frontend
    ports:
      - "3001:4200"
    volumes:
      - ./frontend:/code
    depends_on:
      - api
  api:
    build: ./backend
    ports:
      - "3000:8080"
    volumes:
      - ./backend:/code

我试过了:

1 在我的主机上使用 docker-machine (windows 10) 但每当我尝试通过 dockerode 从 docker 容器(后端)连接时 'ReferenceError: docker is not defined' 但我不确定 docker-machine 在我的主机上 运行 是否正确,因为我在 windows 10 使用 hyper-v.

const docker = new Docker({host: 'http://192.168.0.23', port: 3000});

2 将 docker 安装到 docker 容器中,但每次都失败,当成功安装时,它不会在系统上将 'docker' 识别为 运行ning。

3 将 docker 图像添加到 docker-compose 文件,我认为这可行吗?对我来说,不,但不知道这是不是因为 docker 图片

的网络不是预期用途
  docker:
   image: docker
   ports: 
    - "2376:2376"
   stdin_open: true
   tty: true
   volumes:
    - /var/run/docker.sock:/var/run/docker.sock

我是 docker 的新手,尤其是网络方面,我一直在研究 docker-machine、docker-swarm 和 Kubernetes 之类的东西,以找到最佳解决方案。

任何对此的见解将不胜感激,因为该项目的最大障碍是让我的后端 API 在已部署的环境中与 docker 交谈。

我不知道这是否适用于所有人,但将 dind 添加到我的项目中可以满足我的需要。

docker-in-docker:
  image: docker:dind
  environment:
    DOCKER_TLS_CERTDIR: ""
  privileged: true
  volumes:
    - /var/lib/docker
  expose:
    - 2375
    - 2376

并且对于 docker 中的任何容器,将连接到 "docker-in-docker" 的 compose 在他们的服务中需要这个。 "DOCKER_TLS_CERTDIR" 是删除 TLS

  links:
    - docker-in-docker
  environment:
    DOCKER_HOST: http://docker-in-docker:2375
    DOCKER_TLS_CERTDIR: ""

给任何使用 dockerode 的人的另一个注意事项,当在我的本地使用 async & await 时很好,但是一旦将它移动到 docker 我总是会得到 docker is undefined可以通过使用 .then 来修复的环境。