목차
1. 다중 컨테이너 오케스트레이션 툴
2. 도커 컴포즈 설치
3. 프로젝트, 서비스, 컨테이너
4. 간단한 웹 애플리케이션을 docker-compose.yaml로 생성하기
5. yaml 파일 작성법
6. 도커 컴포즈 네트워크
7. 도커 스택 : 도커 스웜 & 도커 컴포즈
8. 컨테이너 생태계 구조
다중 컨테이너 오케스트레이션 툴
도커 컴포즈는 다중 컨테이너로 구성괸 애플리케이션의 구성, 실행, 관리를 담당하는 툴이다.
도커 컴포즈가 제공하는 기능은 다음과 같다.
- 도커 컴포즈 설정 파일로 번거로운 CLI 작업 없이 컨테이너를 생성하고 관리할 수 있다. 대부분의 run 옵션을 그대로 사용할 수 있다.
- 컨테이너 수를 유동적으로 조절할 수 있다.
- 서비스 디스커버리를 자동으로 관리한다.
도커 컴포즈 설치
윈도우와 맥 OS는 도커 데스크탑을 설치할 때 도커 컴포즈도 같이 설치된다. 이 명령어로 도커 컴포즈의 버전을 확인한다. docker-compose -v
리눅스에서는 다음 명령어로 도커 컴포즈를 설치한다.
curl -L "<https://github.com/docker/compose/releases/latest/download/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- 프로젝트 : 도커 컴포즈에서 다루는 워크스페이스 단위. 도커 컴포즈 파일을 up하면 하나의 프로젝트가 만들어진다.
- 서비스 : 도커 컴포즈에서 컨테이너를 관리하는 단위. 도커 컴포즈의 services 하위 항목 하나가 서비스이다. 하나의 서비스에 여러 컨테이너가 만들어질 수 있다.
- 컨테이너 : 서비스를 통해 관리되는 대상.
간단한 웹 애플리케이션을 docker-compose.yml으로 생성하기
도커 컴포즈는 컨테이너 설정이 정의된 yaml 파일을 읽어 도커 엔진을 통해 컨테이너를 생성한다.
다음과 같은 명령어로 컴포즈 파일을 사용해 서비스를 생성하고 삭제할 수 있다.
- 파일 작성 : vim docker-compose.yml
- 컴포즈 파일로 컨테이너 생성
- 현재 디렉터리 기준 : docker-compose up -d (프로젝트는 디렉터리 이름과 동일하게 생성됨)
- 디렉터리 지정 : docker-compose -f 디렉터리 up -d
- 프로젝트 이름 지정 : docker-compose -p 이름 up -d
- 특정 서비스의 컨테이너만 생성 : docker-compose up -d 서비스
- 생성된 컨테이너 확인 : docker-compose ps 혹은 docker ps --format "table {{.Names}}\\t{{.Image}}\\t{{.Ports}}”
- 컨테이너 생성 : docker-compose up --scale db=2 (커맨드에서 옵션으로 빠졌다네요)
- 프로젝트 삭제 : docker-compose down
간단한 웹 애플리케이션의 컨테이너 만들기!
- db : mysql 컨테이너
- web : nginx 컨테이너
alicek106에서 이미지 받으면 실행 안된다고 뜨더라고요 os 달라서 그런듯.. ⠦ mysql The requested image's platform (linux/amd64) does not match the detecte[+] Running 2/5 (linux/arm64/v8) and no specific platform was requested 0.0s
그래서 지피티한테 만들어달라고 함
version: '3'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- ./db_data:/var/lib/mysql
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./web_content:/usr/share/nginx/html:ro
depends_on:
- db
MySQL 서비스는 mysql:latest 이미지를 사용하며, root 비밀번호와 데이터베이스, 사용자 등의 정보가 환경 변수로 설정되어 있습니다. 또한 MySQL 데이터베이스가 호스트 파일 시스템의 ./db_data 디렉토리에 저장되도록 설정되어 있습니다.
Nginx 서비스는 nginx:latest 이미지를 사용하며, 호스트의 80번 포트와 컨테이너의 80번 포트를 매핑하도록 설정되어 있습니다. 또한 호스트 파일 시스템의 ./web_content 디렉토리가 컨테이너의 /usr/share/nginx/html 디렉토리에 읽기 전용으로 마운트되도록 설정되어 있습니다. 마지막으로 Nginx 서비스가 의존하는 MySQL 서비스를 depends_on 옵션으로 명시하고 있습니다.
⭐️yaml 파일 작성법⭐️
버전 정의
도커 컴포즈 버전3은 도커 스웜 모드와 호환되므로 가능하면 최신 버전 도커 컴포즈를 사용하는 것이 좋다.
- version: ‘3.0’
서비스 정의
- services: 서비스 항목 지정 영역. 들여쓰기 하고 서비스를 쭉 설정하면 된다.
- 서비스명: 아래의 옵션을 지정하여 서비스를 통해 생성될 컨테이너들의 옵션을 지정할 수 있다. 대부분 docker run 명령어의 옵션들이다.
- image: 이미지 이름 설정
- links : 다른 서비스명만으로 접근할 수 있도록 설정된다.
- environment: 컨테이너 내부에서 사용할 환경변수 지정
- command: 컨테이너가 실행될 때 수행할 명령어 설정
- depens_on: 특정 컨테이너에 대한 의존 관계를 나타낸다. 의존관계 순서 지켜서 생성해야한다. links와 달리 서비스 이름으로만 접근 가능.
- ports: 개방할 컨테이너 포트 설정. 단일 호스트 환경에서 호스트의 특정 포트를 연결하면 컨테이너의 수를 늘릴 수 없다. Bind for 0.0.0.0:80 failed: port is already allocated 이런 에러가 떠용~
- build: 도커 파일을 지정해 이미지를 빌드하고 컨테이너 생성
- extends: 다른 yaml 파일이나 현재 yaml 파일의 서비스 속성 상속
- 최대한 많은 서비스 하위 옵션을 사용하는 도커 컴포즈 파일을 만들어오라고 했더니 이런걸 줬네요..
- restart: 컨테이너 재시작 정책 설정
- environment: 컨테이너 환경변수 설정
- volumes: 볼륨 마운트 설정
- ports: 컨테이너 포트 매핑 설정
- depends_on: 컨테이너 간 의존성 설정
- networks: 컨테이너가 사용할 네트워크 설정
version: '3.9'
services:
db:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- wp_network
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
ports:
- "8000:80"
networks:
- wp_network
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin:latest
restart: always
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: password
ports:
- "8080:80"
networks:
- wp_network
volumes:
db_data:
wp_data:
networks:
wp_network:
- 프로젝트 : 도커 컴포즈에서 다루는 워크스페이스 단위. 도커 컴포즈 파일을 up하면 하나의 프로젝트가 만들어진다.
- 서비스 : 도커 컴포즈에서 컨테이너를 관리하는 단위. 도커 컴포즈의 services 하위 항목 하나가 서비스이다. 하나의 서비스에 여러 컨테이너가 만들어질 수 있다.
- 컨테이너 : 서비스를 통해 관리되는 대상.
네트워크 정의
- driver : 기본으로 브릿지 네트워크 생성, 다른 네트워크 드라이버도 사용 가능 (brigge, overlay, host, none 등)
- ipam : 브릿지 네트워크를 생성해서 컨테이너에 ip 할당. 할당하는 ip 범위나 게이트웨이 ip 설정 가능
- external : 기존 네트워크 사용
볼륨 정의
- driver : 볼륨 드라이버 설정, 추가 옵션은 하위 인자로 설정
- external : 기존 볼륨 사용
services:
...
volumes:
driver: flocker
driver_opts:
opt: "1"
opt2: 2
services:
web:
volumes:
- myvolume:/var/www/composetest:web
volumes:
myvolume:
external: true
yaml 파일 검증
docker-compose config [-f]
- 오타 검사, 파일 포맷 검사
- 옵션으로 여러 개의 설정 파일을 사용할 때, 최종적으로 어떤 설정이 적용되는지 확인해볼 때 유용!
minhwi@minhwiui-MacBookPro ~/docker_compose docker-compose config
name: docker_compose
services:
db:
environment:
MYSQL_DATABASE: mydb
MYSQL_PASSWORD: mypassword
MYSQL_ROOT_PASSWORD: example
MYSQL_USER: myuser
image: mysql:latest
networks:
default: null
volumes:
- type: bind
source: /Users/minhwi/docker_compose/db_data
target: /var/lib/mysql
bind:
create_host_path: true
web:
depends_on:
db:
condition: service_started
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "80"
protocol: tcp
volumes:
- type: bind
source: /Users/minhwi/docker_compose/web_content
target: /usr/share/nginx/html
read_only: true
bind:
create_host_path: true
networks:
default:
name: docker_compose_default
도커 컴포즈 네트워크
프로젝트별로 브리지 타입의 네트워크를 생성한다. 같은 프로젝트에 속하는 컨테이너끼리 통신이 가능하다.
서비스 내의 컨테이너는 —net-alias(run 옵션)가 서비스 이름을 갖도록 자동으로 설정되므로 컨테이너들이 서비스 이름으로 컨테이너에 접근이 가능하다. (캡슐화 잘된듯) 서비스 이름을 IP로 변환해주는 DNS가 있다. 만약 같은 서비스 이름을 가진 컨테이너가 여러개라면 라운드 로빈으로 결정한다.
도커 스택 : 도커 스웜 & 도커 컴포즈
YAML 버전3와 함께 스택의 등장으로 도커 스웜과 도커 컴포즈를 함께 사용할 수 있게 되었다.
도커 스웜은 여러 노드에 걸친 컨테이너 관리를 지원하고, 도커 컴포즈는 단일 노드에 여러 컨테이너 관리를 지원한다. 함께 사용하면 여러 노드에 여러 컨테이너를 생성하고 관리할 수 있다.
아마 여러 노드 여러 컨테이너 컨셉은 도커 스웜에서 서비스를 여러개 두어서 구현 가능할 것이다. 그래도 스택을 사용하면 서비스 생성을 yaml 파일로 자동화할 수 있으니 훨씬 편할 듯.
yaml 파일에 정의된 서비스들이 클러스터에서 일괄적으로 생성된다. 이렇게 생성된 서비스들을 그룹으로 묶은 것이 스택이다. 스택이 생성되고 할당하는 원리는 도커 스웜과 동일하다.
✅ 스택으로 여러 서비스를 클러스터에서 실행 관리하기
- 컴포즈 파일 작성 : vim docker-compose.yml
- 스택 빌드 : docker stack deploy -c docker-compose.yml mystack
- 생성된 스택 확인 : docker stack ls 혹은 docker stack ps mystack 혹은 docker service ls 혹은 docker service ps mystack
- 컨테이너 수 조절 : docker service scale mystack_web=2
✅ 스택 네트워크
스택 네트워크는 스웜과 마찬가지로 오버레이를 가진다. 여러 호스트의 컨테이너들이 통신해야하니까 오버레이를 사용해야 한다. 다만 이 네트워크는 —attachable 옵션 설정이 안되므로 일반 컨테이너는 이 네트워크를 사용할 수 없다.
컨테이너 생태계 구조
대규모 인프라를 구성하게 되면 컨테이너 생태계는 한번쯤 접하게 된다고 합니다.
- runC : 컨테이너에 1:1로 매칭되는 런타임 역할. 프로세스라고 부를 만한 것
- containerd : runC 컨테이너 프로세스 및 이미지 관리 주체
- Docker Engine(Demon) : containerd와 통신해 runC를 사용할 수 있게 하는 엔드 유저용 도구
'Cloud > Docker' 카테고리의 다른 글
도커 스웜 (0) | 2023.04.22 |
---|---|
도커 데몬 (0) | 2023.04.22 |
Dockerfile (1) | 2023.04.22 |
도커 이미지 (0) | 2023.04.22 |
컨테이너 로깅, 컨테이너 자원 할당 제한 (0) | 2023.04.22 |