我想在一个沙盒Docker环境中运行我的Docker容器。所以,我使用Docker-in-Docker DinD。
我使用docker-compose.yaml
来定义沙箱:
version: '3.8'
services:
docker:
hostname: docker
container_name: dind
image: docker:latest
privileged: yes
myapp:
hostname: myapp
container_name: myapp
image: foox/myapp:1.1.0
ports:
- 8080:8080
但是我现在很困惑,如果我用这个运行docker-compose up
,在我的主机上运行的Docker如何知道myapp
服务应该由主机docker还是DinD启动?
在上面的docker-compose.yaml
中,我应该包括哪些关键语句,以便明确地告诉在DinD而不是主机docker中运行myapp
?
1条答案
按热度按时间cnjp1d6j1#
你试图告诉Compose在两个不同的Docker示例中创建容器。一个容器应该在正常的主机Docker环境中运行,但你要求另一个在Docker-in-Docker环境中运行。Compose没有任何方法可以做到这一点;它希望它创建的所有东西(容器、网络、卷)都属于“同一个”Docker。
要做到这一点,你应该做一个正常的Compose设置来运行你的应用程序。特别要注意的是,因为你打算在一个非本地系统的环境中运行这个程序,所以要确保你没有任何引用本地文件的
volumes:
。这与可以在本地运行应用程序的Compose设置相同,或者原则上针对远程Docker运行应用程序。您可以在主机系统上正常运行
docker-compose up -d
,这对于大多数正常使用来说应该足够了-您几乎不需要Docker-in-Docker,根据我的经验,看到它是非常不寻常的。如果你确实需要DinD,你需要启动Docker守护进程容器,然后你需要告诉各种Docker工具如何到达它。
然后,您需要启动这个嵌套的Docker守护进程,并将Compose指向它。
请注意,此设置允许对嵌套的Docker守护程序进行未加密和未验证的访问;虽然它在容器中运行,但它是一个特权容器,任何本地进程都可能造成一些损害。Docker Hub
docker
image page描述了一种更健壮的TLS证书设置,以及一种更好的方法,即根本不将ports:
发布到DinD容器之外。如果所有这些都使Docker-in-Docker设置听起来很难使用,那么conventional advice就是为了避免它,即使在CI系统中,给予每个构建提供自己的完全隔离的Docker设置似乎很有用。