도커 무작정 시작해보기 (1)

HW·2024년 3월 24일
0

Docker

목록 보기
1/1
post-thumbnail

애플리케이션의 배포 및 관리를 유용하게 하기 위해 널리 사용되는 도커로
4계층 아키텍처를 마이그레이션 해본다.

고려사항

  • 네트워킹 : 각 컨테이너 간의 네트워크 연결을 설정해야한다.
  • 볼륨 : 데이터를 영구적으로 저장하기 위해 볼륨을 사용해야한다.
  • 환경변수 : 컨테이너 실행 시 환경 변수를 설정한다.
  • 배포도구 : Docker Compose, 쿠버네티스 와 같은 도구를 사용하여 오케스트레이션을 구현, 자동화 한다.

도커 이미지가 디스크 공간을 잡아 먹기 때문에
작은 컨테이너가 여러모로 이점이 많다.
베이스 이미지를 최적화하면 빌드와 배포 시간을 단축할 수 있다.
그래서 Docker 이미지 중 크기가 작은 것들을 활용한다.
바로 alpine 이다.
이미지는 (Explore Docker's Container Image Repository | Docker Hub) 로 pull한다.

Docker 이미지 태그

  • busybox : 최소한의 기능만 있는 리눅스
  • alpine : 슬림보다 작음, bash 없음, sh(본쉘) 있음
  • slim : 크기가 작은 이미지

Nginx 태그

  • latest : 최신 안정적인 버전
  • stable : 안정적이고 장기 지원 버전
  • alpine : Apine Linux 기반 이미지로 가볍고 빠르지만 일부 기능 빠짐
  • mainline : 최신 개발 버전

Dockerfile 작성

명령어설명예시
FROM기반이 될 이미지(ex. OS)를 지정FROM <이미지>
MAINTAINER작성자의 정보를 기록MAINTAINER <작성자 <메일>>
RUNFROM의 기반 이미지 위에서 실행될 명령어RUN <명령어>
COPY도커 컨테이너의 경로로 파일을 복사합니다COPY <복사 할 파일 경로> <컨테이너 경로>
CMD컨테이너 시작 이후, 컨테이너에서 실행될 파일CMD <실행파일> <매개변수1> ...
ENV도커의 환경변수를 설정ENV <환경변수 이름> <값>
EXPOSE연결할 포트 번호를 명시EXPOSE <포트 번호1> ...

Dockerfile 빌드 / 실행

//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로 확인 가능

Docker compose 파일 작성

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 실행

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

DockerHub에 Push

docker tag <local_image_name>:<tag> <username>/<repository_name>:<tag>
docker login <username>
docker push <username>/<repository_name>:<tag>

Alpine Linux에서 설치

apk add --update nodejs npm

결과

위와 같이 구성 후 docker-compose up 커맨드로 모든 컨테이너를 띄우고
root 도메인 (/) 으로 접속이 정상적으로 이루어지고
프론트엔드에서 백엔드의 API를 통해 데이터를 제대로 정상적으로 이루어지는 것을 확인 할 수 있다.
다른 도커 컨테이너와의 네트워크 연동은 언제가 될진 모르겠지만 다음 포스트에 이어진다.

profile
예술융합형 개발자🎥

0개의 댓글