갬미의 성장일기
Day 37 - 도커, 도커 컴포즈 3tier 본문
오늘 배운 내용
- 도커 3tier 구성
- 도커 컴포즈
nginx와 was를 연결하는 방법
1. 명령어로 하나하나 입력하기 (run - exec nginx 수정)
2. dockerfile 만들어 image만들고 수정된 이미지를 실행하기
3. conf를 외부 스토리지와 연결하기
1. 명령어로 하나하나 입력하기 (run - exec nginx 수정)
DB 컨테이너 was 컨테이너 Nginx 컨테이너 docker run -d -p 80:80 --name myn --net mynet gymin97/msa:v3 docker exec -it myn bash vi /etc/nginx/nginx.conf docker restart myn |
스크립트를 만드는 방법도 있다
mkdir nconf
vi /nconf/nginx.conf
2. Shell 파일 생성
docker run --name mysql
docker run --name mywas
docker run -d -p 80:80 --name myn --net mynet gymin97/msa:v3
docker cp /nconf/nginx.conf myn:/etc/nginx/nginx.conf
docker restart myn
👇 nginx.conf 파일 보기
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#revision point
# include /etc/nginx/conf.d/*.conf;
upstream was-server {
server mywas:8080;
}
server {
listen 80;
location / {
proxy_pass http://was-server;
}
}
}
2. dockerfile 만들어 image만들고 수정된 이미지를 실행하기
일단 default.conf 파일을 하나 준비하고 Dockerfile을 만든다
# was.conf 파일
upstream was {
ip_hash;
server mywas:8080;
}
server {
listen 80;
server_name kbdev;
access_log /var/log/nginx/test1.log;
location / {
#root /usr/share/nginx/html;
index index.html index.htm index.jsp;
proxy_pass http://was;
}
location ~ \.(css|js|jpg|jpeg|gif|htm|html|swf)$ {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~ \.(jsp|do)$ {
index index.jsp;
proxy_pass http://was;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $http_host;
proxy_redirect off;
charset utf-8;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Dockerfile 만들기
FROM nginx
RUN rm -f /etc/nginx/conf.d/default.conf
COPY ./was.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
image 빌드(말아 올리기) , push
docker build -t gymin97/msa:proxy-nginx .
docker push gymin97/msa:proxy-nginx
이미지를 만들면 습관적으로 push를 하자
docker run 이때 순차적으로 띄워야 한다
DB-was-nginx
docker run --name mysql-svc -d -p 3306:3306 --net mynet --net-alias=mysql-svc \
-e MYSQL_ROOT_PASSWORD='frodo' \
-e MYSQL_DATABASE='frodo' \
-e MYSQL_USER='frodo' \
-e MYSQL_PASSWORD='frodo' \
-e MYSQL_ROOT_HOST='%' \
mariadb:10.4
docker run --name mywas -d -p 8080:8080 --net mynet --net-alias=mywas hifrodo/was:v2002
docker run -d -p 80:80 --name myn --net mynet gymin97/msa:proxy-nginx
docker ps 확인
Cycle
1. nginx-was를 연동할 수 있는 내용이 담긴 was.conf파일을 만든다
2. Dockerfile을 만든다
2-1. nginx 설치
2-2. 기존의 default.conf 삭제
2-3. conf.d/에 was.conf 넣기
3. nginx image 생성하기
4. nginx image push 하기
5. DB, was, nginx 순서대로 컨테이너 실행하기
여기서 생길수있는 문제는?
-> conf가 바뀔때 마다 이미지를 다시 말아올려야 한다
이거를 안하려면 -> mount 해야한다!
3. conf를 외부 스토리지와 연결하기
docker host(용어 명확하게 사용하기)에 /nginx/conf 디렉토리 만들고 was.conf 파일 생성
Cycle
1. nginx-was를 연동할 수 있는 내용이 담긴 was.conf파일을 만든다 (/nginx/conf/was.conf)
2. DB, was, nginx 순서대로 컨테이너 실행하기
2-2. nginx 실행할때 마운트하기
mkdir /nginx
cd nginx/
mkdir conf
cd conf/
cp /work/docker/was.conf ./was.conf
docker run --name mysql-svc -d -p 3306:3306 --net mynet --net-alias=mysql-svc \
-e MYSQL_ROOT_PASSWORD='frodo' \
-e MYSQL_DATABASE='frodo' \
-e MYSQL_USER='frodo' \
-e MYSQL_PASSWORD='frodo' \
-e MYSQL_ROOT_HOST='%' \
mariadb:10.4
docker run --name mywas -d -p 8080:8080 --net mynet --net-alias=mywas hifrodo/was:v2002
docker run -d -p 80:80 --name myn --net mynet -v /nginx/conf:/etc/nginx/conf.d gymin97/msa:v3
보안을 신경써서 서비스 한다면
지금은 web, was, db모두 외부에서 접속이 된다 (포트가 열려있음)
DB 접속되나 확인법 - tcping 192.168.56.101 3306
- 보안상 문제가 될 수 있으니 nginx만 외부 노출이 되게 하자
(DB와 was의 -p 옵션만 제거 / == 외부로 연결되는 통로가 사라지는 것임)
docker run --name mysql-svc -d --net mynet
docker run --name mywas -d --net mynet
docker run -d -p 80:80 --name myn --net mynet -v /nginx/conf:/etc/nginx/conf.d gymin97/msa:v3
tcping 8080, 3306 접속 안됨
Docker 3 tier 생성 최최최종
1. 브릿지 네트워크 생성 ( 이름으로 통신하기 위해 )
docker network create --driver 네트워크명 (ex > mynet)
docker network ls # 확인
2. DB 컨테이너 생성
3. was 컨테이너 생성
3. nginx 컨테이너 생성
-- 사전작업
1. host 에 볼륨용 디렉토리 생성
2. nginx.conf 용 conf파일을 볼륨 디렉터리에 생성
docker run -d -p 80:80 --name myn --net mynet -v /nginx/conf:/etc/nginx/conf.d nginx
upstream was { ip_hash; server mywas:8080; } server { listen 80; server_name kbdev; access_log /var/log/nginx/test1.log; location / { #root /usr/share/nginx/html; index index.html index.htm index.jsp; proxy_pass http://was; } location ~ \.(css|js|jpg|jpeg|gif|htm|html|swf)$ { root /usr/share/nginx/html; index index.html index.htm; } location ~ \.(jsp|do)$ { index index.jsp; proxy_pass http://was; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_set_header Host $http_host; proxy_redirect off; charset utf-8; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } |
도커 컴포즈
도커 컴포즈를 활용하면 필요한 서비스를 한번에 배포, 운영할 수 있다
도커 컴포즈 용어
1. 프로젝트: 도커 컴포즈에서 다루는 워크 스페이스 단위 / 함께하는 서비스 컨테이너의 묶음
프로젝트 이름으로 브릿지 네트워크가 생성되고, 여기 안에서 서비스들이 운영된다
2. 서비스: 도커 컴포즈에서 컨테이너를 관리하기 위한 단위, 컨테이너라고 생각해도 된다. scale 기능을 통해 scale out 도 가능함
프로젝트는 빵 봉투, 서비스는 빵이라고 생각하면 된다
프로젝트 폴더를 만들고 그 안에 필요한 파일(마운트등,, 에필요한)을 넣는다.
+ 해당 위치에 docker-compose.yml 파일을 만든다
docker-compose.yml 에는 컨테이너에 대한 정보가 들어있으며, (선언적 랭귀지라고 함)
이 파일에 같이 선언된 컨테이너끼리는 포트없이도 통신이 가능하다 (같은 브릿지 네트워크에 들어감)
참고!
도커 컴포즈 설치 - https://docs.docker.com/compose/install
DOCKER_COMPOSE_VERSION=v2.2.3
sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
설치 잘 되었나 확인
docker-compose -v
작업 디렉토리 하나 만들어 ymal 파일 생성
mkdir /work/dc
강사님이 주신 ymal 넣기
local에 있는 파일 VM으로 옮기기 -> scp 명령어
docker-compose.ymal
docker-compose up
도커 컴포즈 컨테이너 스탑
docker-compose stop
도커 컴포즈 컨테이너까지 지우기
docker-compose down
백그라운드에서 실행하기
docker-compose up -d
실행되고있는 compose 프로젝트 확인하기
docker-compose ls
실행되고있는 compose 서비스 확인하기
docker-compose ps
yml 파일에서 포트를 주는 방법은 총 3가지가 있다
1. 포트 지정 안하기 - 컨테이너 원 포트가 붙는다
- 브릿지네트워크 내에서 외부접속 없이 통신하고자 할때 사용한다
2. "80" 하나만 주기 - 호스트 포트는 랜덤으로, 컨테이너 포트는 지정한 포트로 붙는다 (위 예시)
3. "80:80" 두개 다 주기 - 포트포워딩
과제 - docker-compose로 nginx와 was 연결해보기 (ymal에 -volume 옵션 찾아보기)
docker-compose.yml 파일 구성
services:
web:
image: nginx
volumes:
- ./conf:/etc/nginx/conf.d
ports:
- "80:80"
was:
image: gymin97/msa:sysinfo_v1
nginx.conf 파일
docker compose 안에 있는 서버끼리는 이름으로 통신할 수 있다
한 야물 안에 정의된 컨테이너는 서로 이름으로 통신할 수 있다 (이름으로 디스커버리 한다)
docker-compose up -d
was 서버 개수 늘리기
docker-compose up -d --scale was=3
scale out 할거면 포트포워딩을 해주면 안됨!
80:80이 아닌 80으로 놓고 들어오는 포트가 랜덤으로 지정되게 해야한다
과제: 3tier 환경을 docker compose에서 구성해보기
컨테이너 3티어를 만들기
- web 접속 시 -was로
- web은 로그를 남겨 주세요
DB 환경변수
mkdir -p /docker/db/env
cat <<EOF | sudo tee /docker/db/env/.env
MYSQL
_HOST=mysql-svc
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=frodo
MYSQL_DATABASE=frodo
MYSQL_USER=frodo
MYSQL_PASSWORD=frodo
MYSQL_ROOT_HOST='%'
EOF
지금까지 한 것
3tier
|---conf
| ㄴ-- was.conf (ngnix의 default.conf와 마운트)
|---log (nginx log와 마운트)
|
|__docker-compose.yml
was.conf
upstream mywas {
ip_hash;
server was:80;
}
server {
listen 80;
server_name kbdev;
access_log /var/log/nginx/test1.log;
location / {
#root /usr/share/nginx/html;
index index.html index.htm index.jsp;
proxy_pass http://mywas;
}
location ~ \.(css|js|jpg|jpeg|gif|htm|html|swf)$ {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~ \.(jsp|do)$ {
index index.jsp;
proxy_pass http://was;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $http_host;
proxy_redirect off;
charset utf-8;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
여기서 포트는 8080을 줘야할 것 같은데 8080을 줘도,, 80을 줘도 안된다
docker-compose.yml
services:
web:
image: nginx
volumes:
- ./conf:/etc/nginx/conf.d
- ./log:/var/log/nginx
ports:
- "80:80"
mysql-svc:
image: mariadb:10.3
env_file: /docker/db/env/.env
environment:
TZ: Asia/Seoul
was:
image: gymin97/msa:java-was
docker-compose -d up
왜 안될까?
문제 1 - DB 서버는 실행을 해도 ps를 보면 계속 excite로 켜지지 않는다
문제 2 - was 서버는 잘 켜졌다가 갑자기 다운되어버린다
문제가 뭘까?
yml 에서 포트를 안줘도 같은 프로젝트 안의 서비스라면 포트를 지정하지 않고 이름으로 통신이 가능하다
그리고 error.log를 봤을떄 포트 지정문제는 아닌것 같았다,,
왜 자꾸 was가 죽을까? expose 옵션을 주었을때도 동일한 문제가 발생한다
내일이면 알게 되겠지,,,
참고한 블로그 (하고자 하는 바가 거의 비슷)
오늘의 회고
- 내일이면 도커가 끝나는데,,,, 아직 보내기엔 너무나 모르겠는 도커
- 첫번째 과제가 비교적 무난해서 두번째 과제도 잘 되겠거니 했는데 잘 안된다,, 계속 오류나서 ㅜㅜ 결국 포기합니다 ( 해야할 일이 태산) 과제하느라 운동도 못가서 슬프다 근데 과제도 다 못해서 더 슬프다
- 과제 해결법을 얼른 알고싶다 .. 먼가 실마리가 보이면 계속해보겠는데 해볼수 있는 수는 다 써봐서 정말 모르겠다
- 내일은 꼭 운동 가야지
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 39 - GCP 가상머신 만들기, 도커, 쿠버네티스 설치 및 테스트 (0) | 2022.03.04 |
---|---|
Day 38 - docker-compose 3tier, SQL (간단), GCP 가입 (0) | 2022.03.03 |
Day 36 - 도커 네트워크 | 도커 3tier (0) | 2022.02.28 |
Day 35 - 네트워크 특강 (0) | 2022.02.25 |
Day 34 - 도커 실습 (0) | 2022.02.24 |