프로젝트를 진행하던 중 나의 작고 소중한 php 서버가 mysql 서버를 접근하지 못하여 찾아보니 컨테이너간 네트워크가 연결되어있지 않아 발생한 해프닝이었다. 딸깍만 하면 모든게 자동으로 되는 환경을 원하기 때문에 docker compose의 networks 옵션에 대해서 찾아보았다.
컨테이너가 컴퓨터의 네트워크를 직접 사용한다. 속도가 빠르지만, 다른 컨테이너와 격리되지 않는다.
macvlan
컨테이너마다 고유한 네트워크 주소(MAC 주소)를 주어, 실제 다른 기기처럼 보이게 한다.
none
네트워크 연결을 하지 않는다. 컨테이너는 자기 자신만 사용할 수 있다.
옵션 사용 예시
version: '3.8'
services:
app:
image: nginx:latest
networks:
- external_net
- custom_net
networks:
# 이미 만들어진 네트워크 사용
external_net:
external: true
# 이 Compose가 만드는 네트워크
custom_net:
name: custom_bridge_network # 네트워크 이름
driver: bridge # bridge 드라이버 사용
driver_opts:
com.docker.network.driver.mtu: "1200" # 추가 옵션 설정(최대 전송 단위를 1200로 제한)
ipam:
driver: default # 기본 IP 관리 드라이버 사용
config:
- subnet: "192.168.10.0/24" # 서브넷 범위 설정
gateway: "192.168.10.1" # 게이트웨이 설정
internal: true # 내부 전용 네트워크로 만듦
attachable: true # 일반 컨테이너도 연결 가능하게
labels:
project: my_project # 태그
컨테이너간 네트워크 연결 예시 코드
mysql/docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0
container_name: mysql_dev
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
TZ: Asia/Seoul
networks:
- mysql_net # 사용할 네트워크 지정
networks:
mysql_net:
name: mysql_net # 생성할 네트워크 이름
php/docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8080:80"
volumes:
- .:/var/www/html
networks:
- mysql_net # 사용할 네트워크 지정
networks:
mysql_net:
external: true # 네트워크가 외부에 이미 존재함을 지정
후기
나는 단순히 컨테이너간 네트워크를 최대한 편하게 연결하고 싶었을 뿐인데 생각보다 깊어진 것 같다...