갬미의 성장일기

Day 37 - 도커, 도커 컴포즈 3tier 본문

Cloud/Cloud 공부일기

Day 37 - 도커, 도커 컴포즈 3tier

갬미 2022. 3. 2. 21:16

오늘 배운 내용

- 도커 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
좌: ip 접속, 우: 8080 접속

 

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 에는 컨테이너에 대한 정보가 들어있으며, (선언적 랭귀지라고 함)

이 파일에 같이 선언된 컨테이너끼리는 포트없이도 통신이 가능하다 (같은 브릿지 네트워크에 들어감)

 

참고!

 

도커 컴포즈 기초 및 문법

docker compose에 대해서 배워봅시다

velog.io

도커 컴포즈 설치 - https://docs.docker.com/compose/install

 

Install Docker Compose

 

docs.docker.com

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 명령어 

 

[Linux] 리눅스 scp 명령어 사용법

scp secure copy의 줄임말로 ssh를 이용하여 네트워크로 연결된 호스트간에 파일을 주고받는 명령어 원격지에 있는 파일과 디렉터리를 보내거나 가져올 때 사용하는 파일 전송 프로토콜 ssh와 동일한

eehoeskrap.tistory.com

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티어를 만들기

  1. web 접속 시 -was로
  2. 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 옵션을 주었을때도 동일한 문제가 발생한다 

내일이면 알게 되겠지,,,

 

참고한 블로그 (하고자 하는 바가 거의 비슷)

 

[Docker] docker-compose 이용한 mariadb + tomcat 서버 세팅 추가정리

기존에 돌아가고있는 톰캣 서버가 있는데 jar 파일도 여러개있고 이것저것 함수 쓰이는게 많아서 환경을 어떻게 구성해줘야하나 .. 고민하다가 결국 성공했는데 핵심은 jar 파일이었다. jar파일

bug41.tistory.com

 

오늘의 회고

  • 내일이면 도커가 끝나는데,,,, 아직 보내기엔 너무나 모르겠는 도커
  • 첫번째 과제가 비교적 무난해서 두번째 과제도 잘 되겠거니 했는데 잘 안된다,, 계속 오류나서  ㅜㅜ 결국 포기합니다 ( 해야할 일이 태산) 과제하느라 운동도 못가서 슬프다 근데 과제도 다 못해서 더 슬프다
  • 과제 해결법을 얼른 알고싶다 .. 먼가 실마리가 보이면 계속해보겠는데 해볼수 있는 수는 다 써봐서 정말 모르겠다
  • 내일은 꼭 운동 가야지
Comments