출처: 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 |