Docker Compose를 활용해 컨테이너 관리하기

  • Docker Compose를 사용하는 이유

Docker Compose란?

여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴.

 

Docker Compose를 사용하는 이유

  1. 여러 개의 컨테이너를 관리하는 데 용이

  2. 복잡한 명령어로 실행시키던 걸 간소화 시킬 수 있음

  • [실습] Docker Compose 전체 흐름 느껴보기 (Nginx 설치 및 실행)

Docker CLI로 컨테이너를 실행시킬 때

docker run --name webserver -d -p 80:80 nginx

Docker Compose로 컨테이너를 실행시킬 때

  1. compose.yml 파일 작성하기.

services:
	my-web-server:
		container_name: webserver
		image: nginx
		ports: 
			- 80:80

services: my-web-sever: Docekr Compose에서 하나의 컨테이너를 서비스(service)라고 부른다. 이 옵션은 서비스에 이름을 붙이는 기능이다.

container_name: webserver컨테이너를 띄울 때 붙이는 별칭이다. CLI에서 --name web-werver역할과 동일하다.

image: nginx컨테이너를 실행시킬 때 어떤 이미지를 사용할 지 정의하는 명령어이다. docker run [이미지명]와 동일한 역할이다.

ports: 포트 매핑은 어떻게 할 지를 설정하는 옵션이다. CLI에서 -p 80:80역할과 동일하다.

  1. compose 파일 실행시키기

docker compose up -d
  1. compose 실행 현황 보기

docker compose ps
  1. compose로 실행된 컨테이너 삭제

docker compose down
  • 자주 사용하는 Docker Compose CLI 명령어

compose 파일 작성

services:
	websever:
		container_name: webserver
		image: nginx
		ports: 
			- 80:80

compose.yml에서 정의한 컨테이너 실행

docker compose up    # 포그라운드에서 실행
docker compose up -d # 백그라운드에서 실행

-d: 백그라운드에서 실행

Docker Compose로 실행시킨 컨테이너 확인하기

# compose.yml에 정의된 컨테이너 중 실행 중인 컨테이너만 보여준다. 
 docker compose ps 

# compose.yml에 정의된 모든 컨테이너를 보여준다.
 docker compose ps -a

Docker Compose 로그 확인하기

# compose.yml에 정의된 모든 컨테이너의 로그를 모아서 출력한다.
 docker compose logs

컨테이너를 실행하기 전에 이미지 재빌드하기

 docker compose up --build # 포그라운드에서 실행
 docker compose up --build -d # 백그라운드에서 실행

compose.yml에서 정의한 이미지 파일에서 코드가 변경 됐을 경우, 이미지를 다시 빌드해서 컨테이너를 실행시켜야 코드 변경된 부분이 적용된다. 그러므로 이럴 때에는 --build옵션을 추가해서 사용해야 한다.

 

참고: docker compose upvs docker compose up --build

-- docker compose up: 이미지가 없을 때만 빌드해서 컨테이너를 실행시킨다. 이미지가 이미 존재하는 경우 이미지를 빌드하지 않고 컨테이너를 실행시킨다.

-- docker compose up --build : 이미지가 있건 없건 무조건 빌드를 다시해서 컨테이너를 실행시킨다.

 

이미지 다운받기 / 업데이트하기

docker compose pull

compose.yml에서 정의된 이미지를 다운 받거나 업데이트 한다.

  • 로컬 환경에 이미지가 없다면 이미지를 다운 받는다.

  • 로컬 환경에 이미 이미지가 있는데, Dockerhub의 이미지와 다른 이미지일 경우 이미지를 업데이트 한다.

Docker Compose에서 이용한 컨테이너 종료하기

docker compose down
  • [실습] Docker Compose로 Redis 실행시키기

compose.yml

services:
	my-cache-server:
		image: redis
		ports: 
			- 6379:6379 

compose 파일 실행 및 확인

docker compose up -d

docker compose ps
docker logs [컨테이너 ID 또는 컨테이너명]
docker exec -it [컨테이너 ID 또는 컨테이너명] bash

redis-cli
127.0.0.1:6379> set 1 jscode
127.0.0.1:6379> get 1

docker compose down
  • [실습] Docker Compose로 MySQL 실행시키기

compose.yml

services:
  my-db:
    image: mysql
    environment: # -e MYSQL_ROOT_PASSWORD=password 역할
      MYSQL_ROOT_PASSWORD: pwd1234
    volumes:# v {호스트 경로}:/var/lib/mysql 역할
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306

environment: ...:CLI에서 -e MYSQL_ROOT_PASSWORD=password 역할과 동일하다.

volumes: ...:CLI에서 -v {호스트 경로}:/var/lib/mysql 역할과 동일하다.

compose 파일 실행 및 확인

docker compose up -d

docker compose ps

docker compose down
  • [실습] Docker Compose로 백엔드(Spring Boot) 실행시키기

AppController

@RestController
public class AppController {
  @GetMapping("/")
  public String home() {
    return "Hello, World!";
  }
}

Dockerfile

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

Spring Boot 프로젝트 빌드

./gradlew clean build

compose.yml

services:
  my-server: 
 #compose.yml이 존재하는 디렉토리(.)에 있는 Dockerfile로 이미지를 생성
    build: . 
    ports:
      - 8080:8080

build: .:compose.yml이 존재하는 디렉토리(.)에 있는

Dockerfile로 이미지를 생성해 컨테이너를 띄우겠다는 의미이다.

compose 파일 실행 및 확인

docker compose up -d --build

docker compose ps

docker compose down
  • [실습] Docker Compose로 백엔드(Nest.js) 실행시키기

Next.js 프로젝트 만들기

# Nest CLI 설치
 npm i -g @nestjs/cli

# nest new {프로젝트명}
 nest new my-server

Dockerfile

FROM node

WORKDIR /app

COPY . .

RUN npm install

RUN npm run build

EXPOSE 3000

ENTRYPOINT [ "node", "dist/main.js" ]

.dockerignore

node_modules

compose.yml

services:
  my-server:
    build: .
    ports:
      - 3000:3000

compose 파일 실행 및 확인

docker compose up -d --build

docker compose ps

docker compose down
  • [실습] Docker Compose로 프론트엔드(Next.js) 실행시키기

Next.js 프로젝트 만들기

npx create-next-app@latest

Dockerfile

FROM node:20-alpine

WORKDIR /app

COPY . .

RUN npm install

RUN npm run build

EXPOSE 3000

ENTRYPOINT [ "npm", "run", "start" ]

.dockerignore

node_modules

compose.yml

services:
  my-web-server:
    build: .
    ports:
      - 80:3000

compose 파일 실행 및 확인

docker compose up -d --build

docker compose ps

docker compose down
  • [실습] Docker Compose로 프론트엔드(HTML, CSS, Nginx) 실행시키기

HTML, CSS 파일 만들기

index.html

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>My Web Page</h1>
</body>
</html>

style.css

* {
  color: blue;
}

Dockerfile

FROM nginx 
COPY ./ /usr/share/nginx/html

compose.yml

services:
  my-web-server:
    build: .
    ports:
      - 80:80

compose 파일 실행 및 확인

docker compose up -d --build

docker compose ps

docker compose down

 

댓글을 작성해보세요.

채널톡 아이콘