[Docker Compose란?]
여러 컨테이너를 모아서 관리하기 위한 툴
웹 서비스는 프론트엔드 서버, 데이터베이스 서버, 백엔드 서버 등으로 이루어져 있다.
각각을 docker컨테이너로 작성하고, 연결하여 동작하기 때문에, Docker Compose와 같은 관리 툴이 필요하다.
더 나아가, 서비스 규모가 커지면, 매우 많은 양의 컨테이너를 유지, 관리하기 위해 쿠버네티스 등의 관리 툴이 필요하게 된다.
docker compose는 docker-compose.yml 이라는 파일을 작성하여, 도커 설정을 넣는다. ( 도커 이미지를 설정하는 Dockerfile 처럼)
이 파일을 도커 이미지 처럼 docker compose 명령으로 실행하면, 다수의 도커가 실행되며, 도커들간의 커뮤니케이션이 이뤄지고, 한번에 전체 도커를 내리거나, 새로 이미지를 재빌드하는 등등의 기능이 제공된다.
docker-compose.yml는 Dockerfile과 다르게, .yml 확장자로 구현해야한다.
따라서 Docker-compose 파일을 만들기 위해 yml 문법을 알아보자.
yml 기본 문법
key, value, 들여쓰기를 중심으로 구성.
JSON과 유사하지만, 이를 대체할 문법은 되지 못할 것으로 보이나, 일부 기술들에서 해당 문법을 필요로하기에 알아둘 필요가 있다.
yml
들여쓰기(2칸 or 4칸)으로 포함관계를 나타낸다.
ex)
tech:
tech1:~~~
tech2:~~~~
#: 주석
key:value 형태로 이루어진다.
int_type
string_type
boolean_type
를 통해 iny, string, bool자료형 지원한다.
실제 docker-compose.yml 사용 예시
[Docker Compose 사용법]
volumes, networks는 잘 안쓰인다 ( 대용량 서비스에서 보통 쓴다)
보통은 하나의 도커에 여러 도커를 넣고, 그 도커 내부에서 여러 도커를 동작 시킨다.
내부 네트워크가 알아서 동작되기에, 별도의 네트워크 설정이 없어도 되는 것.
하지만 여러 기능을 처리하는 도커들간의 통신이 점점 생겨나는 대형 서비스의 경우, 필요한 것.
[services]
여러 컨테이너들을 정의한다. 도커 컨테이너 이름, Dockerfile과 유사한 문법으로 각 컨테이너를 정의할 수 있다.
위는 base 이미지를 가져오는 것. 만약, 개인적으로 만든 도커 이미지를 사용하고 싶은 경우, 별도의 명령어를 사용해야한다.
restart: always로 서버가 다운되어도 알아서 재시작되게하여,
계속 서버가 다운되는 상황에 직면하지 않는다면, 서버를 지속적으로 동작시킬 수 있다.
+하나의 컨테이너에 여러가지 Volume을 넣을 수 있다.
ex)
volumes:
- V1 경로
- V2 경로
[ports]
[Docker Compose 실행, 중지하기]
docker-compose up -> ( 도커 이미지를 만들며 실행하는 run과 유사 )
docker-compose up -d
//( 보통 -d 로 백그라운드로 실행한다. -> foreground로 실행시 도커의 STDOUT만 나오고, 다른 명령을 실행할 수 없다)
위와 같은 명령어로, 현재 디렉토리의 "docker-compose.yml" 을 기반으로 도커 생성.
*** 도커 이미지와 마찬가지로, 각 docker-compose.yml은 디폴트 이름으로 설정하고, 각 docker-compose.yml 마다 디렉토리를 할당해서 docker-compose up 과 같이, 현재 디렉토리에서 별도의 지정 없이 바로 실행하게 해둔다. ( stop, logs 등등 도 다른 모든 명령어들도 마찬가지로 지정 없이 가능)
docker-compose stop -> 중지 명령
docker-compose down -> 삭제 명령 ( 중지한 뒤 삭제해야함)
***주의 docker-compose.yml 파일은 해당 파일이 존재하는 디렉토리에서 up, down을 통해 생성&실행, 삭제 하자.
(a 디렉토리에서 생성 후 b 디렉토리에서 down 하는 등 방식은 정상적으로 동작하지 않을 수 있다.
이제 기존의 docker-compse.tml에 컨테이너를 추가하면, 추가적인 문법들을 이해해보자.
app 영역을 담당하는 파일이 ./01_FLASK_DOCKER 에 존재한다고 가정하고,
app 컨테이너, db 컨테이너 를 docker-compose를 통해 생성하여 연결해보자.
아래는 app 컨테이너의 main.py이다.
위와 같이 올바르게 app에서 db 접속 성공시, "SUCCESS" 메세지를 리턴하는 파일을 작성했다.
host= app 컨테이너에서 mysql 데이터 베이스의 컨테이너를 지칭하는 언어
( link 옵션에서 db: mysqldb )와 같이 지칭한 이름을 넣어주면 된다.
기존의 Dockerfile에서 --link 옵션을 통해 컨테이너 간의 연결을 수행한 것과 유사하게 옵션을 작성할 수 있다.
services:
app: # 새로운 app 이미지
build: #Dockerfile로 이미지를 빌드하도록 하는 설정
context: ./01_FLASK_DOCKER # 도커 파일 경로를 지칭한다.
dockerfile: Dockerfile # 도커 파일명
links:
- "db:mysqldb" # 같은 도커 컴포즈 안의 db컨테이너를 mysqldb라는 이름으로 연결하는 옵션
ports:
- "80:8080"
container_name: appcontainer #컨테이너의 이름 설정. 이 설정x 시 자동으로 연관 디렉토리로 이름이 생성된다.
depends_on: # db, app 컨테이너중 뭐가 먼저 실행될 지 모른다.
- db #app 컨테이너가 생성되기 전 지정한 db 컨테이너가 생성되도록 한다.
db:
image: mysql:5.7
restart: always
volumes:
- ./mysqldata:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=exdb
ports:
- "3306:3306"
depends_on: 지정한 컨테이너(db) 가 생성 된 후에 app 컨테이너가 생성되는 것은 보장이 되지만,
db 컨테이너가 생성 된 후, 파일 생성, db 생성, 등등 필요한 작업(초기 작업)을 수행한 뒤 db 컨테이너가 띄워지는데, 이러한 작업들이 완료 된 뒤 app컨테이너가 실행되는 것은 보장되지 않는다.
따라서 내부 로직을 제대로 알고 구현해야한다.
.dockerignore. -> COPY 명령어가 수행되면, 해당 파일에 명시되어 있는 특정 파일, 폴드는 제외하도록 설정 할 수 있다.
**** .dockerignore는 숨겨진 파일이기에, ls -al 로 찾을 수 있다.
vi .dockerignore 과 같이 진입한 뒤,
Dockerfile
#주석은 샵
*/flask* # * 는 anyThing ok 뜻 -> xxx/flask~~~ 제외
*/*/flask* # xxx/xxx/flask~~ 제외
flask? #. flask1,flask2 와 같이 ? 는 한글자만 가능
*.txt #모든 .txt 확장자를 제외하지만
!flask.txt # flast.txt는 제외하지 않기 ( ! 명령어 )
이런식으로 Spring의 antPathMacher과 유사한 문법을 사용할 수 있다.
이제 실행할 디렉토리( 저는 02_FLASK_MYSQL 디렉토리 ) 에 docker-compose.yml과 app 이미지에 대한 디렉토리 ( 해당 이미지의 Dockerfile, app 기능을 수행하는 간단한 flask code 등등) 을 담도록 구성해준 뒤, docker-compose up 을 통해 실행해보자.
올바르게 app 컨테이너에서 db 컨테이너와 연결된다.
3.37.137.127 ( host pc의 퍼블릭 ip )의 80 포트(디폴트) -> app (flask ) 서버 접속 -> mysql 서버 접속
과 같은 플로우로 동작하게 된다.
+@ 보통은 -d옵션을 통해 백그라운드로 실행해야한다!
foreground로 실행 시, 터미널이 띄워지게되고, 해당 서버가 배포중인 모든 시간 동안, host pc에서 다른 작업을 수행할 수 없다.
docker-compose config
해당 docker-compose 가 사용중인 yml 파일을 조회 가능하다.
'DevOps' 카테고리의 다른 글
Apache VS Nginx 비교분석 (0) | 2023.04.20 |
---|---|
[도커] Nginx 웹서버 설정 이해하기 (1) | 2023.04.20 |
[도커] 도커 활용 (0) | 2023.04.19 |
[도커] Docker File 기본 사용법 (0) | 2023.04.18 |
[도커] Mac에서 도커 세팅법 (0) | 2023.04.14 |