Edward
Edward

Reputation: 1883

Resolve container name in extra_hosts option in docker-compose

I need to curl my API from another container. Container 1 is called nginx Container 2 is called fpm

I need to by able to bash into my fpm container and curl the nginx container.

Config:

#docker-compose.yaml
services:
 
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    links:
      - fpm
    
    
  fpm:
    build:
      context: .
      dockerfile: ./docker/fpm/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
      - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
    env_file:
      - ./docker/mysql/mysql.env
      - ./docker/fpm/conf/dev/fpm.env
    links:
      - mysql
    shm_size: 256M
    extra_hosts:
      - myapi.docker:nginx

My initial thought was to slap it in the extra_hosts option like:

extra_hosts:
  - myapi.docker:nginx

But docker-compose up fails with:

ERROR: for apiwip_fpm_1 Cannot create container for service fpm: invalid IP address in add-host: "nginx"

I have seen some examples of people using docker's network configuration but it seems over the top to just resolve an address.

How can I resolve/eval the IP address of the container rather than just passing it literally?

Upvotes: 32

Views: 40150

Answers (5)

Denis Kovacevic
Denis Kovacevic

Reputation: 191

services:
  nginx:
    build:
    context: .
    dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    networks:
      my_network:
        aliases:
          - myapi.docker
          - docker_my_network
  fpm:
    build:
    context: .
    dockerfile: ./docker/fpm/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
      - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
    env_file:
      - ./docker/mysql/mysql.env
      - ./docker/fpm/conf/dev/fpm.env
    links:
      - mysql
    shm_size: 256M
    networks:
      - my_network

  networks:
    my_network:
      driver: bridge
  • add custom network and add container to that network
  • by default if you curl nginx container from fpm you will curl localhost, so we need to add alias to be the same as your servername in the nginx configuration
  • with this solution you can curl myapi.docker from the fpm container

@edward let me know if this solution worked for you

Edit: Jack_Hu is right, I removed extra_hosts. Network alias is enough.

Upvotes: 13

wildpeaks
wildpeaks

Reputation: 7402

Add network aliases in the default network.

version: "3.7"
services:

  nginx:
    # ...
    networks:
      default:
        aliases:
          - example.local

  browser-sync:
    # ...
    depends_on:
      - nginx
    command: "browser-sync start --proxy http://example.local"

Upvotes: 34

Benyi
Benyi

Reputation: 952

I solved this kind of issue by using links instead of extra_hosts.

In that case, just set link alias can do your favor.

service fpm setting
links
  - nginx:myapi.docker

See docker-compose links documentation, The alias name can be the domain which appears in your code.

Upvotes: 8

zstate
zstate

Reputation: 2055

From the docker documentation,

https://docs.docker.com/compose/networking/

You should be able to use your service name (in this case nginx) as a hostname from within your docker network. So you can bash into my FPM container and call curl nginx and the docker will resolve it for you. Hope this helps.

Upvotes: 3

Edward
Edward

Reputation: 1883

Quick fix is to point it to a dynamic IP generated by docker. This may change though so... yeah.

Find your networks: docker network ls

NETWORK ID          NAME                 DRIVER              SCOPE
72fef1ce7a50        apiwip_default       bridge              local <-- here
cdf9d5b885f6        bridge               bridge              local
2f4f1e7038fa        host                 host                local
a96919eea0f7        mgadmin_default      bridge              local
30386c421b70        none                 null                local
5457b953fadc        website2_default     bridge              local
1450ebeb9856        anotherapi_default   bridge              local

Copy the NETWORK ID

docker network inspect 72fef1ce7a50

"Containers": {
            "345026453e1390528b2bb7eac4c66160750081d78a77ac152a912f3de5fd912c": {
                "Name": "apiwip_nginx_1",
                "EndpointID": "6504a3e4714a6ba599ec882b21f956bfd1b1b7d19b8e04772abaa89c02b1a686",
                "MacAddress": "02:42:ac:14:00:05",
                "IPv4Address": "172.20.0.5/16", <-- CIDR block
                "IPv6Address": ""
            },
            "ea89d3089193825209d0e23c8105312e3df7ad1bea6b915ec9f9325dfd11736c": {
                "Name": "apiwip_fpm_1",
                "EndpointID": "dc4ecc7f0706c0586cc39dbf8a05abc9cc70784f2d44c90de2e8dbdc9148a294",
                "MacAddress": "02:42:ac:14:00:04",
                "IPv4Address": "172.20.0.4/16",
                "IPv6Address": ""
            }
        },

Add the IP address from that CIDR block to the extra_hosts option:

extra_hosts:
  - myapi.docker:172.20.0.5

Upvotes: -4

Related Questions