인프라

11. Docker Compose

오늘의 나1 2021. 4. 3. 02:24
출처: youtu.be/iJkDSZRReEQ?list=PLz7S5PHCu4OlEaF8PlxCY2IDEBaYVhu9j

도커 서비스

개념

  • 하나의 애플리케이션을 구성하는 기능 단위
  • 예: 비디오 스트리밍 애플리케이션을 구성하는 서비스들
    • 비디오를 DB에 저장하는 서비스
    • 비디오를 트랜스코딩하는 서비스
    • 프론트엔드 서비스
    • 등등

예: 일반적인 웹 사이트 애플리케이션을 구성하는 서비스

  • https://www.drivendata.co/blog/docker-for-concept-to-clinic-challenge/
  •   3개의 서비스로 구성: 웹 서비스(백, 프론트) / DB 서비스 / AI 데이터 처리 서비스
  • 각각의 서비스가 별도의 이미지로 만들어서 컨테이너(들)로 동작
  • 각 서비스 별로 이미지 1개가 생성되고, 최소 3개의 컨테이너가 생성되어 애플리케이션이 동작
  • 전체 애플리케이션을 서비스 단위로 관리하여 복잡도를 낮춰서 관리할 수 있음 (MSA)

도커 컴포즈에서의 서비스

  • 도커에서 하나의 서비스는 하나의 이미지로 만들어지고, 컨테이너 실행 정보(DockerFile)와 컨테이너 스케일링 정보(도커컴포즈 파일)에 정의된 대로 한 개 이상의 컨테이너를 실행하여 애플리케이션 내에서 동작하게 된다

도커 컴포즈

  • 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 도구
  • docker-compose.yml 파일에 애플리케이션을 실행하기 위한 서비스 종류와 서비스 메타 정보를 기술함

도커 컴포즈 특징

하나의 애플리케이션 내 서비스 관리를 위한 기능을 제공 (다음은 예시)

  • 모든 서비스 실행: docker-compose up
  • 모든 서비스 종료: docker-compose down
  • 특정 서비스 스케일 업: docker-compose scale

도커 컴포즈 설치

설치 가이드

설치 확인

  • 터미널에서 docker-compose 커맨드 실행해보기
  • 나는 설치되어 있었음(도커 설치할 때 같이 설치되었나?)

도커 컴포즈 파일 생성하기

도커 컴포즈 생성하기

  • 워킹 디렉터리 만들기
  • 워킹 디렉터리로 루트에 docker-compose.yml 파일 생성하기
  • Docker-compose.yml 파일에 아래 내용 추가하기
    • 주의할 점: TAB이 인식이 안 됨

도커 컴포즈 파일 예1

  • 웹 서비스, DB 서비스로 구성된 애플리케이션
  • 웹 서비스의 포트 바인딩을 하지 않아서 docker-compose up으로 애플리케이션을 실행해도 접속할 수 없다

```yaml

services: # 애플리케이션을 구성하는 서비스

  web: # 도커 허브에 등록된 nginx 이미지를 사용하는 웹 서비스

    image: nginx

    # ports:

      # - “80:80” # 포트 바인딩

  database: # 도커 허브에 등록된 redis 이미지를 사용하는 DB 서비스

    image: redis  

```

도커 컴포즈 파일 예2

```yaml

version: ‘3.9’

services:

  db: # mysql

    image: mysql:5.7

    volumes: # 볼륨

      - db_data:/var/lib/mysql # 볼륨을 바인딩?

    restart: always # 재시작 조건

    environment: # 환경변수

      MYSQL_ROOT_PASSWORD: somewordpress

      MYSQL_DATABASE: wordpress

      MYSQL_USER: wordpress

      MYSQL_PASSWORD: wordpress

 

  wordpress:

    depends_on: # 의존하는 컨테이너

      - db

    image: wordpress:latest

    ports:

      - “80:80”

    restart: always

    environment:

      WORDPRESS_DB_HOST: db:3306

      WORDPRESS_DB_USER: wordpress

      WORDPRESS_DB_PASSWORD: wordpress

      WORDPRESS_DB_NAME: wordpress

 

volumes: # 애플리케이션 실행 시 참조하는 볼륨 정보

      db_data: {}

```

 

도커 컴포즈 실행

```sh

example02 $ docker-compose up -d # detach 모드로 실행

Creating network "example02_default" with the default driver 

Pulling db (mysql:5.7)…

Pulling wordpress (wordpress:latest)...

Creating example02_db_1 … done

Creating example02_wordpress_1 … done

```

  • 도커 컴포즈 실행 시, 워킹 디렉터리 이름을 바탕으로 가상 네트워크 이름과 서비스들의 컨테이너 이름이 생성

도커 컴포즈 설정 확인

  • docker-compose.yml 파일에 설정된 값을 바탕으로 생성된 docker-compose 설정을 출력
  • docker-compose config
  • docker-compose config —help
  • docker-compose config —services
  • docker-compose config —volumes   

도커 컴포즈 모니터링

  • docker container ls -a & docker image ls: 전체 컨테이너 목록, 이미지 출력
  • docker stats: 현재 디렉터리의 도커 CPU/메모리 모니터링

도커 컴포즈 종료

  • docker-compose down: 컨테이너 종료 & 삭제, 이미지 남아 있음
  • docker-compose up으로 실행해서 ctrl+C로 종료: 컨테이너 종료만. 삭제는 안 됨, 이미지 남아있음

도커 컴포즈 포트 맵핑

포트 매핑 예

  • services.[service-name].ports 키에 [“호스트컴퓨터 포트:도커컨테이너 포트”]  설정

```yml

services:

  nginx:

    ports:

      - “8080:80”   # 호스트컴퓨터에서 localhost:8080를 치면 웹 서버에 접속할 수 있음

```

NAT/PAT

  • NAT(Network Address Translation): 프라이빗 네트워크 내의 여러 IP를 퍼블릭 IP로 1:1 매핑

 

 

 

 

 

 

 

 

 

 

 

  • PAT(Port Address Translation): NAT의 일종, 프라이빗 네트워크 내의 여러 IP를 하나의 퍼블릭 IP로 매핑한다. 포트를 달리해서 각 IP를 구분

실습

Manager & Worker (Ubuntu)

docker-compose.yml 실습 명령어

```yaml

services:

  manager:

    image: ubuntu:latest

    tty: true

  worker1:

    image: nginx

    ports:

      - “8001:80”

  worker2:

    image: nginx

    ports:

      - “8002:80”  

```

```sh

$ docker-compose up -d

$ docker-container ls

$ curl http://localhost:8081

$ curl http://localhost:8082

$ docker container exec -it {master container ID} /bin/bash # master container(ubuntu) 안으로 들어가서 명령어를 입력할 수 있다

[master]$ apt-get update

[master]$ apt-get upgrade

[master]$ apt-get -y install curl

[master]$ curl http://worker1:80 # 컴포즈 파일을 바탕으로 DNS 바인딩

[master]$ curl http://worker2:80 # 컴포즈 파일을 바탕으로 DNS 바인딩 

[master]$ exit # 컨테이너 밖으로 나감

$ docker-compose down

```

DNS

  • 도커 컴포즈로 만든 컨테이너들은 {서비스명}으로 통신할 수 있음

Manager & Workers (Alpine) 

docker-compose.yml 실습 명렁어1

```yaml

services:

  manager:

    image: alpine:latest

    tty: true

  worker1:

    image: nginx

    ports:

      - “8001:80”

  worker2:

    image: nginx

    ports:

      - “8002:80” 

```

```sh

$ docker-compose up -d

$ docker-container ls

$ curl http://localhost:8081

$ curl http://localhost:8082

$ docker container exec -it {master container ID} /bin/sh # alpine의 터미널 

[master]$ apk add curl # alpine에서 curl 설치하기

[master]$ curl http://worker1:80

[master]$ curl http://worker2:80 

[master]$ exit

$ docker-compose down

```

실습 명령어2: 스케일링

실습 명령어3: 도커 컴포즈의 특정 서비스만 실행하기 & 해당 서비스의 옵션 변경하기

```sh

$ docker-compose up -d —scale manager=4 # manager 컨테이너 4개

$ docker container ls -a

$ docker-compose ps # 컨테이너 프로세스 상세, 바인딩된 포트 확인

$ docker-compose logs

$ docker-compose down

```

```sh

$ docker-compose run -p 9998:80 -d worker1

```

Shared Filesystems

docker-compose.yml 실습 명령어

```yaml

services:

  manager:

    image: alpine:latest

    tty: true

    volumes:

      - .:/code # 호스트머신의 현재 디렉터리를 컨테이너의 /code와   연결

  worker1:

    image: nginx

    ports:

      - “8001:80”

  worker2:

    image: nginx

    ports:

      - “8002:80” 

```

```sh

$ docker-compose up -d

$ docker container ls -a

$ docker container exec -it {master container ID} /bin/sh

[master]$ api add nano

[master]$ cd code

[master]$ ls -al

[master]$ nano docker-compose.yml

  Add “# test” at the end of the docker-compose.yml # 컨테이너에서 수정한 것이

[master]$ exit

  Check “# test” in the docker-compose.yml # 호스트에 변경되어 있다 (같은 파일이니까)

```

과제(작성중)

  • 도커파일 또는 도커이미지를 생성하고 도커 허브에 푸시
  • 알파인 도커파일
  • nginx 도커파일
    • Java 11 설치
    • Git 설치
    • Git 클론
    • Mysql 클라이언트 실행
    • 스프링 실행
    • 포트 매핑
  • Mysql 도커파일
    • 테이블 만들기

 

'인프라' 카테고리의 다른 글

13. 도커 스웜-1  (0) 2021.04.19
10. 도커 스토리지  (0) 2021.04.04
10. 도커 이미지 빌드 & 푸시 실습  (0) 2021.03.30
8. 도커 이미지 배포  (0) 2021.03.30
9. DockerFile  (0) 2021.03.14