问题描述
正在开发一个Docker Compose设置,以改善本地开发环境。他希望能够通过类似于https://api.testapi.local
的URL访问容器,而不是使用http://localhost:8000
。他想知道是否有可能在不修改/etc/hosts
文件的情况下实现这一点。以下是docker-compose文件的片段:
version: "3.9"
services:
nginx:
hostname: nginx
domainname: nginx.local
image: nginx:latest
restart: unless-stopped
volumes:
- ./nginx/:/etc/nginx/conf/
- ./nginx/public/:/usr/share/nginx/html/
ports:
- 80:80
- 443:443
networks:
workdevnet:
aliases:
- nginx
api:
hostname: api
domainname: testapi.local
image: python:latest
volumes:
- ./api/:/usr/src/app/
- ./api/public/:/usr/src/app/public
ports:
- "8000:80"
networks:
workdevnet:
aliases:
- testapi
environment:
- DB_HOST=db
- DB_USER=root
- DB_PASSWORD=123456
- DB_NAME=db
depends_on:
- db
db:
hostname: db
domainname: testdb.local
image: postgre:latest
volumes:
- ./db/:/var/lib/postgresql/data
ports:
- "15432:5432"
networks:
workdevnet:
aliases:
- testdb
environment:
- POSTGRES_DB=db
- POSTGRES_USER=root
- POSTGRES_PASSWORD=123456
networks:
workdevnet:
driver: bridge
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
要在不修改/etc/hosts
文件的情况下实现通过伪域名访问Docker容器,可以使用dnsmasq
或dnsmasq-docker
等DNS服务器来解析域名。以下是实现的步骤:
- 安装并配置
dnsmasq
或dnsmasq-docker
。 - 将
testapi.local
和nginx.local
添加到DNS服务器的解析列表中。 - 更新Docker Compose文件以使用伪域名。
以下是一个示例配置:
- 安装
dnsmasq
或dnsmasq-docker
。 - 对于Linux用户,可以使用以下命令安装
dnsmasq
:
bash
sudo apt-get install dnsmasq - 对于Mac用户,可以使用以下命令安装
dnsmasq
:
bash
brew install dnsmasq -
对于Windows用户,可以使用
dnsmasq-docker
,具体安装步骤请参考相关文档。 -
配置
dnsmasq
或dnsmasq-docker
。 - 对于Linux和Mac用户,可以编辑
/etc/dnsmasq.conf
文件,并添加以下内容:
address=/testapi.local/127.0.0.1
address=/nginx.local/127.0.0.1 -
对于Windows用户,请参考相关文档配置
dnsmasq-docker
。 -
更新Docker Compose文件以使用伪域名。
- 将
api
服务的domainname
属性更改为testapi.local
:
yaml
api:
hostname: api
domainname: testapi.local
# 其他配置... - 将
nginx
服务的domainname
属性更改为nginx.local
:
yaml
nginx:
hostname: nginx
domainname: nginx.local
# 其他配置...
方案2
如果不想使用DNS服务器,还可以通过修改/etc/hosts
文件来实现通过伪域名访问Docker容器。以下是实现的步骤:
-
打开终端并编辑
/etc/hosts
文件:
bash
sudo nano /etc/hosts -
添加以下条目到文件末尾:
127.0.0.1 testapi.local
127.0.0.1 nginx.local -
保存并关闭文件。
-
更新Docker Compose文件以使用伪域名。
- 将
api
服务的domainname
属性更改为testapi.local
:
yaml
api:
hostname: api
domainname: testapi.local
# 其他配置... - 将
nginx
服务的domainname
属性更改为nginx.local
:
yaml
nginx:
hostname: nginx
domainname: nginx.local
# 其他配置...
请注意,使用这种方法需要在每台开发机器上手动修改/etc/hosts
文件。
方案3
如果你希望在共享的Docker Compose文件中实现通过伪域名访问Docker容器,并且不修改/etc/hosts
文件,可以使用docker-compose-etc-hosts
工具。以下是实现的步骤:
- 安装
docker-compose-etc-hosts
工具。 - 对于Linux和Mac用户,可以使用以下命令安装:
bash
pip install docker-compose-etc-hosts -
对于Windows用户,请参考相关文档安装。
-
在Docker Compose文件所在的目录中创建一个
.env
文件,并添加以下内容:
ETCHOSTS_HOSTS=testapi.local,nginx.local
-
在终端中运行以下命令以启动容器:
bash
docker-compose up -d
这将自动将伪域名添加到容器的/etc/hosts
文件中,以便通过伪域名访问Docker容器。
请注意,使用这种方法需要在每台开发机器上安装docker-compose-etc-hosts
工具。
总结
通过使用DNS服务器、修改/etc/hosts
文件或使用docker-compose-etc-hosts
工具,可以实现通过伪域名访问Docker容器。选择适合你的方法,并根据需要更新Docker Compose文件。