실습파일 다운 및 세팅

  1. 실습파일을 다운로드
    weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/learndataeng/learn-airflow.git
    Cloning into 'learn-airflow'...
    remote: Enumerating objects: 219, done.
    remote: Counting objects: 100% (95/95), done.
    remote: Compressing objects: 100% (93/93), done.
    remote: Total 219 (delta 31), reused 2 (delta 0), pack-reused 124
    Receiving objects: 100% (219/219), 71.07 KiB | 6.46 MiB/s, done.
    Resolving deltas: 100% (106/106), done.

  2. 다운 받은 파일로 이동
    weare@DESKTOP-BE1I4GE:~$ cd learn-airflow

  3. docker-compose.yaml 파일 다운
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 10493  100 10493    0     0  31703      0 --:--:-- --:--:-- --:--:-- 31796

  4. 필요한 폴더 만듦
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ mkdir -p ./dags ./logs ./plugins

  5. .env 파일을 생성하고, 그 내용으로 AIRFLOW_UID와 AIRFLOW_GID 변수를 설정
    weare@DESKTOP-BE1I4GE:~/learn-airflow$  echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
  6. docker-compose.yaml 파일 수정
    5가지를 수정해야하고, 수정내용은 아래와 같다.

    1) environment 에 Airflow에서 사용하는 데이터 디렉토리를 /opt/airflow/data로 설정
     AIRFLOW_VAR_DATA_DIR: /opt/airflow/data


    2) 처음 설치 모듈들 추가 
    _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas numpy oauth2client gspread}

    3) 볼륨 설정. 호스트의 ${AIRFLOW_PROJ_DIR:-.}/data 경로를 컨테이너 내부의 /opt/airflow/data 경로로 마운트
    - ${AIRFLOW_PROJ_DIR:-.}/data:/opt/airflow/data

    4) mkdir~ :  /sources/data 폴더 추가

    5) chown~: AIRFLOW_UID에 지정된 사용자 ID를 소유자로 설정하고, 0은 그룹을 root 그룹으로 설정.
    data 폴더에 대해 명령어를 수행

  7. 컨테이너 실행, 맨뒤에 -d 넣으면 서버 실행돼서 우분투 하나더 실행 안해도 됨
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker-compose up -d

  8. docker 데스크탑으로 확인하면 잘 실행됨
  9. http://localhost:8080/ 페이지 가서 variable에 가보면 저장한 변수가 표면적으로 나와있지 않음(보안상 이점)
  10. variable 저장된 data_dir이 저장된 위치 확인.
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker ps
    CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                    NAMES
    73c2ebf8ecec   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-triggerer_1
    90cb7b11d245   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (unhealthy)   8080/tcp                 learn-airflow_airflow-scheduler_1
    a5bacafc0519   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     8080/tcp                 learn-airflow_airflow-worker_1
    065f9ee9e619   apache/airflow:2.5.1   "/usr/bin/dumb-init …"   10 minutes ago   Up 10 minutes (healthy)     0.0.0.0:8080->8080/tcp   learn-airflow_airflow-webserver_1
    cd5a97a54a1c   redis:latest           "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     6379/tcp                 learn-airflow_redis_1
    73ed8fe8f6d1   postgres:13            "docker-entrypoint.s…"   29 minutes ago   Up 12 minutes (healthy)     5432/tcp                 learn-airflow_postgres_1

  11. 웹에서는 안보이지만 variable이 존재함을 확인
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker exec -it 90cb7b11d245 airflow variables get DATA_DIR
    /home/airflow/.local/lib/python3.7/site-packages/airflow/models/base.py:49 MovedIn20Warning: [31mDeprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. [32mTo prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". [36mSet environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.  Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message.[0m (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
    /opt/airflow/data

 

목적 : airflow setup을 위해 제작된 docker-compose.yaml 파일의 내용을 살펴본다.

 

airflow 설치

  1. 깃허브에서 airflow-setup 파일 받음
    weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/keeyong/airflow-setup.git
    Cloning into 'airflow-setup'...
    remote: Enumerating objects: 65, done.
    remote: Counting objects: 100% (65/65), done.
    remote: Compressing objects: 100% (63/63), done.
    remote: Total 65 (delta 27), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (65/65), 1.32 MiB | 20.85 MiB/s, done.
    Resolving deltas: 100% (27/27), done.

  2. 해당 폴더로 이동
    weare@DESKTOP-BE1I4GE:~$ cd airflow-setup

  3. curl을 사용하여 URL에서 yaml 파일을 다운로드하고 -O 옵션을 사용하여 로컬에 파일을 저장
    weare@DESKTOP-BE1I4GE:~/airflow-setup$ curl -LfO "https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml"
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 10493  100 10493    0     0   134k      0 --:--:-- --:--:-- --:--:--  134k

  4. yaml 파일에 정의된 도커 이미지를 다운로드. 로컬에 없는, postres, redis 등은 docker hub 에서 가져옴.
    weare@DESKTOP-BE1I4GE:~/airflow-setup$ docker-compose -f docker-compose.yaml pull
    WARNING: The AIRFLOW_UID variable is not set. Defaulting to a blank string.
    Pulling postgres          ... done
    Pulling redis             ... done
    Pulling airflow-init      ... done
    Pulling airflow-triggerer ... done
    Pulling airflow-worker    ... done
    Pulling airflow-scheduler ... done
    Pulling airflow-webserver ... done
    + postres, redis 는 외부에서 가져와서 airflow-가 앞에 붙지 않았다.

  5. 서버 실행 (에러발생)
    weare@DESKTOP-BE1I4GE:~/airflow-setup$ docker-compose -f docker-compose.yaml up
    WARNING: The AIRFLOW_UID variable is not set. Defaulting to a blank string.
    Creating airflow-setup_redis_1    ... done
    Creating airflow-setup_postgres_1 ... done
    Creating airflow-setup_airflow-init_1 ... done
    Creating airflow-setup_airflow-scheduler_1 ... done
    Creating airflow-setup_airflow-webserver_1 ... done
    Creating airflow-setup_airflow-triggerer_1 ... done
    Creating airflow-setup_airflow-worker_1    ... done
    Attaching to airflow-setup_redis_1, airflow-setup_postgres_1, airflow-setup_airflow-init_1, airflow-setup_airflow-scheduler_1, airflow-setup_airflow-webserver_1, airflow-setup_airflow-triggerer_1, airflow-setup_airflow-worker_1
    airflow-init_1       |
    airflow-init_1       | WARNING!!!: AIRFLOW_UID not set!
    airflow-init_1       | If you are on Linux, you SHOULD follow the instructions below to set
    airflow-init_1       | AIRFLOW_UID environment variable, otherwise files will be owned by root.
    airflow-init_1       | For other operating systems you can get rid of the warning with manually created .env file:

    AIRFLOW_UID not set! : AIRFLOW_UID가 설정되지 않았다는 내용, 필요한 폴더들을 만들고 환경변수가 저장될 위치가 필요하다.
  6. 에러 해결을 위해 airflow 운용에 필요한 폴더( dags , logs, plugins )들을 만들고 환경변수가 저장될 위치가 필요하다.

    1) DAG 파일, 로그, 플러그인 등이 저장되는 경로를 설정
        `mkdir -p ./dags ./logs ./plugins`:
       - `mkdir`: 디렉토리를 생성
       - `-p`: 부모 디렉토리가 없으면 함께 생성합니다.
       - `./dags`: 현재 작업 디렉토리에 "dags"라는 디렉토리를 생성합니다. Airflow에서 DAG 파일을 저장하는 디렉토리
       - `./logs`: 현재 작업 디렉토리에 "logs"라는 디렉토리를 생성합니다. Airflow 로그 파일이 저장되는 디렉토리입니다.
       - `./plugins`: 현재 작업 디렉토리에 "plugins"라는 디렉토리를 생성합니다. Airflow 플러그인이 위치하는 디렉토리

    2) AIRFLOW_UID를 만들고 저장할 위치를 설정
    `echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env`:
       - `echo`: 화면에 텍스트를 출력하는 명령어입니다.
       - `-e`: 이 옵션은 이스케이프 시퀀스 (예: `\n` 등)를 해석하도록 합니다.
       - `"AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0"`: 환경 변수 파일인 `.env`에 저장할 내용으로, 현재 사용자의 UID(사용자 ID)를 `AIRFLOW_UID`로 설정하고, `AIRFLOW_GID`를 0으로 설정합니다. `id -u`는 현재 사용자의 UID를 가져오는 명령어입니다.
       - `> .env`: 앞서 설정한 내용을 현재 디렉토리에 `.env` 파일로 저장합니다.

  7. 다시 서버실행 weare@DESKTOP-BE1I4GE:~/airflow-setup$ docker-compose -f docker-compose.yaml up
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:06:38 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:06:48 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:06:58 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:07:08 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:07:18 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    airflow-webserver_1  | 127.0.0.1 - - [29/Dec/2023:13:07:28 +0000] "GET /health HTTP/1.1" 200 141 "-" "curl/7.74.0"
    정상동작 됨을 볼 수 있다.

  8. http://localhost:8080/ 접속 (포트 8080과 , id, pw :airflow 이고, 이는 전부 yaml파일에 설정돼있다.)

 

 

docker-compose.yaml 파일 내용분석

  • x-airflow-common

    `x-airflow-common`이라는 용어는 Apache Airflow의 DAG 정의에서 사용되는 확장(`x`) 속성 중 하나일 수 있습니다. DAG(Directed Acyclic Graph)는 Airflow에서 워크플로우를 정의하는 방식입니다.

    `x-airflow-common`은 일반적으로 Airflow DAG 정의에서 공통적으로 사용되는 설정이나 속성을 담기 위한 사용자 정의 확장 속성입니다. 이 속성을 사용하면 여러 DAG에서 공유되는 설정이나 로직을 중복해서 정의하지 않고 한 번에 관리할 수 있습니다.

    예를 들어, 여러 DAG에서 공통적으로 사용되는 설정이 있다면 이를 `x-airflow-common` 속성으로 정의하고, 각 DAG에서 이를 참조하여 사용할 수 있습니다.

    아래는 간단한 DAG 정의에서 `x-airflow-common`이 어떻게 사용될 수 있는지의 예시입니다:

    ```yaml
    # 예시 DAG 정의
    default_args:
      owner: 'airflow'
      start_date: days_ago(1)

    x-airflow-common:
      retries: 3
      retry_delay:
        minutes: 5

    tasks:
      - task_id: task1
        bash_command: 'echo "Hello, World!"'
    ```

    위의 예시에서 `x-airflow-common` 속성은 `retries` 및 `retry_delay`와 같은 일반적으로 여러 곳에서 사용되는 설정을 담고 있습니다. 이렇게 하면 `tasks` 내의 각 태스크에서 이 속성을 참조하여 사용할 수 있습니다.


  • airflow에서 x-airflow-common 의 실제예

     1) &airflow-common 아래 내용을 airflow-common으로 지정
     2) _PIP_ADDITIONAM_REQUIREMENTS : 설치해야할 파이썬 모듈 이름들 지정
     실행할때마다 모듈이 지워지는데 재설치할 수고가 적어짐, 모든 컨테이너에 모듈이 설치 돼서 모듈오류가 줄어듬
     3) {AIRFLOW_PROJ_DIR:-.} : airflow yaml 파일이 있는 폴더의 이름

모듈 추가방식

  • airflow-scheduler 서비스

     1) <<: *airflow-common : 아까 &airflow-common 로 지정했던것 사용
     2) airflow-init ~ : condition 충족하면 실행

networks

  • 프론티어와 백티어로 나눔
  • 왜냐하면 각각의 서비스가 다른 네트워크에 속함으로써 서비스 간의 통신을 조절하거나, 보안을 강화하거나, 다양한 다른 설정을 적용할 수 있다.

 

volume

  • 계속해서 데이터를 저장해야 하는곳에 쓰임
  • 아래의경우 postgresql를 docker volume으로 지정하려면
    volumes:
    # 지속적으로 내용이 유지됨
      db-data:

  • db-data:/var....
  • volume id: postgresql의 데이터저장위치


vote 서비스 개선

  • command ~ : 원래 동작(이미지 dockerfile의 cmd)을 덮어쓰고(오버라이드) 원하는 커맨드를 추가
    +entrypoint ~ : 이미지 dockerfile의 entrypoint를 덮어씀
  • depends_on ~: 이상적인 실행순서 지정
  • healthcheck ~: 서비스의 실행 컨디션이 좋은지 판단 (test로 주어진 명령을, 15초마다 실행,응답이 5초이상이면 실패고, 3번더 재시도 해보고, 실패판단, 10초후에 healthcheck 시작) 반환값이 0이면 성공, 1이면 실패
  • volumes ~:  보트쪽 폴더:도커컨테이너쪽 폴더 -> 두개 연결(매핑)

 

db 서비스 개선

+environment : environment  안에서 기술한 서비스가 컨테이너 안에서 실행될 때, 환경변수들을 지정
입력하는 방식의 차이

 

worker 서비스 개선

  • build에서 context 를 ./myapp -> ./worker로 덮어씀(오버라이드) 

 

목표 : postgres 로그인 정보를, docker-compose.yml 파일에 넣어 넘겨주는 실습을 진행 

 

 

실습진행

 

  1. 깃에서 실습파일 다운
    weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/learndataeng/example-voting-app.git
    Cloning into 'example-voting-app'...
    remote: Enumerating objects: 1087, done.
    remote: Total 1087 (delta 0), reused 0 (delta 0), pack-reused 1087
    Receiving objects: 100% (1087/1087), 1.14 MiB | 21.26 MiB/s, done.
    Resolving deltas: 100% (407/407), done.
  2. 해당 파일로 이동
    weare@DESKTOP-BE1I4GE:~$ cd example-voting-app
  3. 파일 안에 yml 파일 빌드
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose -f docker-compose.mac.yml build
    중략
    +만약 worker가 빌드가 안되고, 그 이유가 Buildx 미설치로 인한 에러라면 
    https://allofdater.tistory.com/37 를 참조한다.

  4. 만들어진 이미지 확인
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker images
    REPOSITORY                   TAG         IMAGE ID       CREATED             SIZE
    example-voting-app_worker    latest      79f4f5ff65ba   36 minutes ago      194MB
    example-voting-app_result    latest      21441b000470   37 minutes ago      220MB
    example-voting-app_vote      latest      68b2f101195b   37 minutes ago      145MB

  5. yml파일 빌드 수행
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose -f docker-compose.mac.yml build
    redis uses an image, skipping
    db uses an image, skipping
    Building vote
    [+] Building 7.1s (11/11) FINISHED

  6. 프로젝트에 정의된 모든 서비스의 이미지를 최신 버전으로 업데이트하고, 공식 이미지 postgres, redis를 받아옴
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose -f docker-compose.mac.yml pull

  7. 다시 이미지를 확인하면 postgres, redis 두개가 추가 돼있음
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker images
    REPOSITORY                   TAG         IMAGE ID       CREATED          SIZE
    example-voting-app_worker    latest      79f4f5ff65ba   43 minutes ago   194MB
    example-voting-app_result    latest      21441b000470   44 minutes ago   220MB
    example-voting-app_vote      latest      68b2f101195b   44 minutes ago   145MB
    postgres                     15-alpine   c94362bdb5ee   2 weeks ago      240MB
    redis                        alpine      d2d4688fcebe   3 weeks ago      41MB

  8. 빌드하고, 컨테이너만들고, 컨테이너실행 3가지를 한번에 하는 명령어 docker-compose up
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose up
    (중략)
    vote_1    | 127.0.0.1 - - [29/Dec/2023 07:23:44] "GET / HTTP/1.1" 200 -
    vote_1    | 127.0.0.1 - - [29/Dec/2023 07:23:59] "GET / HTTP/1.1" 200 -

  9. 동작 확인
    윈도우 
    http://localhost:5000/
    http://localhost:5001/
    둘다 접속(맥은 5001,5002로 들어갈것)
  10. 실행중인 컨테이너 확인
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose ps
               Name                          Command                  State                         Ports
    ------------------------------------------------------------------------------------------------------------------------
    example-voting-app_db_1       docker-entrypoint.sh postgres    Up (healthy)   5432/tcp
    example-voting-app_redis_1    docker-entrypoint.sh redis ...   Up (healthy)   6379/tcp
    example-voting-app_result_1   nodemon server.js                Up             0.0.0.0:5858->5858/tcp,:::5858->5858/tcp,
                                                                                  0.0.0.0:5001->80/tcp,:::5001->80/tcp
    example-voting-app_vote_1     python app.py                    Up (healthy)   0.0.0.0:5000->80/tcp,:::5000->80/tcp
    example-voting-app_worker_1   dotnet Worker.dll                Up

  11. 사용자를 postgres로 지정하고, example-voting-app_db_1 의 shell을 연다.
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker exec -it --user=postgres example-voting-app_db_1 sh

  12. whoami를 통해 postgres 계정에 들어와 있음을 확인
    / $ whoami
    postgres

  13.  psql 설치된것 확인
    / $ psql
    psql (15.5)
    Type "help" for help.

  14. 현재 연결된 db와 유저이름
    postgres=# \c
    You are now connected to database "postgres" as user "postgres".

  15. 현재 데이터베이스에 있는 테이블 목록을 나열
    postgres=# \dt
             List of relations
     Schema | Name  | Type  |  Owner
    --------+-------+-------+----------
     public | votes | table | postgres
    (1 row)

  16. votes 내용 확인
    postgres=# SELECT * FROM votes;
           id        | vote
    -----------------+------
     161e7795c8e92b7 | a
    (1 row)

  17. 종료
    postgres=# exit
    / $ exit


    p.s 
    +종료 후 yml 내려본다.
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker-compose -f docker-compose.mac.yml down
    Stopping example-voting-app_worker_1 ... done
    Stopping example-voting-app_vote_1   ... done
    Stopping example-voting-app_result_1 ... done
    Stopping example-voting-app_redis_1  ... done
    Stopping example-voting-app_db_1     ... done
    Removing example-voting-app_worker_1 ... done
    Removing example-voting-app_vote_1   ... done
    Removing example-voting-app_result_1 ... done
    Removing example-voting-app_redis_1  ... done
    Removing example-voting-app_db_1     ... done
    Removing network example-voting-app_default
    WARNING: Network example-voting-app_default not found.

    + 컨테이너 지워 졌는지 확인
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    + down은 컨테이너만 지우고 이미지는 지우지 않음을 알 수있음.
    weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker images
    REPOSITORY                   TAG         IMAGE ID       CREATED         SIZE
    example-voting-app_worker    latest      79f4f5ff65ba   2 hours ago     194MB
    example-voting-app_result    latest      21441b000470   2 hours ago     220MB
    example-voting-app_vote      latest      68b2f101195b   2 hours ago     145MB
    <none>                       <none>      814c986a34da   2 hours ago     220MB
    <none>                       <none>      f220bc028f32   2 hours ago     145MB
    node                         18-slim     d3cce7487840   9 days ago      196MB
    postgres                     15-alpine   c94362bdb5ee   2 weeks ago     240MB
    redis                        alpine      d2d4688fcebe   3 weeks ago     41MB
    python                       3.9-slim    4fd8d6bf114c   2 months ago    126MB
    multiarch/qemu-user-static   latest      3539aaa87393   11 months ago   305MB

docker-compose란

  • 여러 도커 컨테이너를 정의하고 컨테이너들 간의 환경설정, 의존성, 포트매핑, 네트워크, 실행 등을 관리하는 도구
  • 이러한 설정 파일은 YAML 형식으로 작성되며, 컨테이너, 네트워크, 볼륨 등과 관련된 설정을 포함
    docker-compose.yml ,   docker-compose.yaml
  • 개별 컨테이너를 따로 관리하는거보다 효율적이다.
  • 개발 환경 (dev), 테스트 환경 (test), 운영 환경 (prod) 등 다양한 버전으로 만든다.

docker-compose 관련명령어

  • docker-compose up: 설정된 서비스들을 시작합니다. ( build->create->start 3단계 다있음)
  • docker-compose down: 실행 중인 서비스들을 중지하고 관련된 리소스를 삭제합니다. (stop +rm : 멈추고 삭제)
  • docker-compose ps: 현재 실행 중인 서비스들의 상태를 표시합니다.
  • docker-compose logs: 서비스들의 로그를 표시합니다.
  • docker-compose build : 정의된 서비스들의 이미지를 빌드
  • docker-compose pull : 정의된 서비스들에 대한 이미지를 Docker Hub 또는 지정된 레지스트리에서 가져옴
  • docker-compose start : 명령어는 정의된 서비스들을 시작
  • docker-compose stop : 실행 중인 서비스들을 중지
  • docker-compose rm : 정의된 서비스들과 관련된 컨테이너, 네트워크, 볼륨 등을 삭제합니다. -v 옵션을 추가하면 관련된 볼륨도 함께 삭제
  • docker-compose push : docker hub로 이미지들을 올림
  • docker compose = docker-compose
  • docker-compose.yaml = docker-compose.yml (둘다 존재하면 에러 발생하니 주의)

+ 만약 다른 이름의 파일 사용하고 싶으면 docker-compose -f docker-compose.mac.yml up (-f 사용)
보통 이렇게 쓰임
docker-compose.prod.yml (프로덕션용) , docker-compose.dev.yml (개발용) , docker-compose.test.yml (테스트용)
프로덕션 : 실제운영환경/ 개발 :개발하고 디버깅 / 테스트 : 버그 찾아내고 테스트

 

docker-compose 설치

  • docker desktop의 일부로 자동 설치됨
  • docker engine 실행하고 터미널에서 버전 확인
  • docker-compose --version

docker-compose.yml 파일구성

  1. **`services`:**
       - `services` 섹션은 여러 개의 컨테이너 서비스를 정의합니다. 각 서비스는 독립적으로 실행되는 컨테이너를 나타냅니다. 각 서비스에는 사용할 도커 이미지, 포트 매핑, 환경 변수 등을 설정할 수 있습니다.

       services:
         web:
           image: nginx:latest
           ports:
             - "8080:80"
         database:
           image: postgres:latest
           environment:
             POSTGRES_PASSWORD: example

  2.  **`volumes`:**
       - `volumes` 섹션은 볼륨을 정의합니다. 볼륨은 컨테이너 간 데이터를 공유하거나 데이터를 영속적으로 저장하는 데 사용됩니다. 여러 서비스 간에 데이터를 공유하거나 컨테이너 내부의 데이터를 호스트와 분리하는 데 활용됨

       volumes:
         data-volume:

       볼륨은 `services` 섹션에서 각 서비스의 `volumes` 옵션을 통해 연결할 수 있습니다.

  3.  **`networks`:**
       - `networks` 섹션은 네트워크를 정의합니다. 여러 컨테이너 간의 통신을 위한 네트워크를 설정할 수 있습니다. 기본적으로 `docker-compose`는 기본 네트워크를 생성하며, 추가적으로 정의된 네트워크를 사용할 수 있습니다.

       networks:
         frontend:
         backend:

       네트워크는 `services` 섹션에서 각 서비스의 `networks` 옵션을 통해 연결할 수 있습니다. 이를 통해 서비스 간에 특정 네트워크를 통한 통신이 가능해집니다.

    이러한 섹션들을 조합하여 `docker-compose.yml` 파일을 작성하면 여러 개의 컨테이너로 구성된 멀티-컨테이너 애플리케이션을 쉽게 정의하고 실행할 수 있습니다.

+여기다 서버를 각각 따로 구성하려면 networks도 추가

 

docker 관련 명령 동작 예시

  • docker images : 이미지들을 출력.
    'docker-compose build' 시 폴더 이름(example/voting/app) 이 앞에 첨자로 붙어 출력된다.
    +다른방법으로 빌드 됐거나, 도커 허브에서 온경우 첨자가 붙지 않는다.
  • docker-compose images : 컨테이너들을 출력
  • docker-compose push : docker hub로 이미지들을 올림(허브에서 온애들 안올림)

  • docker-compose ls (그룹별로 보여줌)
  • docker-compose ps(그룹내 각각 보여줌)

 

  • docker network ls (bridge, host, none)

+Bridge 모드는 Docker의 기본 네트워크 모드이며, 컨테이너를 위한 가상 브리지를 생성합니다. 이 가상 브리지는 호스트 시스템과 컨테이너 간의 통신을 도와줍니다.
   - **특징:**
     - 컨테이너 간 통신을 지원합니다.
     - 각 컨테이너는 가상 브리지에 연결되어 호스트와 격리됩니다.
   docker run --network=bridge my-container

Host 모드는 호스트의 네트워크 네임스페이스를 공유하는 방식으로 동작합니다. 컨테이너는 호스트의 네트워크 인터페이스를 직접 사용하게 됩니다.
   - **특징:**
     - 호스트와 동일한 네트워크 네임스페이스를 공유하므로 호스트와 동일한 IP 주소를 사용합니다.
     - 호스트와 완전히 통합되어 있는데, 이는 네트워크 격리를 해제하는 효과가 있습니다.
   docker run --network=host my-container

None 모드는 네트워크를 사용하지 않는 방식으로, 컨테이너는 네트워크를 가지지 않습니다. 따라서 외부와의 통신이 차단
   - **특징:**
     - 외부와 통신이 필요하지 않은 경우에 사용됩니다.
     - 컨테이너는 외부 네트워크와 격리되며, 내부에서만 동작합니다.
   docker run --network=none my-container

 

+ Recent posts