Search
Duplicate
📒

[Docker Container] 09. N-tier 컨테이너, docker-compose

상태
미진행
수업
Docker Container
주제
Docker
4 more properties
참고

N-tier 컨테이너

NOTE
N-tier 아키텍쳐는 구성되는 계층의 숫자에 따라 분리되는 구조를 말한다!
2-tire 구성 (백엔드 - DB)
# MySQL 컨테이너 docker run -itd \ --name=mysql_app \ -v mydb_data:/var/lib/mysql \ --restart=always \ -p 3306:3306 \ --net=my-webdb-net \ -e MYSQL_ROOT_PASSWORD=password# \ -e MYSQL_DATABASE=wpdb \ -e MYSQL_USER=wpuser \ -e MYSQL_PASSWORD=wppassword \ mysql:8.0-debian # wordpress 컨테이너 docker run -itd \ --name=wordpress_app \ -v myweb_data:/var/www/html \ -v ${PWD}/myweb-log:/var/log \ --restart=always \ -p 8888:80 \ --net=my-webdb-net \ -e WORDPRESS_DB_HOST=mysql_app:3306 \ -e WORDPRESS_DB_NAME=wpdb \ -e WORDPRESS_DB_USER=wpuser \ -e WORDPRESS_DB_PASSWORD=wppassword \ --link mysql_app:mysql \ wordpress:5.7
Bash
복사
2개의 컨테이너를 생성하기 위한 코드
docker volume create mydb_data docker volume create myweb_data docker volume ls | grep my docker inspect --type volume mydb_data docker inspect --type volume myweb_data docker network create my-webdb-net docker networ kls docker network inspect my-webdb-net
Bash
복사
2개의 컨테이너의 volume과 network 설정을 위한 코드
2개의 컨테이너를 실행시키기 위해 점점 많은 명령어를 입력하게 된다.
이러한 어려움을 극복하기 위해 도커 컴포즈가 등장한다!

도커 컴포즈

NOTE
도커 실행시 복잡한 설정을 쉽게 관리하기 위해 YAML 파일에 정의한다!
docker compose vs kubernetes
sudo apt-get update sudo apt-get install docker-compose-plugin DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose docker compose version docker compose up -d
Bash
복사
docker-compose 설치코드
version: "3.9" services: # 첫 번째 서비스 정의. mydb: # 도커 허브에서 제공하는 mysql:8.0 이미지 선택. image: mysql:8.0-debian # 서비스 컨테이너 이름 지정. container_name: mysql_app # 최상위 레벨에 정의 mydb_data 볼륨 지정. volumes: - mydb_data:/var/lib/mysql # 수동 제어를 제외한 컨테이너 종료 시 자동 재시작. restart: always # 호스트 운영체제와 컨테이너의 3306 포트를 바인드한다. # workbench 같은 클라이언트 도구와 연결하기 위해 필요하다. ports: - "3306:3306" # 최상위 레벨에 정의한 backend-net을 기본 네트워크로 지정한다. networks: - backend-net # 서비스가 사용할 환경 변수 지정한다. environment: MYSQL_ROOT_PASSWORD: password# MYSQL_DATABASE: wpdb MYSQL_USER: wpuser MYSQL_PASSWORD: wppassword # 두 번째 서비스를 작성한다. myweb: # myweb 서비스가 실행되기 전에 mydb 서비스를 먼저 실행하는 의존성을 설정한다. depends_on: - mydb # wordpress:5.7 이미지 지정한다. image: wordpress:5.7 # 서비스 컨테이너 이름을 지정한다. container_name: wordpress_app # 호스트 운영체제의 8888 포트와 컨테이너의 80 포트를 바인드한다. ports: - "8888:80" # backend-net으로 mydb 서비스와 동일 네트워크로 지정하고, # 외부 연결을 위한 네트워크를 위해 fronetend-ne t 지정을 가정한다. # docker network connect ~ 명령으로 두 번째 네트워크를 추가하는 것과 같다. networks: - backend-net
YAML
복사
앞서 작성한 docker 명령어와 비교해서 보면 좋다.

Docker-compose 실습1

NOTE
3-tier 아키텍쳐를 구성한다.
docker build -t mydiary-front:1.0 . docker build -t mydiary-back:1.0 . docker network create fastapp-net # DB 컨테이너 docker run -d --name rolling-db --net fastapp-net -p 13306:3306 \ -e MYSQL_ROOT_PASSWORD=pass123# -e MYSQL_DATABASE=paperdb \ -e MYSQL_ROOT_HOST=% -e MYSQL_USER=user -e MYSQL_PASSWORD=user \ mysql:5.7-debian --character-set-server=utf8 --collation-server=utf8_general_ci # Backend 컨테이너 # DB 내부동작이 요구되므로, 몇십초 뒤에 backend 수 docker run -d --name rolling-server --net fastapp-net -p 8080:8080 \ -e SPRING_DATASOURCE_URL=jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul \ -e SPRING_DATASOURCE_USERNAME=user -e SPRING_DATASOURCE_PASSWORD=user \ mydiary-back:1.0 # Front 컨테이너 docker run -d --name rolling-front --net fastapp-net -p 3000:3000 mydiary-front:1.0 curl localhost:3000 # 다음을 위한 컨테이너 삭제 docker stop rolling-db rolling-server rolling-front docker rm rolling-db rolling-server rolling-front
Bash
복사
docker cli를 통한 3티어 구성
version: '3.3' services: mydiary-db: image: mysql:5.7-debian container_name: rolling-db environment: MYSQL_ROOT_PASSWORD: pass123 MYSQL_DATABASE: paperdb MYSQL_ROOT_HOST: '%' MYSQL_USER: user MYSQL_PASSWORD: user ports: - '13306:3306' networks: - rolling-be-db restart: always command: - --character-set-server=utf8 - --collation-server=utf8_general_ci mydiary-back: build: context: ./my-diary-back dockerfile: Dockerfile container_name: rolling-server restart: always depends_on: - mydiary-db ports: - '8080:8080' environment: SPRING_DATASOURCE_URL: jdbc:mysql://rollingdb:3306/paperdb?serverTimezone=Asia/Seoul SPRING_DATASOURCE_USERNAME: user SPRING_DATASOURCE_PASSWORD: user networks: - rolling-be-db - rolling-fe-be mydiary-front: build: context: ./my-diary-front dockerfile: Dockerfile container_name: rolling-front restart: always depends_on: - mydiary-back ports: - '3000:3000' networks: - rolling-fe-be networks: rolling-be-db: {} rolling-fe-be: {}
YAML
복사
Docker-compose로 작성하는 방법

Docker-compose 실습2

NOTE
여러개의 복제본을 생성해서 사용하는 방식(쿠버네티스의 replica와 비슷)
version: '3.8' services: mydiary-db: image: mysql:5.7-debian container_name: rolling-db environment: MYSQL_ROOT_PASSWORD: pass123 MYSQL_DATABASE: paperdb MYSQL_ROOT_HOST: '%' MYSQL_USER: user MYSQL_PASSWORD: user ports: - '3306:3306' networks: - mydiary-net restart: always command: - --character-set-server=utf8 - --collation-server=utf8_general_ci mydiary-back: build: context: ./my-diary-back dockerfile: Dockerfile deploy: replicas: 3 restart: always depends_on: - mydiary-db ports: - '8081-8083:8080' environment: SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul SPRING_DATASOURCE_USERNAME: user SPRING_DATASOURCE_PASSWORD: user networks: - mydiary-net mydiary-front: build: context: ./my-diary-front dockerfile: Dockerfile deploy: replicas: 3 restart: always depends_on: - mydiary-back ports: - '3000-3002:3000' networks: - mydiary-net proxy-be: image: nginx:1.21.5-alpine container_name: rolling-server-lb restart: always depends_on: - mydiary-back ports: - '8080:80' volumes: - ${PWD}/proxy/nginx-be.conf:/etc/nginx/nginx.conf networks: - mydiary-net proxy-fe: image: nginx:1.21.5-alpine container_name: rolling-front-lb restart: always ports: - '80:80' volumes: - ${PWD}/proxy/nginx-fe.conf:/etc/nginx/nginx.conf networks: - mydiary-net networks: mydiary-net: driver: bridge ipam: driver: default config: - subnet: 172.20.0.0/24 ip_range: 172.20.0.0/24 gateway: 172.20.0.1
YAML
복사
replica 사용, 네트워크 상세설
events { worker_connections 1024; } http { upstream front-servers { server mydiary-front:3000; server mydiary-front:3001; server mydiary-front:3002; } server { listen 80 default_server; location / { proxy_pass http://front-servers; } } }
Bash
복사
frontend-nginx
events { worker_connections 1024; } http{ upstream mydiary-back { server mydiary-back:8081; server mydiary-back:8082; server mydiary-back:8083; } server { listen *:8080 default_server; location / { proxy_pass http://mydiary-back; } } }
Bash
복사
backend-nginx