아래처럼 container_name 옵션을 사용하면 원하는 이름으로 직접 지정할 수 있다.
services:
my-db:
container_name: my-mysql
...
Spring Boot, MySQL, Redis 컨테이너 동시에 띄워보기
각각의 컨테이너는 자신만의 네트워크망과 IP 주소를 가지고 있다. 호스트 컴퓨터 입장에서 localhost는 호스트 컴퓨터를 가리키지만, Spring Boot 컨테이너 입장에서 localhost는 Spring Boot 컨테이너를 가리킨다.
# application.yml
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb # docker-compose.yml 파일에 정의된 서비스 이름
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
data:
redis:
host: my-cache-server # docker-compose.yml 파일에 정의된 서비스 이름
port: 6379
동일한 Docker Compose 네트워크 내에서 한 컨테이너가 다른 컨테이너와 통신하기 위해 '도커 컴포즈 파일에서 서비스명 지정한 걸로 각 컨테이너끼리 통신'
Docker Compose는 내부 DNS를 통해 서비스 이름을 컨테이너 IP 주소로 매핑합니다. 따라서 컨테이너들은 localhost 대신 서비스 이름으로 서로를 쉽게 찾아 통신할 수 있다.각 컨테이너는 각자의 네트워크를 가지고 있기 때문에, localhost가 아니라 Redis가 실행되고 있는 컨테이너로 통신을 해야 한다.
그리고 compose.yml 파일은 아래와 같이 설정해준다.
# compose.yml
services:
my-server: # 서비스명
build: .
ports:
- 8080:8080
depends_on: # 아래 두 컨테이너가 생성되고 healthy 하다고 판단 될 때, 해당 컨테이너를 생성한다.
my-db:
condition: service_healthy
my-cache-server:
condition: service_healthy
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: mydb # MySQL 최초 실행 시 mydb라는 데이터베이스를 생성해준다.
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: [ "CMD", "mysqladmin", "ping" ] # MySQL이 healthy 한 지 판단할 수 있는 명령어
interval: 5s # 5초 간격으로 체크
retries: 10 # 10번까지 재시도
my-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10