- 여러 의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 해, 관리를 간단하게 하는 기능
- Docker compose는 compose 파일을 준비해 커맨드를 1회 실행하는 것으로, 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.
- 즉, 여러 개의 컨테이너를 한 번에 돌릴 수 있고, 한 번에 관리 가능한 것이 docker compose
- 각 폴더 안에 Dockerfile을 참조해서 DockerCompose.yml을 만드는 데 만약에 DockerCompose.yml에다가 각 폴더 안의 Dockerfile에 들어가는 내용을 넣으면 각 폴더의 Dockerfile이 필요 없다.
Docker compose 사용 순서
- 각각의 container 별로 Dockfile을 작성한다.(기존에 있는 이미지를 사용하는 경우엔 불필요)
- docker-compose.yml을 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시
- docker-compose up 명령어를 실행해 docker-compose.yml 파일에 정의한 컨테이너를 실행
Docker compose 커맨드(명령어)
- -f : 기본적으로 docker-compse.yml 파일을 읽으나 다른 이름이나 다른 경로의 파일을 Docker compose 설정 파일로 사용하고 싶을 때 사용하는 옵션
- docker-compose -f docker-compose.local.yml up
- up : Docker compose 파일에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행하기 위해서 사용한다.
- -d : docker compose를 실행할 대 백그라운드에서 컨테이너를 띄우고자 할 때 사용하는 옵션
- down : up 명령어와 반대로 동작하는 것으로 docker compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제한다.
- start : 내려가 있는 특정 서비스 컨테이너를 올리기 위해서 사용한다. up으로 사용해도 무방
- stop : start 명령어와 반대로 동작하는 것으로 돌아가고 있는 특정 서비스 컨테이너를 정지시키기 위해서 사용한다.
- ps : docker compose에 정의되어 있는 모든 서비스 컨테이너 목록을 조회할 때 사용한다.
1. 제일 상위 폴더의 docker-compose.yml
version: "3.8"
services:
node-project: #사용자 임의 이름 생성
build:
context: ./docker #Dockerfile이 있는 폴더
volumes:
- ./docker:/app #Dockerfile에 있는 작업 디렉토리
ports:
- "8080:8000"
container_name: node-project
command: bash -c "npm install & node index.js"
react-project:
build:
context: ./docker_react #Dockerfile이 있는 폴더
volumes:
- ./docker_react/build:/usr/share/nginx/html #Dockerfile에 있는 작업 디렉토리
ports:
- "3040:80"
container_name: react-project
- version : docker compose 파일의 버전
- docker-compose.yml 내용을 해석하기 위한 문법 버전
- services : 컨테이너를 실행하기 위한 단위로 하위에는 서비스 이름 > 서비스 옵션 순으로 작성된다.
- build : build 할 dockerfile의 경로를 지정해준다.
- docker-compose에서 dockerfile을 이용해 자동으로 docker build를 실행하고 생성된 이미지를 사용한다. 만약 dockerfile 경로나 이름이 다른 곳에 있다면 특정 경로를 작성해 dockerfilㄷ을 지정할 수도 있다.
- context : docker build를 실행할 디렉토리로 dockerfile을 찾는다.
- dockerfile : 빌드에 사용될 Dockerfile을 찾는데 기본 이름일 경우에는 사용하지 않아도 된다.
- ports : 포트포워딩을 지정한다. <호스트포트> : <컨테이너포트>
- 만약 8080 만 지정할 경우, 컨테이너의 포트만 지정한 것으로 된다. 이렇게 될 경우 호스트 포트는 랜덤으로 이루어진다.
- 8080 으로 지정시 실제로는 4684(랜덤) : 8080 과 동일.
- volume : 바인드 마운트, 볼륨을 지정할 수 있다.
- 로컬 PC의 디렉토리와 컨테이너 안의 디렉토리를 연결한다.
- <호스트>:<컨테이너> 방식으로 사용한다.
- 보통 docker-compose를 통해 빌드하게 되면 이미지가 생성되는데, 개발을 하다보면 수시로 코드를 수정하게 되는데 이때마다 이미지를 재생성하면 굉장히 비효율적이다.
- 이때 코드 수정을 하고 있는 호스트의 경로를 컨테이너와 연결시켜 이미지 빌드 없이 코드가 반영될 수 있도록 하는 것이 volume이다.
- environment : 컨테이너에서 사용할 환경변수를 설정할 수 있다.
- depends_on : 실행순서를 보장받고 싶을 때 사용한다. dependes_on 에 적힌 컨테이너가 옵션이 적용된 컨테이너 다음으로 실행된다.
- image : 도커 이미지 ( dockerfile을 사용하지 않는 기본 이미지일 경우 )
- command : 마지막 만들어지고 난 후 실행할 명령을 작성한다.
- Dockerfile의 cmd 부분
2. node 프로젝트의 Dockerfile
#부모 이미지 지정
FROM node:16
#작업 디렉토리 생성
WORKDIR /app
#소스 추가
COPY . /app
#패키지 설치
RUN npm install
#포트 매핑
EXPOSE 8000
#실행 명령
CMD ["node", "index.js"]
3. react 프로젝트의 Dockerfile과 nginx.conf
3-1. react 프로젝트의 Dockerfile
#base image
FROM nginx:1.21-alpine
#copy build files
COPY build /usr/share/nginx/html
#copy nginx config file
COPY nginx.conf /etc/nginx/conf.d/default.conf
#expose port
EXPOSE 80
#start nginx server
CMD ["nginx", "-g", "daemon off;"]
3-2. react 프로젝트의 nginx.conf
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
react-project(nginx 또다른 버전)
더보기
제일 상위 폴더의 docker-compose.yml
version: "3.8"
services:
node-project: #사용자 임의 이름 생성
build:
context: ./docker #Dockerfile이 있는 폴더
volumes:
- ./docker:/app #Dockerfile에 있는 작업 디렉토리
ports:
- "8080:8000"
container_name: node-project
command: bash -c "npm install & node index.js"
react-project:
build:
context: ./docker_react #Dockerfile이 있는 폴더
volumes:
- ./docker_react:/app #Dockerfile에 있는 작업 디렉토리
ports:
- "3030:80"
container_name: react-project
Dockerfile
#부모 이미지 지정
FROM nginx
#root에 app 폴더 생성
RUN mkdir /app
#work dir 고정
WORKDIR /app
#work dir에 build 폴더 생성 /app/build
RUN mkdir ./build
#host pc의 현재경로의 build 폴더를 workdir의 build 폴더로 복사
ADD ./build ./build
#nginx의 default.conf를 삭제
RUN rm /etc/nginx/conf.d/default.conf
#host pc의 nginx.conf를 아래 경로에 복사
COPY ./nginx.conf /etc/nginx/conf.d
#80 포트 오픈
EXPOSE 80
#container 실행 시 자동으로 실행할 command. nginx 시작함
CMD ["nginx", "-g", "daemon off;"]
nginx.conf
server {
listen 80;
location / {
root /app/build;
index index.html;
try_files $uri $uri/ /index.html;
}
}
자동으로 docker-compose.yml up 커맨드를 실행하게 되면 이미지, 컨테이너가 생성됨!!
'Sesac 웹 풀스택[새싹X코딩온]' 카테고리의 다른 글
[Linux:Ubuntu]http 서버 https로 변경해서 node, react 프로젝트 배포 (0) | 2023.03.21 |
---|---|
[Docker] Dockerfile, Dockerfile node와 연결, nginx(react)와 연결 (0) | 2023.03.21 |
[Docker] 기본 개념 및 설치(오류), 주요 명령어(docker run) (0) | 2023.03.21 |
ubuntu에 bind-address 설정하기 (0) | 2023.02.12 |
Node.js 프로젝트 서버 올리고 FileZilla에 옮기기 (0) | 2022.12.31 |