도커 컨테이너간의 네트워크 통신 방법에 대해 알아보겠습니다.

먼저 임의의 디렉토리에 아래와 같은 구조로 디렉토리를 생성해주세요.

$ docker-network-test tree
├── app
│   └── index.php
├── data
├── docker-compose.yml
└── php
    └── Dockerfile

우선 php에 mysql 접속을 위한 라이브러리를 설치하기위해 별도의 Dockerfile 을 생성해줘야합니다.
아래처럼 간단하게 두줄만 추가한 후 저장해주세요.

FROM php:7.2-apache

RUN docker-php-ext-install mysqli pdo pdo_mysql

그다음으로는 컨테이너들을 생성하기 위한 docker-compse.yml 파일을 살펴보겠습니다.

# docker-compose.yml

version: '3'
services:
    some_php:
        build:
            context: ./php
        volumes:
            - ./app:/var/www/html
        ports:
            - 80:80
        networks:
            - some_net
    some_mysql:
        image: mysql:5.6
        environment:
            - MYSQL_ROOT_PASSWORD=rootpw
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
            - MYSQL_DATABASE=test_db
        volumes:
            - ./data:/var/lib/mysql
        networks:
            - some_net

networks:
    some_net:
        driver: bridge

컨테이너간의 통신을 위해 별도의 네트워크를 설정해주는 옵션(networks)를 설정해주었습니다.

이부분은 별도의 user-defined bridge 를 생성해주기 위한 옵션인데, 
현재 컨테이너들이 생성되기전에 some_net 라는 별도의 네트워크가 생성이됩니다.

그리고 해당 네트워크에 연결하려는 컨테이너들에 networks 옵션으로 해당 네트워크를 설정해주면,
컨테이너들이 해당 네트워크에 연결됩니다.

이렇게 동일한 user-defined bridge 네트워크에 연결된 컨테이너들은
각각의 컨테이너명(some_php, some_mysql)으로 서로간의 통신이 가능해지게됩니다.

컨테이너 내부에서 컨테이너명으로 접근 예시)

➜  docker-network-test docker ps                                               
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                NAMES
8549baeb6bd9        mysql:5.6                      "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        3306/tcp             docker-network-test_some_mysql_1
bc1feaf35191        docker-network-test_some_php   "docker-php-entrypoi…"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp   docker-network-test_some_php_1

root@bc1feaf35191:/var/www/html# ping some_mysql
PING some_mysql (192.168.240.2) 56(84) bytes of data.
64 bytes from docker-network-test_some_mysql_1.docker-network-test_some_net (192.168.240.2): icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from docker-network-test_some_mysql_1.docker-network-test_some_net (192.168.240.2): icmp_seq=2 ttl=64 time=0.109 ms
^C
--- some_mysql ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.101/0.105/0.109/0.004 ms
root@bc1feaf35191:/var/www/html# 

some_php 컨테이너에 접속해서 ping some_mysql 을 실행해보면 실제 some_mysql 컨테이너의 IP가 호출되는것을 볼 수 있습니다.

app/index.php 에는 간단한 mysql 접속 테스트용 코드를 작성했습니다.

# index.php

<?php
$servername = "some_mysql";
$username = "test";
$password = "test";
$dbname = "test_db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>

코드를 모두 작성하신 후 docker 를 실행해주세요.

$ docker-compose build
$ docker-compose up -d

도커가 정상적으로 빌드 & 실행된 후 http://localhost 로 접속해보면 정상적으로 DB 연결이 성공함을 볼 수 있습니다.

감사합니다. 😄