본문 바로가기
개발 이야기/Docker

Docker compose로 Nginx + Web앱 띄워보기

by 농개 2019. 1. 6.


Step1. Docker로 Nginx 서비스 띄우기

먼저 아래 명령어로 nginx이미지를 다운로드한다.

1
docker pull nginx
cs


그리고 run으로 실행시켜보면


1
docker run --name nginx-server --80:80 nginx
cs



127.0.0.1로 접속해보면 위 사진과 같이 잘 뜨는걸 확인 할 수 있다.

하지만 docker container로 nginx만 따로 띄우게 되면 다른 어플리케이션과 연동 시킬 때 container 간 연결을 맺어줘야(?)하는 번거로움이 있다. 또한 여러 어플리케이션이 상호작용하는 상황이라면 관리가 더욱 어려울 것이다.


Docker compose는 docker container 여럿을 띄워 관리하는 도구로서 하나의 파일 docker-compose.yml로서 여러 container의 설정을 관리할 수 있습니다. 이제 이를 활용해서 nginx + web을 띄워보도록 하겠습니다.



Step2. Docker compose 설치

curl명령어로 다운받아 설치합니다.

1
2
sudo curl -"https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)"\
          -/usr/local/bin/docker-compose
cs


실행파일에 대한 권한 변경하구요


1
sudo chmod +/usr/local/bin/docker-compose
cs


아래와 같이 설치를 확인합니다.


1
2
3
jckang@jckang:~/test/nginx-flask-test$ docker-compose --version
docker-compose version 1.23.1, build b02f1306
 
cs





Step3. 나만의 Nginx image 만들기

docker compose에 사용될 nginx container를 커스터마이징해야합니다. nginx 설정파일 default.conf를 변경해서 새로운 이미지를 만듭니다.

~/nginx/default.conf
1
2
3
4
5
6
7
8
9
10
11
12
upstream app {
  server flask:5000# 서버의 컨테이너 명
}
 
server {
    listen       80;
 
    location / {
        proxy_pass http://app;
    }
 
}
cs

upstream 을 위와 같이 해줬습니다. flask는 web어플리케이션을 띄운 컨테이너 명입니다. 5000번은 포트구요.
listen은 default인 80그대로 두고, location에 proxy_pass 값을 설정했습니다. (Reverse Proxy 사용. 정리필요)

위의 설정파일을 해석하면 
해당 nginx 80포트의 / 로 접근하게되면 http://app으로 요청을 돌립니다.
app은 위에서 정의한 upstream이구요. 
즉, 127.0.0.1:80/ 로 접근 시 nginx는 Reverse Proxy를 이용해서 flask의 5000번 포트로 요청을 전달해주게 됩니다.

default.conf와 같은 경로에 Dockerfile을 만듭니다.


~/nginx/Dockerfile

1
2
3
4
5
FROM nginx:latest
 
COPY default.conf /etc/nginx/conf.d/default.conf
 
CMD ["nginx""-g""daemon off;"]
cs


Step1에서 받았던 이미지를 가져와 default.conf 파일만 교체해주고 nginx를 포그라운드로 실행시키는 이미지 파일입니다.


1
docker build -t nginx:test .
cs


이미지 빌드 합니다.




Step4. Docker compose 띄워보기

~/docker-compose-test/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3'
services:
  flask:
      container_name: flask
      image: "flask:test"
      ports:
       - "5000:5000"
      networks:
      - backend
  nginx:
      container_name: nginx
      image: "nginx:test"
      ports:
       - "80:80"
      networks:
       - backend
 
networks: # 가장 기본적인 bridge 네트워크
  backend:
    driver: bridge
cs


version 3값은 아마 docker 특정버젼(?)에서 저렇게 해줘야 한다는 걸로 알고 있는데... 정확히는 잘.. ㅎㅎ

위와 같이 services에 두개의 컨테이너를 정의합니다.

flask는 web 어플리케이션이구요 포트는 5000번으로 정의했습니다.

nginx는 웹서버이고 step3에서 만들었던 걸 80번 포트로 정의했습니다.


아래 명령어로 띄어봅시다.

1
docker-compose up
cs



1
2
3
4
5
6
7
8
9
10
11
jckang@jckang:~/test/nginx-flask-test$ docker-compose up
Creating flask ... done
Creating nginx ... done
Attaching to flask, nginx
flask    |  * Serving Flask app "app" (lazy loading)
flask    |  * Environment: production
flask    |    WARNING: Do not use the development server in a production environment.
flask    |    Use a production WSGI server instead.
flask    |  * Debug mode: off
flask    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 
cs


띄워진 걸 확인 할 수 있다. 그리고 127.0.0.1/ 로 접근해보면


위같이 web app으로 요청이 간것을 확인 할 수 있다.


'개발 이야기 > Docker' 카테고리의 다른 글

Docker 명령어 정리  (0) 2019.07.27
Docker 빌드 시 소스파일 git으로 얻어오기  (0) 2019.07.21
Docker 권한 일반사용자에게 주기  (0) 2018.09.08
Docker 삭제하기  (0) 2018.09.08
Docker 설치하기  (0) 2018.09.08