구리의 창고

docker-compose 사용 본문

DevOps

docker-compose 사용

구리z 2017. 7. 12. 17:21

소개

이 글에서는 docker-compose를 사용하는 간략한 예제를 다룰 것이다. 당연한 얘기지만 docker, docker-compose가 설치되어있어야한다. 설치 관련된 내용은 아래 글을 참고하면 된다.


자세한 설명보단 예제를 작성 할건데, 기본적으로 docker-compose.yml이라는 설정 파일을 통해 관리된다.

예제 시나리오

Golang으로 간단한 HTTP서버를 작성하고, nginx에 reverse proxy로 연동 할 것이다. Golang은 HTTP 서버를 사용하기 위한 방법이니, 예제를 보고 다른 언어로 바꿔서 작성해도 무관하다.

1. 5000번 포트로 통신하는 HTTP 서버를 생성한다.
2. HTTP 서버를 Docker image로 만든 후 실행한다.
3. nginx의 reverse proxy 설정 파일을 포함시켜 실행한다.
4. nginx 설정을 통해 최종 외부 포트는 80번을 이용하도록한다.
5. docker-compose 파일에 모든 설정을 기록한다.
6. docker-compose로 모든 container를 실행한다.
7. 제대로 실행되었는지 확인한다.

아래에서 사용되는 모든 파일을 https://github.com/odg0318/docker-compose-example에서 확인 할 수 있다.

1. HTTP 서버 작성

위에서 말한대로 Golang으로 GET / 요청 시 "Hello World"를 보여주는 간단한 서버를 작성하였다. 코드에서 보면 알 수 있는데, 이 서버는 5000번 포트를 통해 통신하도록 되어있다.
package main

import (
        "log"
        "net/http"
)

func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
                log.Print("GET / 200 OK")
                w.Write([]byte("Hello World"))
        })

        http.ListenAndServe(":5000", nil)
}

2. Dockerfile 작성

위에서 작성한 프로그램을 하나의 Docker image로 만들어야한다.
FROM golang:1.8

WORKDIR /go/src/app
COPY main.go main.go

RUN go-wrapper download
RUN go-wrapper install

EXPOSE 5000

CMD ["go-wrapper", "run", "app"]

3. nginx 설정 파일 작성

Reverse proxy를 위한 설정 파일이 필요하다. 여기서 중요한 점은 upstream을 설정할 때, web:5000이란 부분을 볼 수 있다.. 이 부분은 docker-compose와 연관되므로 더 아래에서 설명하도록 하겠다.
upstream app {
  server web:5000;
}

server{
  listen 80;

  access_log /var/log/nginx/access-portus.log;
  error_log /var/log/nginx/error-portus.log;

  location / {
    proxy_pass http://app;
  }
}

4. docker-compose.yml 작성

여기서 위에서 말한 web:5000의 정체가 여기서 나타난다. docker-compose는 아래처럼 여러 개의 service로 설정되는데, service 한 개는 Docker container 한 개를 의미한다. 
version: '3'

services:
  web:
    build: .

  nginx:
    image: nginx:1.13.0
    links:
      - web:web
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    command: ['nginx', '-g', 'daemon off;']
    ports:
      - 80:80
web service는 위에서 작성한 Dockerfile을 빌드 후 생성된다. build의 의미를 문서에서 한 번 더 확인하자.

nginx service는 DockerHub의 nginx:1.13.0 이미지를 사용 할 것이다. service 이하에 있는 설정들을 보면 알 수 있지만 거의 docker cli 옵션과 일대일로 매칭된다. links를 통해 web service와 연결해준다. 그리고 이렇게 연결된 service 이름은 nginx container 안에서 host 이름으로 사용 될 수 있다. 이게 nginx.conf에서 web:5000이라고 작성한 이유다.

5. docker-compose 실행

$ docker-compose up
Creating network "dockercomposeexample_default" with the default driver
Building web
Step 1/7 : FROM golang:1.8
1.8: Pulling from library/golang
...
...
Successfully built 679c2d42434e
Successfully tagged dockercomposeexample_web:latest
Pulling nginx (nginx:1.13.0)...
1.13.0: Pulling from library/nginx
...
...
Creating dockercomposeexample_web_1 ...
Creating dockercomposeexample_web_1 ... done
Creating dockercomposeexample_nginx_1 ...
Creating dockercomposeexample_nginx_1 ... done
Attaching to dockercomposeexample_web_1, dockercomposeexample_nginx_1
web_1    | + exec app app
docker-compose 설정에 따라 Docker container가 생성되었다. 제대로 실행됐는지 확인하려면 container 목록을 확인하자.
$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                NAMES
128cdce0c778        nginx:1.13.0               "nginx -g 'daemon ..."   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   dockercomposeexample_nginx_1
7e98e4aac3c7        dockercomposeexample_web   "go-wrapper run app"     3 minutes ago       Up 3 minutes        5000/tcp             dockercomposeexample_web_1
마지막으로 80번 포트를 통해 제대로 동작하는지 확인한다.
$ curl 127.0.0.1:80
Hello World


'DevOps' 카테고리의 다른 글

Docker 로그 관리 - logrotate  (0) 2017.07.19
Docker Registry V2 설치  (0) 2017.07.12
docker-compose 설치  (0) 2017.07.12
Docker Container 실행하기  (0) 2017.07.08
Chef resource 실행 순서 with notifies  (0) 2017.07.06
Comments