일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- HTTP
- 우테코
- 우아한테크코스
- 스프링부트
- 미션
- REDIS
- 자바
- Paging
- Docker
- 트랜잭션
- 코드리뷰
- 프리코스
- AWS
- 스프링 부트
- 백준
- 세션
- mock
- 레벨2
- yml
- CircuitBreaker
- 의존성
- MSA
- 프로그래머스
- 서블릿
- JUnit5
- JPA
- Level2
- 우아한세미나
- AOP
- Spring Batch
- Today
- Total
늘
[Docker] Ec2-Docker-Nginx 기본 설정, compose 명령어 본문
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
아예 컨테이너를 삭제하라고 되어있는데 저는 삭제 안해도 다시 작동되었습니다.
'백앤드 개발일지' 카테고리의 다른 글
[CircuitBreaker] 서킷브레이커의 이벤트를 슬랙으로 알림받기 (0) | 2024.04.29 |
---|---|
[Spring Batch] JdbcPagingItemReader의 페이징은 offset을 사용하지 않는다 (0) | 2024.04.07 |
삽질 [에러 & 오류들 정리한 잡동사니] (0) | 2021.08.11 |
Swagger2 (0) | 2021.07.19 |
GitLab 버전 관리와 협업 하면서 막혔던 부분 기록 일지 (0) | 2021.07.12 |