반응형
1. 시작
`docker-compose.yml` 파일을 작성하면서 사용했던 옵션 및 yml 별칭 기능으로 yml 파일에 반복되는 구문은 간략화시킬 수 있는 샘플 docker-compose.yml이다.
2. 내용
version: 'x.x'
networks:
sample_network: # 네트워크 정의
driver: bridge # `sample_network`는 bridge 입니다.
ipam:
config:
- subnet: 10.5.0.0/16 # IPv4 네트워크 대역 설정
gateway: 10.5.0.1 # IPv4 GW 네트워크 고정 정의
- subnet: "2001:db8:1::/64" # IPv6 네트워크 대역 설정
gateway: "2001:db8:1::1" # IPv6 GW 네트워크 고정 정의
services:
example: # docker-compose 에서 example로 정의한 컨테이너(서비스)
image: exampleImage:1.0 # 사용할 이미지
container_name: example_container # 컨테이너명 정의
volumes:
- ./bin_App/app1:/opt/app # docker-compose.yml 파일이 있는 디렉토리 위치 기준 bin_App/app1의 디렉토리를 컨테이너 내부 /opt/app 디렉토리와 동기화(동기화 전 컨테이너에 있는 /opt/app 디렉토리 내 모든 내용이 로컬의 ./bin_App/app1 디렉토리 내용으로 덮어씌워진다.)
ports:
- 8080:8080 # 8080 tcp 포트를 포워딩한다.
- 8081:8081/udp # 8081 udp 포트를 포워딩한다.
- 9090:8082 # 외부에서 호스트IP에 9090포트로 연결을 시도하면 8082포트로 포워딩 시킨다.
environment: &gloENV # 변수를 추가해준다.
TZ: Asia/Seoul # 타임존 변수 추가
TEST: HELLO # 컨테이너 내부에서 `echo $TEST` 를 입력하면 HELLO가 출력됨
entrypoint: /opt/init/init.sh # 시작 스크립트 설정
restart: always # `compose up` 된 상태에서 머신 재부팅 시 자동 실행
networks:
sample_network: # 위에 정의한 네트워크 설정
ipv6_address: "2001:db8:1::2" # IPv6 고정IP할당
ipv4_address: 10.5.0.2 # IPv4 고정 IP할당당
extra_hosts: &gloHOST # 컨테이너 내부의 /etc/hosts 파일에 구문 추가
- "sample_network:10.5.0.1" # IPv4 의 도메인 설정 예
- "sample_network_ipv6:2001:db8:1::1" # IPv6 의 도메인 설정 예
logging: &gloLOGGING
driver: "json-file"
options:
max-size: "3g"
max-file: "10"
mem_limit: "16g" #메모리 자원 할당 설정 (주의: 각 애플리케이션의 conf 에서 지정된 메모리 할당 범위와 동일하게 설정)
example2:
image: exampleImage:2.0
container_name: example_container2
restart: always
volumes:
- ./bin_App/app2:/opt/app
ports:
- 9000:9000
environment:
<<: *gloENV # 위에 정의한 `&gloENV` 의 옵션을 그대로가져온다.
TEST_JAVA_HOME: /opt/app/jdk # 해당 컨테이너만 env 설정 추가
entrypoint: /opt/init/init.sh
networks:
sample_network:
ipv6_address: "2001:db8:1::3"
ipv4_address: 10.5.0.3
extra_hosts: *gloHOST # extra_hosts는 위에 정의한 `&gloHOST` 내용과 동일하다.
logging: *gloLOGGING
mem_limit: "8g"
example3:
image: exampleImage:3.0
container_name: example_container3
restart: always
volumes:
- ./bin_App/app3:/opt/app
network_mode: host # `network_mode=host`는 해당 컨테이너는 host의 네트워크를 가지며, 컨테이너에서 따로 포워딩을 해주지 않아도 된다.(단 머신의 연결된 네트워크에서 외부 포트포워딩은 해줘야 한다.)
environment: *gloENV
entrypoint: /opt/init/init.sh
extra_hosts: *gloHOST
logging: *gloLOGGING
mem_limit: "8g"
2.1. 위 yml을 json으로 변환한 결과
{
"services": {
"example2": {
"logging": {
"driver": "json-file",
"options": {
"max-size": "3g",
"max-file": "10"
}
},
"image": "exampleImage:2.0",
"networks": {
"sample_network": {
"ipv4_address": "10.5.0.3",
"ipv6_address": "2001:db8:1::3"
}
},
"environment": {
"TEST": "HELLO",
"TEST_JAVA_HOME": "/opt/app/jdk",
"TZ": "Asia/Seoul"
},
"entrypoint": "/opt/init/init.sh",
"volumes": [
"./bin_App/app2:/opt/app"
],
"container_name": "example_container2",
"mem_limit": "8g",
"extra_hosts": [
"sample_network:10.5.0.1",
"sample_network_ipv6:2001:db8:1::1"
],
"restart": "always",
"ports": [
"9000:9000"
]
},
"example": {
"logging": {
"driver": "json-file",
"options": {
"max-size": "3g",
"max-file": "10"
}
},
"image": "exampleImage:1.0",
"networks": {
"sample_network": {
"ipv4_address": "10.5.0.2",
"ipv6_address": "2001:db8:1::2"
}
},
"environment": {
"TEST": "HELLO",
"TZ": "Asia/Seoul"
},
"entrypoint": "/opt/init/init.sh",
"volumes": [
"./bin_App/app1:/opt/app"
],
"container_name": "example_container",
"mem_limit": "16g",
"extra_hosts": [
"sample_network:10.5.0.1",
"sample_network_ipv6:2001:db8:1::1"
],
"restart": "always",
"ports": [
"8080:8080",
"8081:8081/udp",
"9090:8082"
]
},
"example3": {
"network_mode": "host",
"logging": {
"driver": "json-file",
"options": {
"max-size": "3g",
"max-file": "10"
}
},
"image": "exampleImage:3.0",
"environment": {
"TEST": "HELLO",
"TZ": "Asia/Seoul"
},
"entrypoint": "/opt/init/init.sh",
"volumes": [
"./bin_App/app3:/opt/app"
],
"container_name": "example_container3",
"mem_limit": "8g",
"extra_hosts": [
"sample_network:10.5.0.1",
"sample_network_ipv6:2001:db8:1::1"
],
"restart": "always"
}
},
"version": "x.x",
"networks": {
"sample_network": {
"ipam": {
"config": [
{
"subnet": "10.5.0.0/16",
"gateway": "10.5.0.1"
},
{
"subnet": "2001:db8:1::/64",
"gateway": "2001:db8:1::1"
}
]
},
"driver": "bridge"
}
}
}
3. 결론
- `&`으로 별칭을 선언하고 `*` 으로 별칭을 사용한다.
- 별칭을 사용하되, 다른 구문을 추가하고 싶으면 `<<`을 사용한다.
반응형
'Docker' 카테고리의 다른 글
Python(Cuda) 기반 컨테이너 실행 안될때 (0) | 2023.10.26 |
---|---|
로컬디렉토리와 컨테이너 내부 디렉토리와 연결 방법 (0) | 2023.05.23 |
죽은 컨테이너 접속 방법 (0) | 2023.05.23 |