Docker - 从一个链接容器向另一个链接容器发出命令
Docker - issue command from one linked container to another
我正在尝试使用 2 个 Docker 容器设置原始 CI/CD 管道——我将它们称为 jenkins 和 节点应用。我的目标是让 jenkins 容器在提交到 GitHub 存储库后 运行 完成一项工作(完成)。该作业应该 运行 在 node-app 容器上的 deploy.sh
脚本。因此,当开发人员提交 GitHub 时,jenkins 获取提交,然后开始一项工作,包括自动化测试(将来),然后在 上进行部署=]node-app.
jenkins 容器正在使用最新的镜像 (Dockerfile).
node-app 容器的 Docker 文件是:
FROM node:latest
EXPOSE 80
WORKDIR /usr/src/final-exercise
ADD . /usr/src/final-exercise
RUN apt-get update -y
RUN apt-get install -y nodejs npm
RUN cd /src/final-exercise; npm install
CMD ["node", "/usr/src/final-exercise/app.js"]
jenkins 和 node-app 使用 Docker Compose 链接,并且 docker-compose.yml
文件包含(更新,感谢@alkis):
node-app:
container_name: node-app
build: .
ports:
- 80:80
links:
- jenkins
jenkins:
container_name: jenkins
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
容器是使用 docker-compose up -d
构建的,并按预期启动。 docker ps
产量(更新):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69e52b216d48 finalexercise_node-app "node /usr/src/final-" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp node-app
5f7e779e5fbd jenkins "/bin/tini -- /usr/lo" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
我可以从 node-app ping jenkins,反之亦然。
这可能吗?如果不是,我是否犯了架构错误?
非常感谢您,我很感激!
编辑:
我偶然发现 nsenter
并使用 this and this 轻松进入容器的 shell。然而,这些都假设源(在他们的例子中是主机,在我的例子中是 jenkins 容器)安装了 Docker 以找到目标容器的 PID .我可以从主机 nsenter
进入 node-app,但是 jenkins.
仍然没有运气
node-app:
build: .
ports:
- 80:80
links:
- finalexercise_jenkins_1
jenkins:
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
试试上面的方法。您正在按图像名称链接,但您必须使用容器名称。
在您的情况下,由于您没有明确指定容器名称,因此它会像这样 auto-generated
finalexercise : folder where your docker-compose.yml is located
node-app : container configs tag
1 : you only have one container with the prefix finalexercise_node-app. If you built a second one, then its name will be finalexercise_node-app_2
yml文件的设置:
node-app:
build: .
container_name: my-node-app
ports:
- 80:80
links:
- my-jenkins
jenkins:
image: jenkins
container_name: my-jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
当然您也可以为 node-app 指定一个容器名称,这样您就可以使用常量进行通信。
更新
为了测试,登录到 jenkins 容器的 bash 终端
docker exec -it my-jenkins bash
然后尝试 ping my-node-app,甚至是特定端口的 telnet。
ping my-node-app:80
或者你可以
telnet my-node-app 80
更新
您想做的事,exec
command 可以轻松完成。
您可以从您的主机执行此操作(尝试一下以确保它正常工作)
docker exec -i <container_name> ./deploy.sh
如果上述方法有效,那么您的问题委托给从容器执行相同的命令。实际上你不能这样做,因为发出命令的容器 (jenkins) 无法访问主机的 docker 安装(它不仅可以识别命令,还可以控制你需要的容器进入)。
我都没有用过,但我知道有两个解决方案
- 使用这个官方 guide 获得对您主机的 docker 守护程序的访问权限,并从您的容器发出 docker 命令,就好像您是从您的主机上执行的那样。
- 将 docker 二进制文件和套接字安装到容器中,这样容器就好像它是主机一样(每个命令都将由主机的 docker 守护进程执行,因为它是共享的).
来自 SO 的 提供了有关此问题的更多见解。
我正在尝试使用 2 个 Docker 容器设置原始 CI/CD 管道——我将它们称为 jenkins 和 节点应用。我的目标是让 jenkins 容器在提交到 GitHub 存储库后 运行 完成一项工作(完成)。该作业应该 运行 在 node-app 容器上的 deploy.sh
脚本。因此,当开发人员提交 GitHub 时,jenkins 获取提交,然后开始一项工作,包括自动化测试(将来),然后在 上进行部署=]node-app.
jenkins 容器正在使用最新的镜像 (Dockerfile).
node-app 容器的 Docker 文件是:
FROM node:latest
EXPOSE 80
WORKDIR /usr/src/final-exercise
ADD . /usr/src/final-exercise
RUN apt-get update -y
RUN apt-get install -y nodejs npm
RUN cd /src/final-exercise; npm install
CMD ["node", "/usr/src/final-exercise/app.js"]
jenkins 和 node-app 使用 Docker Compose 链接,并且 docker-compose.yml
文件包含(更新,感谢@alkis):
node-app:
container_name: node-app
build: .
ports:
- 80:80
links:
- jenkins
jenkins:
container_name: jenkins
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
容器是使用 docker-compose up -d
构建的,并按预期启动。 docker ps
产量(更新):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69e52b216d48 finalexercise_node-app "node /usr/src/final-" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp node-app
5f7e779e5fbd jenkins "/bin/tini -- /usr/lo" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
我可以从 node-app ping jenkins,反之亦然。
这可能吗?如果不是,我是否犯了架构错误?
非常感谢您,我很感激!
编辑:
我偶然发现 nsenter
并使用 this and this 轻松进入容器的 shell。然而,这些都假设源(在他们的例子中是主机,在我的例子中是 jenkins 容器)安装了 Docker 以找到目标容器的 PID .我可以从主机 nsenter
进入 node-app,但是 jenkins.
node-app:
build: .
ports:
- 80:80
links:
- finalexercise_jenkins_1
jenkins:
image: jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
试试上面的方法。您正在按图像名称链接,但您必须使用容器名称。 在您的情况下,由于您没有明确指定容器名称,因此它会像这样 auto-generated
finalexercise : folder where your docker-compose.yml is located
node-app : container configs tag
1 : you only have one container with the prefix finalexercise_node-app. If you built a second one, then its name will be finalexercise_node-app_2
yml文件的设置:
node-app:
build: .
container_name: my-node-app
ports:
- 80:80
links:
- my-jenkins
jenkins:
image: jenkins
container_name: my-jenkins
ports:
- 8080:8080
volumes:
- /home/ec2-user/final-exercise:/var/jenkins
当然您也可以为 node-app 指定一个容器名称,这样您就可以使用常量进行通信。
更新
为了测试,登录到 jenkins 容器的 bash 终端
docker exec -it my-jenkins bash
然后尝试 ping my-node-app,甚至是特定端口的 telnet。
ping my-node-app:80
或者你可以
telnet my-node-app 80
更新
您想做的事,exec
command 可以轻松完成。
您可以从您的主机执行此操作(尝试一下以确保它正常工作)
docker exec -i <container_name> ./deploy.sh
如果上述方法有效,那么您的问题委托给从容器执行相同的命令。实际上你不能这样做,因为发出命令的容器 (jenkins) 无法访问主机的 docker 安装(它不仅可以识别命令,还可以控制你需要的容器进入)。
我都没有用过,但我知道有两个解决方案
- 使用这个官方 guide 获得对您主机的 docker 守护程序的访问权限,并从您的容器发出 docker 命令,就好像您是从您的主机上执行的那样。
- 将 docker 二进制文件和套接字安装到容器中,这样容器就好像它是主机一样(每个命令都将由主机的 docker 守护进程执行,因为它是共享的).
来自 SO 的