애플리케이션의 배포 및 관리를 유용하게 하기 위해 널리 사용되는 도커로
4계층 아키텍처를 마이그레이션 해본다.
도커 이미지가 디스크 공간을 잡아 먹기 때문에
작은 컨테이너가 여러모로 이점이 많다.
베이스 이미지를 최적화하면 빌드와 배포 시간을 단축할 수 있다.
그래서 Docker 이미지 중 크기가 작은 것들을 활용한다.
바로 alpine 이다.
이미지는 (Explore Docker's Container Image Repository | Docker Hub) 로 pull한다.
명령어 | 설명 | 예시 |
---|---|---|
FROM | 기반이 될 이미지(ex. OS)를 지정 | FROM <이미지> |
MAINTAINER | 작성자의 정보를 기록 | MAINTAINER <작성자 <메일>> |
RUN | FROM의 기반 이미지 위에서 실행될 명령어 | RUN <명령어> |
COPY | 도커 컨테이너의 경로로 파일을 복사합니다 | COPY <복사 할 파일 경로> <컨테이너 경로> |
CMD | 컨테이너 시작 이후, 컨테이너에서 실행될 파일 | CMD <실행파일> <매개변수1> ... |
ENV | 도커의 환경변수를 설정 | ENV <환경변수 이름> <값> |
EXPOSE | 연결할 포트 번호를 명시 | EXPOSE <포트 번호1> ... |
//Dockerfile로 이미지 생성
docker build <dockerfile_path> -t <image_name>
//Dockerfile로 생성한 이미지로 컨테이너 실행
docker run -dit --name <container_name> <image_name>
-d (detached)
-i (interactive)
-t (pseudo-tty)
docker start <container_name>
docker exec -it <container_name> sh
docker stop $(docker ps -aq)
docker commit <container_ID> <new_image_name>:<tag>
container_ID는 docker ps로 확인 가능
version: '3.8'
services:
nginx:
image: custom_nginx:1.24.0-alpine-slim
database:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 3025
MYSQL_DATABASE: test
ports: - 3306:3306
volumes:
- ./mariadb/data:/var/lib/mysql
- ./mariadb/conf.d:/etc/mysql/conf.d
- ./mariadb/db/initdb.d:/docker-entrypoint-initdb.d
backend:
build:
context: ./backend
dockerfile: Dockerfile
restart: always
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://database:3306/test?useSSL=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 3025
ports:
- 8080:8080
depends_on:
- database
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
restart: always
ports:
- 3000:3000
depends_on:
- backend
docker-compose build
docker-compose up -it
npm install을 할 때 다음과 같은 output이 나오는데
docker-compose 파일의 frontend 컴포넌트에
stdin_open: true
라인을 넣어주면 해결된다.
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
restart: always
ports:
- 3000:3000
stdin_open: true
depends_on:
- backend
docker tag <local_image_name>:<tag> <username>/<repository_name>:<tag>
docker login <username>
docker push <username>/<repository_name>:<tag>
apk add --update nodejs npm
위와 같이 구성 후 docker-compose up 커맨드로 모든 컨테이너를 띄우고
root 도메인 (/) 으로 접속이 정상적으로 이루어지고
프론트엔드에서 백엔드의 API를 통해 데이터를 제대로 정상적으로 이루어지는 것을 확인 할 수 있다.
다른 도커 컨테이너와의 네트워크 연동은 언제가 될진 모르겠지만 다음 포스트에 이어진다.