docker compose 사용 방법

Smart-JYS
7 min readFeb 24, 2020

--

용도에 따라서 docker 컨테이너를 한개 또는 그 이상 생성할 수 있습니다. 이 컨테이너들을 하나로 통합해야 하는 경우가 발생하는데, 이때 docker compose는 유용하게 사용이 가능합니다.

docker compose의 정의는 간단합니다.

연결된 다수의 컨테이너를 하나로 통합하여 관리하는 도구

어떻게 통합을 하냐…? 바로 yaml 형식으로 만듭니다. yaml은 key:value 형식이며 공백을 꽤 까다롭게 봅니다. (되도록 space를 사용하는게 좋습니다.)

docker compose 를 시작 전 설치를 해야합니다.

docker를 설치 후 추가로 docker compose를 추가 설치 하여야 합니다. 설치 방법은 간단합니다. docker docs 에 친절하게 나와 있습니다.

https://docs.docker.com/compose/install/

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

설치 후 권한을 줍니다.

sudo chmod +x /usr/local/bin/docker-compose

버전을 확인 해보도록 하겠습니다.

$ docker-compose --version
docker-compose version 1.22.0, build f46880fe

준비는 끝났습니다.

최근 코로나로 인해 여행을 가진 않겠지만, 여행으로 예로 들겠습니다.

여행사에 접속하여 로그인하고 패키지, 항공사, 숙소를 확인한다고 생각하겠습니다. 약간 MSA 를 흉내 내 봤습니다.

각각 컨테이너로 구성되어 있고 그림에서 CompanyPackage 을 연동 해보도록 하겠습니다.

Package 는 flask 웹 애플리케이션으로 구성하겠습니다.

Flask은 python 기반의 가벼운 웹 애플리케이션 입니다.

참고: Flask is a lightweight WSGI web application framework

Package를 먼저 구성하겠습니다.

tour directory 와 tour directory 안에 package directory를 생성합니다.

$ mkdir -p ./tour/package
$ cd ./tour/package

api.py 파일을 생성합니다.

vi api.py# Packagefrom flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Package(Resource):
def get(self):
return {
'package': ['Saipan', 'Guam', 'Newyork']
}
api.add_resource(Package, '/')if __name__=='__main__':
app.run(host='0.0.0.0', port=80, debug=True)

Package라는 클래스를 생성하고 return value에 package list를 작성합니다.

host는 모드 허용(0.0.0.0)하고 포트는 80 포트를 사용하겠습니다.

python package 관리 파일인 requirements.txt 파일을 만듭니다. 이 파일에는 간단한 버전 정보만 넣어 줍니다.

$ vi requirements.txtFlask==0.12
flask-restful==0.3.5

이제 docker를 빌드하고 실행하기 위해 Dockerfile 을 만듭니다.

$ vi DockerfileFROM python:3-onbuild     # docker hub image
COPY . /usr/src/app # source copy
CMD ["python", "api.py"] # execute command 순서

Flask 를 실행하려면 flask을 실행할 수 있는 환경을 필요하지만 전 따로 설치 하지 않고 이미 라이브러리가 설치 되어 있는(구동이 가능한) 컨테이너(python:3-onbuild)를 사용하겠습니다.

docker build하고 run 을 실행해 봅니다.

$ docker build -t webapp .
Sending build context to Docker daemon 4.096kB
Step 1/3 : FROM python:3-onbuild
# Executing 3 build triggers
중략....
$ docker run -p 8080:80 webapp

이제 웹 브라우저로 호출을 해봅니다.

컨테이너가 잘 실행 된 듯합니다. 하지만 아직 부족합니다.

docker compose를 통해서 company 컨테이너와 package 컨테이너를 같이 사용 해보도록 하겠습니다.

company directory 를 생성 후 directory 안에 index.php 파일을 만듭니다.

$ mkdir -p ./tour/company
$ cd ./tour/company
$ vi index.php

index.php 를 만든 다는 것은 php를 사용하겠다는 의미입니다.

$ vi index.php<html>
<head>
<title> Tour list </title>
</head>
<body>
<h1>Welcome to our company </h1>
<ul>
<?php
$json = file_get_contents('
http://package-product');
$obj = json_decode($json);
$products = $obj->package;
foreach ($Package as $package) {
echo "<li>$package</li>";
}
?>

</ul>
</body>
<html>

json 타입을 php로 변환 한 후 ui 태그에 담는 내용입니다.

docker-compose.yml 파일에 컨테이너를 유기적으로 연결 시킵니다.

version: '3'services:
package-product:
build: ./package
volumes:
- ./package:/usr/src/app
ports:
- 8180:80
company:
image: php:apache
volumes:
- ./company:/var/www/html/
ports:
- 8080:80
depends_on:
- package-product

company 컨테이너를 호출하면 package-product 의존성이 있기 때문에 package-product 컨테이너로 호출할 겁니다.

쉽게 말해 company 컨테이너는 gateway 역할을 하는 용도입니다.

이제 실행 해보도록 하겠습니다.

docker compose 를 실행할때는 docker-compose up 입니다.

$ docker-compose up

이제 브라우저로 호출 해 보도록 하겠습니다.

정상적으로 호출 되었고 소스를 조금만 수정 해보도록 하겠습니다.

docker compose는 Ctrl + C 를 하면 stop 됩니다. 한번 더 Ctrl + C 하시면 강제로 kill이 됩니다.

소스를 수정 완료 하였습니다. 다시 docker-compose up 를 실행합니다.

company + package 두개의 컨테이너를 yaml파일을 통해 통합하였습니다.

실행이 잘 되는 것 같습니다.

--

--

Smart-JYS

자신이 하는 일을 잘 이해할수록 그 일을 더 잘한다.