[Docker] Ec2-Docker-Nginx 기본 설정, compose 명령어 본문

백앤드 개발일지

[Docker] Ec2-Docker-Nginx 기본 설정, compose 명령어

giron 2021. 9. 15. 17:36
728x90

compose사용하는 이유, 도커의 멀티 컨테이너들을 묶어서 관리할 수 있다.

ex) redis 서버실제 운영할 서버처럼 두 개의 서버를 연결하면 --link와 같은 명령어를 사용해야 하지만 docker-compose를 이용하면 손쉽게 연결하여 사용할 수 있다.

 

docker-compose.yml

version: "3"             # 도커 컴포즈의 버전
services:                 # 이곳에 실행하려는 컨테이너들을 정의
  redis-server:           # 컨테이너 이름을 지정 (원하는 이름)
    image: "redis"        # 사용할 이미지 이름
  giron:                 # 컨테이너 이름을 지정 (원하는 이름)
    build: ""              # 현 디렉토리에 있는 Dockerfile을 사용하여 빌드
    ports:
      - "5000:8080"       # 로컬포트:컨테이너포트 (서로 매핑)
 ------
 실제 적용했던 프로젝트
version: '3'	 

services:		
  rdbms:		
    image: mysql:latest
    volumes:
      - ./db_volume:/var/lib/mysql #mysql volume저장되는 위치
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=DB이름
    ports:
      - 3306:3306
  • volume: 현재(로컬 또는 리눅스 서버 등)에 존재하는 디렉토리와 컨테이너 내부 디렉터리를 매핑시킵니다.
  • environment: 서비스 컨테이너 내부에서 사용할 환경변수를 지정합니다.

이 후, 실행 명령어

docker-compose up         (이미지가 없을 때 이미지를 빌드하고 컨테이너 시작)
docker-compose up --build (이미지가 있든 없든 다시 빌드하고 실행)
docker-compose up -d 	  (백그라운드에서 실행)
docker-compose down       (컴포즈 중지하기)

-----------------------------------실습------------------------------------------------

ec2 - docker 설치

sudo yum update -y
sudo amazon-linux-extras install -y docker
sudo service docker start

EC2에서  docker-compose 설치

sudo curl -L https://github.com/docker/compose/releases/download/1.25.0\
-rc2/docker-compose-`uname -s`-`uname -m` -o \
/usr/local/bin/docker-compose

실행 권한 추가

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

설치 되었는 지 버전 확인

docker-compose -v

Ec2에서 Nginx 설치

sudo yum install nginx       // 설치 (1)
sudo service nginx start     // 시작
sudo service nginx stop      // 중지 (2)
sudo service nginx restart   // Nginx 서비스를 중지했다가 시작합니다.
sudo service nginx reload    // Nginx 서비스를 정상적으로 다시 시작합니다. 다시로드 할 때 기본 Nginx 프로세스는 자식 프로세스를 종료하고 새 구성을로드하며 새 자식 프로세스를 시작합니다.
sudo service nginx status    // 상태 확인 (3)

(1), (2), (3)번 순서대로 설치 후, docker container가 80포트를 사용할 것이기 때문에 (2)번으로 nginx를 중지 시킨다.

그리고 (3)번으로 확인하면 Active가 inactive (dead) 로 바껴있을 것이다.

sudo vim /etc/nginx/nginx.conf
include /etc/nginx/conf.d/service-url.inc;

location / {
        proxy_pass $service_url;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
}

proxy_pass 의 url로 nginx가 프록시 해준다.

sudo vim /etc/nginx/conf.d/service-url.inc
set service_url http://{ec2주소}:8081;
sudo service nginx restart

이제 80 포트가 8081포트로 리버스 프록시 된다.

 

Dockerfile 작성

FROM openjdk:11-jre-slim

WORKDIR /root

COPY ./*.jar .

CMD java -jar demo-0.0.1-SNAPSHOT.jar
  • FROM: 사용한 이미지를 적어줍니다.
  • WORKDIR: 컨테이너에서 작업할 디렉토리를 지정해줍니다.
  • COPY: 현재 위치에 있는 파일을 컨테이너 안으로 복사합니다.
  • CMD: 컨테이너에서 실행할 명령어를 적습니다.

docker-compose.yml 작성

version: "3"
services:
  web:             # nginx 컨테이너 이름 (원하는 이름)
    image: nginx  
    ports:
      - 80:80
    volumes:
      - /etc/nginx/:/etc/nginx/    # Nginx 컨테이너 내부 /etc/nginx 디렉토리가 위에서 설치한 EC2 내부에 /etc/nginx 디렉토리를 참조함
  spring:         # Spring Boot 컨테이너 이름 (원하는 이름)
    build: ""
    ports:
      - 8081:8080
    volumes:
      - ./:/root/
  • version: 도커 컴포즈의 버전
  • services: 이곳에 실행하려는 컨테이너들을 정의
  • image: 사용할 이미지 적기
  • build: 경로에 해당하는 Dockerfile 실행
  • ports: EC2 포트:컨테이너 포트 매핑
  • volumes: EC2 디렉토리와 컨테이너 디렉토리 매핑

여기서 주의 깊게 볼 곳은 volumes 입니다. yml 파일 내부에 Nginx 이미지에 volumes를 보면 현재 EC2에 설치된 Nginx의 디렉토리와 컨테이너 디렉토리를 매핑시키는 것입니다.

디렉토리 

한 디렉토리 안에 jar, docker-compose.yml, dockerfile이 같이 존재해야 한다.

 

docker-compose up -d //실행하면 끝!

******************

에러가 발생한다면 

아래 명령어 실행

sudo chmod 666 /var/run/docker.sock

포트가 겹쳐서 안될떄는,. 

docker-compose down //잠시 멈춰두고
sudo netstat -pna | grep 8081 // 저는 8081포트가 겹쳤어서 8081로 찾고
kill -9 <pid>
//겹치는 포트 죽이고,
docker-compose up -d //실행

https://stackoverflow.com/questions/37971961/docker-error-bind-address-already-in-use

 

Docker Error bind: address already in use

When I run docker-compose up in my Docker project it failes with the following message: Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use netstat -pna | grep 3000

stackoverflow.com

 

아예 컨테이너를 삭제하라고 되어있는데 저는 삭제 안해도 다시 작동되었습니다.

728x90
Comments