도커 컨테이너간의 네트워크 통신 방법에 대해 알아보겠습니다.먼저 임의의 디렉토리에 아래와 같은 구조로 디렉토리를 생성해주세요.
$ 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 연결이 성공함을 볼 수 있습니다.감사합니다. 😄