일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- golang
- 도커
- Linux
- 루비
- VIM
- window size
- 드라이버
- VMware
- 패키지
- AWS
- docker registry
- QT
- opsworks
- DevOps
- ssh command
- ubuntu
- Chef
- RUBY
- port
- docker
- VPN
- ssh
- docker container
- docker-compose
- 리눅스
- 방화벽체크
- driver
- 우분투
- sudo
- Openswan
- Today
- Total
구리의 창고
docker-compose 사용 본문
소개
이 글에서는 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