[docker] 그래서 docker-compose가 뭔데

docker-compose는 Docker를 실행할 수 있는 명령어입니다.

`docker-compose up` 명령어를 실행하면 Docker Compose는 `docker-compose.yml` 파일을 읽어 서비스를 시작하고 관련된 컨테이너를 생성합니다.

docker-compose 명령어

명령어 옵션으로 뒤에 이거저거가 붙죠.

docker-compose [options] [command] [arguments]

[options] : docker-compose 명령어의 옵션
[command] : 실행하려는 Compose 명령
[arguments] : 해당 명령에 대한 추가적인 인자

 

옵션과 커맨드 더보기 ⬇️

더보기

옵션(Options)
- `-f`, `--file`: 사용할 Compose 파일을 지정
  예시: `docker-compose -f docker-compose.yml up`
- `--project-name`: 프로젝트의 이름을 설정
  예시: `docker-compose --project-name myapp up`
- `-d`, `--detach`: 컨테이너를 백그라운드에서 실행
  예시: `docker-compose up -d`
- `--build`: 이미지 빌드를 강제로 실행
  예시: `docker-compose up --build`

명령어(Command)
- `up`: 정의된 서비스를 실행
  예시: `docker-compose up`
- `down`: 실행 중인 서비스를 중단하고 컨테이너 및 네트워크 등을 제거
  예시: `docker-compose down`
- `ps`: 실행 중인 서비스의 상태를 표시
  예시: `docker-compose ps`
- `logs`: 로그를 표시
  예시: `docker-compose logs`
- `exec`: 실행 중인 컨테이너에서 명령어를 실행
  예시: `docker-compose exec webapp bash`

 

docker-compose up -d --build 커맨드를 실행하면 docker-compose가 스택에 정의된 내용을 바탕으로 도커 컨테이너, 네트워크, 볼륨을 만들어 생성하여 서비스를 구성해준다.
docker-compose start [service], docker-compose stop [service], docker-compose kill [service] 명령어로 전체 또는 개별 서비스를 관리할 수 있다.
docker-compose logs [-f] [service] 명령어로 서비스에서 출력한 로그를 볼 수 있다.
docker-compose down 명령어로 전체 스택을 중지하고 컨테이너와 네트워크를 삭제하며, docker-compose down -v 명령어를 사용하면 볼륨까지 삭제되어 서비스 전체를 완전히 초기화할 수 있다.

 

docker-compose 명령어는 docker-compose.yml 파일에 정의된 내용을 기반으로 여러 컨테이너를 한 번에 실행할 수 있다.

 

docker-compose.yml 파일

이 파일에 서비스, 볼륨, 네트워크, 환경 변수 등과 같은 Docker 컨테이너와 관련된 구성을 선언한다.

up을 사용하여 실행하면 Compose(명령어)가 해당 파일을 읽어서 컨테이너와 리소스의 설정을 파악하고, 필요한 컨테이너를 시작하거나 중지하며, 네트워크를 설정하는 등의 작업을 알아서 한다.

 

`docker-compose.yml` 파일 예

# bash 아니고 .yml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

 

이 YAML 파일은 두 개의 서비스(`web`와 `db`)를 정의한다.

`web` 서비스는...

  • Nginx 이미지를 사용하여 컨테이너를 시작하며,
  • 호스트(내 로컬)의 80 포트와 컨테이너의 80 포트를 매핑한다.

`db` 서비스는...

  • PostgreSQL 이미지를 사용하며,
  • 환경 변수를 설정하여 PostgreSQL의 비밀번호를 지정합니다.

보통 키값, PWD값 등을 설정하는 환경변수파일은 env_file : ./docker-compose.env로 관리한다.

 

volumes

더보기

`volumes`는 Docker Compose 파일에서 정의되는 설정 중 하나로, 컨테이너와 호스트 간의 데이터 공유를 위한 디렉토리나 파일을 설정하는 데 사용됩니다. 이를 통해 컨테이너의 데이터를 영구적으로 저장하거나 공유할 수 있습니다.

`volumes` 설정은 보통 두 가지 형태로 사용됩니다:

1. **컨테이너 내의 경로와 호스트 경로 연결:**

   ```yaml
   version: '3'
   services:
     app:
       image: myapp
       volumes:
         - /path/on/host:/path/in/container
   ```

   이렇게 설정하면 호스트의 `/path/on/host` 디렉토리가 컨테이너 내의 `/path/in/container` 디렉토리와 연결됩니다. 컨테이너 내에서 데이터를 작성하면 호스트의 해당 디렉토리에도 반영됩니다.

2. **볼륨 이름을 사용하여 호스트 경로 설정:**

   ```yaml
   version: '3'
   services:
     app:
       image: myapp
       volumes:
         - mydata:/path/in/container
   volumes:
     mydata:
   ```

   이 방법은 볼륨 이름을 정의하고 해당 볼륨을 서비스 내의 경로에 연결합니다. 볼륨은 호스트의 특정 디렉토리에 저장되며, 컨테이너가 시작되고 종료되어도 데이터가 유지됩니다.

`volumes` 설정은 데이터베이스 파일, 로그 파일, 구성 파일 등 컨테이너 내의 데이터를 보관하거나 데이터를 컨테이너 간에 공유하는 데 사용됩니다. 이를 통해 컨테이너가 종료되거나 새로 생성되더라도 데이터의 지속성과 공유성을 확보할 수 있습니다.

 

build

더보기

`build`는 Docker Compose 파일에서 정의되는 설정 중 하나로, 컨테이너 이미지를 빌드하기 위한 빌드 컨텍스트와 Dockerfile의 경로를 지정하는 데 사용됩니다. 이 설정을 사용하면 컨테이너 이미지를 동적으로 빌드하고 해당 이미지를 사용하여 서비스를 실행할 수 있습니다.

`build` 설정은 다음과 같은 형식으로 사용됩니다:

```yaml
version: '3'
services:
  app:
    build:
      context: /path/to/build/context
      dockerfile: Dockerfile.dev
```

- `context`: 빌드 컨텍스트로 사용될 디렉토리를 지정합니다. 이 디렉토리 내의 파일과 하위 디렉토리가 빌드 컨텍스트로 사용되며, 여기에는 Dockerfile 및 빌드에 필요한 파일들이 포함되어 있어야 합니다.

- `dockerfile`: 사용할 Dockerfile의 경로를 지정합니다. 기본값은 `./Dockerfile`이며, 다른 이름의 Dockerfile을 사용하려면 해당 파일의 경로를 지정합니다.

`build` 설정을 사용하면 Compose가 컨테이너 이미지를 빌드하고 해당 이미지를 사용하여 서비스를 시작합니다. 빌드 컨텍스트 내에 있는 파일과 Dockerfile에 따라 이미지가 생성됩니다. 이를 통해 개발 환경에서는 소스 코드 변경에 따라 이미지를 자동으로 빌드하거나, 커스텀 환경 설정을 적용하여 이미지를 생성할 수 있습니다.

docker build 명령어 사용시 사용되는 dockerfile에 대해서 알아보자

더보기

Dockerfile은 Docker 컨테이너 이미지를 구성하는 데 사용되는 텍스트 기반의 파일입니다. Docker 이미지는 컨테이너를 생성하는 데 사용되는 모든 설정과 명령어를 포함하고 있습니다. Dockerfile은 이러한 설정과 명령어를 정의하여 컨테이너 이미지를 빌드하는 데 사용됩니다.

Dockerfile을 사용하여 컨테이너 이미지를 구성하고 빌드하는 과정은 다음과 같습니다:

1. **기본 이미지 선택:** Dockerfile에서 사용할 기본 이미지를 선택합니다. 이 이미지는 새로운 이미지의 기반이 됩니다.

2. **파일 복사 및 설정 추가:** Dockerfile 내에서 파일을 복사하거나 디렉토리를 생성하며, 애플리케이션에 필요한 설정을 추가합니다.

3. **런타임 명령어 추가:** 컨테이너가 시작될 때 실행될 명령어를 추가합니다. 예를 들어, 서버를 실행하거나 애플리케이션을 시작하는 명령어를 정의할 수 있습니다.

4. **포트 노출 및 환경 변수 설정:** 컨테이너가 노출할 포트 번호나 환경 변수 등을 설정합니다.

5. **이미지 빌드:** Docker CLI를 사용하여 Dockerfile을 이용하여 이미지를 빌드합니다.

간단한 예시를 보면 다음과 같습니다:

```Dockerfile
# 기본 이미지 선택
FROM ubuntu:latest

# 파일 복사
COPY ./app /app

# 작업 디렉토리 설정
WORKDIR /app

# 명령어 실행
RUN apt-get update && apt-get install -y python3

# 포트 노출
EXPOSE 80

# 컨테이너 시작 시 실행할 명령어
CMD ["python3", "app.py"]
# 또는

ENTRYPOINT ["entrypoint.sh"]

이 Dockerfile은 Ubuntu 기반 이미지를 선택하고, `app` 디렉토리 내의 파일을 `/app` 디렉토리로 복사하며, 작업 디렉토리를 `/app`으로 설정합니다. 그리고 `apt-get`을 사용하여 Python 3를 설치하고, 포트 80을 노출시키고, 컨테이너를 시작할 때 `python3 app.py` 명령어를 실행합니다.

이렇게 Dockerfile을 작성하고 `docker build` 명령어를 사용하여 이미지를 빌드하면 해당 이미지로 컨테이너를 실행할 수 있습니다.

 

dockerfile에서 사용되는 entrypoint란

더보기

`ENTRYPOINT`는 Dockerfile에서 사용되는 지시문 중 하나로, 컨테이너가 시작될 때 실행될 기본 명령어 또는 실행 파일을 지정하는 데 사용됩니다. `ENTRYPOINT`를 설정하면 해당 컨테이너의 주 역할이나 기능을 정의하며, Docker 컨테이너가 시작될 때마다 실행됩니다.

`ENTRYPOINT` 지시문을 사용하여 컨테이너 이미지를 빌드할 때 기본적인 실행 파일이나 명령어를 지정할 수 있습니다. 이를 통해 컨테이너가 실행될 때마다 동일한 실행 파일이나 명령어가 자동으로 실행되도록 할 수 있습니다.

간단한 예시를 보면 다음과 같습니다:

```Dockerfile
FROM ubuntu:latest

COPY entrypoint-script.sh /entrypoint-script.sh

RUN chmod +x /entrypoint-script.sh

ENTRYPOINT ["/entrypoint-script.sh"]
```

이 Dockerfile은 Ubuntu 기반 이미지를 선택하고, `entrypoint-script.sh` 파일을 이미지 내에 복사합니다. 그리고 `chmod` 명령어를 사용하여 스크립트 파일을 실행 가능한 권한으로 변경하며, `ENTRYPOINT`를 사용하여 컨테이너가 시작될 때 `/entrypoint-script.sh` 스크립트가 실행되도록 설정합니다.

`ENTRYPOINT`는 주로 실행할 실행 파일이나 스크립트를 컨테이너가 시작될 때마다 실행해야 하는 경우에 사용됩니다. 이를 통해 컨테이너의 역할이나 기능을 정의하고 컨테이너가 빌드되고 실행될 때마다 일관된 방식으로 동작하도록 할 수 있습니다.

'【 개발 이야기 】' 카테고리의 다른 글

[aws] amplify와 CI/CD  (0) 2023.09.12
[aws] amplify와 severless  (0) 2023.09.11
[git] submodule 명령어  (0) 2023.08.29
express, nestjs  (0) 2023.07.27
터미널 source 명령어  (0) 2023.07.26