Edu*_*ass 39 docker docker-compose
初学者Docker的问题在这里,
所以我有一个开发环境,我正在运行模块化应用程序,它使用Docker Compose运行3个容器:服务器,客户端,数据库.
该docker-compose.yml如下所示:
#############################
# Server
#############################
server:
container_name: server
domainname: server.dev
hostname: server
build: ./server
working_dir: /app
ports:
- "3000:3000"
volumes:
- ./server:/app
links:
- database
#############################
# Client
#############################
client:
container_name: client
domainname: client.dev
hostname: client
image: php:5.6-apache
ports:
- "80:80"
volumes:
- ./client:/var/www/html
#############################
# Database
#############################
database:
container_name: database
domainname: database.dev
hostname: database
image: postgres:9.4
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=root
- POSTGRES_DB=dbdev
- PG_TRUST_LOCALNET=true
ports:
- "5432:5432"
volumes:
- ./database/scripts:/docker-entrypoint-initdb.d # init scripts
Run Code Online (Sandbox Code Playgroud)
您可以看到我为每个域分配了一个.dev域名,这可以很好地看到另一台机器(Docker内部网络),例如这里我正在server.dev从client.devCLI中ping :
root@client:/var/www/html# ping server.dev
PING server.dev (127.0.53.53): 56 data bytes
64 bytes from 127.0.53.53: icmp_seq=0 ttl=64 time=0.036 ms
Run Code Online (Sandbox Code Playgroud)
这在内部工作得很好,但在主机OS网络上却不行.
为方便起见,我想在MY本地网络中分配域,而不是Docker容器网络,以便我可以在浏览器URL上键入:client.dev并加载Docker容器.
现在,我只能使用Docker IP,这是动态的:
client: 192.168.99.100:80
server: 192.168.99.100:3000
database: 192.168.99.100:5432
Run Code Online (Sandbox Code Playgroud)
是否有自动/方便的方法来执行此操作,而不涉及我手动将IP添加到我的/ etc/hosts文件中?
顺便说一下,如果有任何相关性,我会使用OSX.
谢谢!
编辑:我发现这个似乎有关的Github问题:https://github.com/docker/docker/issues/2335
据我所知,他们似乎说这是一个不可用的东西,他们建议外部工具,如:
那是对的吗?如果是这样,我应该在我的特定场景中选择哪一个?
Edu*_*ass 22
好,
因为似乎没有本地方法可以用Docker做到这一点,我终于选择了Ryan Armstrong的替代解决方案,它包括动态更新/etc/hosts文件.
我选择了这个,因为它对我来说很方便,因为它作为一个脚本工作,我已经有了一个启动脚本,所以我可以将这个函数添加到它中.
以下示例创建名为docker.local的主机条目,该条目将解析为您的docker-machine IP:
Run Code Online (Sandbox Code Playgroud)update-docker-host(){ # clear existing docker.local entry from /etc/hosts sudo sed -i '' '/[[:space:]]docker\.local$/d' /etc/hosts # get ip of running machine export DOCKER_IP="$(echo ${DOCKER_HOST} | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" # update /etc/hosts with docker machine ip [[ -n $DOCKER_IP ]] && sudo /bin/bash -c "echo \"${DOCKER_IP} docker.local\" >> /etc/hosts" } update-docker-host
/etc/hosts当我通过启动脚本启动Docker机器时,这将自动添加或更新我的主机操作系统上的行.
无论如何,正如我在研究期间发现的那样,除了编辑hosts文件之外,您还可以通过设置自定义DNS服务器来解决此问题:
还在Github上找到了几个项目,显然是为了解决这个问题,虽然我没有尝试过:
tha*_*smt 11
扩展@ eduwass自己的答案,这是我手动完成的(没有脚本).
domainname: myapp.dev,hostname: www在docker-compose.yml文件中定义和docker-compose exec client cat /etc/hosts得到容器的hosts文件的输出(其中client是您的服务名称)(输出例如:172.18.0.6 www.myapp.dev)/etc/hosts文件并添加该行:172.18.0.6 server.server.dev如果您的Docker服务容器更改IP或做任何想象的事情,您将需要更复杂的解决方案,但这对我目前的简单需求起作用.
| 归档时间: |
|
| 查看次数: |
29930 次 |
| 最近记录: |