使用docker-compose将docker容器相互链接时如何处理IP地址?

k0p*_*kus 25 ip docker docker-compose

我正在使用docker-compose来构建一个完整的开发堆栈.

该应用程序需要一个mysql服务器才能工作.

mysql服务器是docker-compose设置的外部容器:

mysql:
    image: mysql:5.6
    volumes:
        - /data/mysql:/var/lib/mysql
        - ./docker/mysql.d:/etc/mysql/conf.d
    ports:
        - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: password
Run Code Online (Sandbox Code Playgroud)

该应用程序有自己的docker-compose.yml并引用mysql容器:

my-application:
    build: . # the Dockerfile resides in the current folder
    ports:
        - "9180:80"
        - "9543:443"
    external_links:
        - mysql_mysql_1:mysql
environment:
    DOCKER_ENVIRONMENT: dev
    DB_NAME: local_db
    DB_PASS: password
    DB_USER: root
    DB_HOST: # how to set the mysql's IP address?
Run Code Online (Sandbox Code Playgroud)

我无法在docker-compose中传递它们,因为它是动态的.

我知道应用程序知道mysql IP地址,因为我设置了某些变量:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241
Run Code Online (Sandbox Code Playgroud)

然而,这不是我的要求DB_HOST.

我可以以某种方式映射变量DB_HOST或以不同方式设置它吗?

k0p*_*kus 29

您不必设置IP,但可以引用容器的虚拟主机名,这与您为链接容器命名的值相同.

这意味着您确实docker-compose.yml可以使用links(推荐)或者设置DB_HOST external_links:

your_application:
    build: .
    ports:
        - "9180:80"
        - "9543:443"
    external_links:
        - mysql_mysql_1:docker-mysql
    environment:
        DB_HOST: docker-mysql
Run Code Online (Sandbox Code Playgroud)

当您连接到docker容器时,您可以连接到您的mysql容器:

application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360
Run Code Online (Sandbox Code Playgroud)

当你从同一个docker-composer.yml链接容器时,它也是一样的.

这也记录在案:

链接到另一个服务中的容器.指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称(也将用于别名).

links:
 - db
 - db:database
 - redis
Run Code Online (Sandbox Code Playgroud)

将在此服务的容器内的/ etc/hosts中创建具有别名'name的条目,例如:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis
Run Code Online (Sandbox Code Playgroud)

还将创建环境变量 - 有关详细信息,请参阅环境变量参考.

  • 注意,截至今天使用docker-compose文件的版本2时,不再创建环境变量引用.请参阅https://docs.docker.com/compose/link-env-deprecated/ (2认同)