참고
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