개발자 일기장

[Docker #3/도커 컴포즈 설치 및 활용] 본문

Docker

[Docker #3/도커 컴포즈 설치 및 활용]

kmsjks79 2020. 11. 24. 21:25

도커 컴포즈

이전 포스팅에서는 도커파일(Dockerfile) 을 이용하여 주피터 노트북(Jupyter notebook)을 컨테이너로 실행시켰었다.

하지만 이런 단일적인 프로세스만을 지원했다면 도커가 지금과 같이 업계에서 성장하진 못했을것이다.

도커 네트워크 구조

도커는 도커 네트워크 브릿지를 사용하여 컨테이너간의 유기적인 연결을 지원한다. 도커를 처음 설치하면 위의 그림과 같이 도커의 네트워크가 구성되게 되는데, 도커 네트워크에 관한 부분은 추후에 있을 포스팅을 통하여 조금 더 정확하게 알아보도록 하자.

 

이렇게 컨테이너간 연결을 통해서 여러개의 컨테이너를 연결시켜 하나의 서비스 단위의 프로세스를 모두 컨테이너로 실행시킬수도있다. 이것을 가능하게 하는것은 docker-compose나, kubernatics와 같은 컨테이너 오케스트레이션 도구가 존재하기 때문이다.

 

연결 되어야할 컨테이너의 수가 적다면 docker-compose를 사용하는것이 적합하고, 많다면 Kubernatics 클러스터를 운용하는것이 바람직할것이다. 오늘은 도커가 제공하는 컨테이너 오케스트레이션 도구로써 가장 많이 사용되는 docker-compose에 대해 알아보고 어떤식으로 활용될 수 있는지 알아보도록 하겠다.

 

docker-compose

이미지를 빌드하기 위해 작성한 Dockerfile은 하나의 이미지에대해 빌드된 컨테이너를 만들어 구축한 단일 환경이라고 하면, docker-compose는 여러개의 컨테이너를 묶어서 서비스를 구축하는 것이라고 설명하는것이 가장 이해하기 쉬울것이다. docker-compose .yml 확장자를 갖고있는 파일이며 파일이 작성되어있는 구조는 생각보다 직관적이므로 파악하는데 어려움은 없을것이라 생각한다.

 

도커 컴포즈의 특징

- 복수 개의 컨테이너를 실행시키는 도커 애플리케이션이 정의를 하기 위한 툴

- Compose를 사용하면 YAML 파일을 사용하여 애플리케이션의 서비스를 구성

- single command를 사용하여 구성에서 모든 서비스를 만들고 시작

- Compose는 모든 환경(workflow에서 production, staging, development, testing 및 CI 워크플로우)을 포함

 

사용 순서

1. 앱의 환경을 정의하여 어디에서나 재사용할 수 있는 Dockerfile 혹은 이미지를 정의

2. docker-compose.yml 에서 앱을 구성할 수 있는 서비스 정의를 통해서 하나의 환경에서 실행할 수 있도록 함

3. docker-compose up 명령어를 실행을 통해 Compose를 시작하고, 전체어플리케이션 실행

 

도커 컴포즈 설치

1


2
3
sudo curl -L \
"https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \
-/usr/local/bin/docker-compose
sudo chmod +/usr/local/bin/docker-compose
sudo ln -/usr/local/bin/docker-compose /usr/bin/docker-compose
cs

1. 링크에서 설치하고자 하는 버전 확인후 설치

2. 명령어에 실행권한 부여

3. Path error방지를 위해 심볼릭 링크 설정

도커 컴포즈 설치 후 버전 확인

docker-compose.yml 파일 작성

ex) Django(WAS) + Nginx(WEB) + Gunicorn(Middle-ware) 서비스 실행을 위한 예시 docker-compose.yml

version: "2"
services:
  django:
    image: ID/xxxxx:centos7.8-python3.8
    container_name : django_container
    volumes: 
      - /home/user/django/:/home/
    working_dir : /home/test_prj/
    command:  
      bash -c "python manage.py makemigrations test
      && python manage.py migrate   
      && python manage.py collectstatic
      && gunicorn config.wsgi --bind 0.0.0.0:8000 --daemon --reload"
    ports: 
      - "8000:8000"
    expose : 
      - "8000"
  nginx:
    image: ID/xxxxx:nginx
    container_name : nginx_container
      - /home/user/nginx/:/etc/nginx/conf.d
      - /home/user/django/.static_root/:/static
    ports:
      - "80:80"
    depends_on : 
      - django

사용된 이미지는 개인 도커 허브저장소의 이미지를 사용하였으며, 이미지는 python 3.8, Django, Gunicorn 이 설치되어있는 상태의 이미지이다.  아래는 docker-compose.yml 파일의 구성항목이다.

더보기

services : 컨테이너 환경에 기반되는 이미지 및 도커파일, 컨테이너 이름, 볼륨, 포트 등의 설정을 포함해서 실행 시킬 서비스의 이름을 지정한다.

  build or image : 컨테이너를 실행하기 위해 필요한 도커파일 혹은 이미지이다. 이미지는 도커 허브 혹은 로컬 환경의 이미 존재하는 이미지를 사용한다.

  container_name : 실행시킬 서비스의 컨테이너 이름을 지정한다.

  volumes : 컨테이너에서 사용될 호스트OS의 파일 시스템을 지정한다. 

  working_dir : 컨테이너 내부에서 실제 프로세스가 동작할때 요구되는 경로를 지정한다.

  command : 컨테이너 실행 시 동작되야하는 커맨드를 지정한다. 여러개의 커맨드를 위와 같이 연속적으로 실행시키는 것도 가능하다. 

  ports :  호스트OS의 포트와 포트포워딩할 컨테이너 내부 포트를 지정한다. {로컬port}:{컨테이너port} 이다.

  expose : 컨테이너에서 외부로 노출시킬 포트를 의미한다. 로컬 호스트를 통해 같은 포트로 포트포워딩이 되어있다면 추가적으로 지정해주지 않아도 상관 없다.

이 외에도 추가적으로 

더보기

enviroment : 컨테이너 내부의 환경변수를 설정한다.

extra_hosts : 컨테이너 내부의 /etc/hosts 를 설정한다. 실제로 docker compose up 이후에 해당 컨테이너에 접속 후 /etc/hosts를 확인해보면 적용되어 있는것을 확인할 수 있다.

등의 여러가지 항목이 있다. 어떤 서비스를 어떻게 구성하는지에 따라 유연하게 사용하면 될 것이다. 도커 컴포즈를 사용해서 아직 실제 서비스를 운영해보진 않았지만, 소규모의 서비스를 개발하고 운영할때 사용하게 된다면, 상당히 효율적으로 구성할 수 있을것같다.

  

다음 포스팅은 도커를 사용하여 개발을 진행할때 항상 도커 커맨드를 외우면서 개발하기에는 어려움이 있기 때문에, 도커 커맨드 및 발생하는 에러 상황에 대한 해결법을 나름대로 정리해서 포스팅 하려고 한다.

 

출처 :

medium.com/withj-kr/docker-%EB%B6%80%ED%84%B0-kubernetes-%EA%B9%8C%EC%A7%80-5-docker-compose-%EC%9E%85%EB%AC%B8-ece1a6721775

 

[Docker 부터 kubernetes 까지] [#5] Docker Compose 입문

안녕하세요 소프트웨어 엔지니어 최지호입니다.

medium.com

my-repo.tistory.com/31

 

Docker-Compose 를 활용한 Django + Nginx + Gunicorn Container 구축기

Docker-Compose 를 활용한 Django + Nginx + Gunicorn Container 구축기 목차 1. 도커란? 2. Django+Python 프레임워크 튜토리얼 3. 장고, Nginx, Gunicorn 각각의 역할과 차이점 4. 본격적인 구축 시작 - Dockerf..

my-repo.tistory.com

 

'Docker' 카테고리의 다른 글

[Docker #5/설치하고 시작하기(Window)]  (0) 2020.11.25
[Docker #4/docker command 정리]  (0) 2020.11.25
[Docker #2/설치하고 시작하기(Linux)]  (0) 2020.11.22
[Docker #1/도커 개념정리]  (0) 2020.11.22
Comments