42Seoul/Docker

33. docker 메뉴얼 파해치기 Build compose

dockerfile 여러개를 좀더 효율적이게 쓰기위해 docker compose파일이 있다.

하나의 파일에 여러개의 dockerfile을 컨트롤 및 빌드 할 수 있고 up 명령어로 한번에 실행도 가능하다

또 down 으로 끄는것도 가능

 docker compose up -d
 ./run_tests
 docker compose down

예시를 보며 확인해보자

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

이렇게 3.9 docker compose 를 사용하고

services는 

web 과 redis를 만듬

그리고 그설정들을 넣어주고

volumes으ㅡ로 logvolume01를 만든다(이뒤에 {} 가뭔지 모르겟네)

 

여러가지 서비스에대한건

https://docs.docker.com/compose/compose-file/05-services/

 

Services top-level element

 

docs.docker.com

 

여기를 보는게 최고인거같다

다있는듯

 

docker-compose를 쓰는이유

컨테이너의 볼륨 데이터를 보존하고 변경된 컨테이너만을 재생성하여 좀더 효율적으로 사용가능하다

 

 

음 docker-compose도 플러그인이였네...

 sudo apt-get update
 sudo apt-get install docker-compose-plugin

이런식으로 설치

이제 실행해보는 단계

https://docs.docker.com/compose/gettingstarted/

 

Try Docker Compose

 

docs.docker.com

 

이부분을 따라서 해보면 된다

 

.env 와 같은 환경변수 설정하는것!

이것도 중요한거 같음

cat .env
TAG=v1.5
cat docker-compose.yml
services:
  web:
    image: "webapp:${TAG}"
    
docker compose config

services:
  web:
    image: 'webapp:v1.5'

이런식으로 결과가 환경변수로 변경된 것을 볼 수 있다

또한  --env-file 명령어로 특정 env를 지정할 수도 있다

Syntax 음... 이건 미니쉘 했으면 syntax가 익숙 할 것이다.

quoted 에서 변화하는걸 보여주는거 같은데

미니쉘과 같다 고 보면 된다

그리고 ${VAR:-default} 같은 거는 값그니깐 export 같은 느낌 인데 값이 안들어가있으면 default 값이 있으면 변화없음

${VAR-default}는 VAR자체가 선언안된경우

export 로 예들자면
export VAR
export
VAR 암것도 없음

${VAR:-default}
default 출력

VAR2 선언안함
${VAR2-default}
default 출력


export VAR3
export
VAR3 암것도 없음

${VAR3:?error}
error 출력


VAR4 선언안함
${VAR4?error}
error 출력

그밑에 +syntax는 변경해주는거 같다

 

 

 

이제 사전정의된 환경변수들을 보자

  • COMPOSE_CONVERT_WINDOWS_PATHS
  • COMPOSE_FILE
  • COMPOSE_PROFILES
  • COMPOSE_PROJECT_NAME
  • DOCKER_CERT_PATH
  • COMPOSE_PARALLEL_LIMIT
  • COMPOSE_IGNORE_ORPHANS
  • COMPOSE_REMOVE_ORPHANS
  • COMPOSE_PATH_SEPARATOR

꾀많음

 

- COMPOSE_CONVERT_WINDOWS_PATHS

이거는 윈도우 스타일에서 유닉스 스타일로 변경하는거 같다

1이 활성화 0 이 비활성화

 

- COMPOSE_FILE

compose.yaml 파일이 지금 위치에없으면 상위 파일을 뒤진다고 한다음...

mac 리눅스는 ':' 으로  윈도우는 ';' 로 경로를 구분하여 여러개를 검색하게 할 수 있는듯? 하다 왜필요할까??

 

- COMPOSE_PROFILES

프로파일의 설정을 할 수 있는거같다.

뭐 기본 디폴트를 뭐로 설정할지 정도??

 

- COMPOSE_PROJECT_NAME

이름을 정하는거

-p 와 

name: 이런식

basename 으로 이름을 정해준다는 거같다

 

-DOCKER_CERT_PATH

이거 크레딧 페치인거같은데.. 데몬 소켓 쪽에서 나온적이 있다

일단 넘어가자

 

- COMPOSE_PARALLEL_LIMIT

동시 엔진 갯수를 제한하는거 같다 음...

 

- COMPOSE_IGNORE_ORPHANS

음 이건 뭘까??? 없어진?? 안쓰는?? 컨테이너를 감지하려고 하지않는다??

뭘까?

 

- COMPOSE_REMOVE_ORPHANS

이건 위에꺼 없에는거 같다

 

- COMPOSE_PATH_SEPARATOR

구분기호를 정하는거 인거같은데... 어케쓰는거지?

 

암튼 이런 환경변수들이 숨어 있음

 

https://docs.oofbird.me/docker/compose/profiles.html#%E1%84%91%E1%85%B3%E1%84%85%E1%85%A9%E1%84%91%E1%85%B5%E1%86%AF-%E1%84%92%E1%85%AA%E1%86%AF%E1%84%89%E1%85%A5%E1%86%BC%E1%84%92%E1%85%AA

 

프로필 사용

프로필 사용 프로필은 선택적 서비스 활성화로 Compose 어플리케이션 모델을 다양한 용도 및 환경에 사용할 수 있게 합니다. 각 서비스를 0개 이상의 프로필에 매핑하면 됩니다. 매핑되지 않은 경

docs.oofbird.me

profiles 사용법을 잘 번역해주셨다

profiles 은 뭔가 연관성이라고 생각하면 좋을거 같다.

depends_on은 이걸 실행하려면 무언가 있어야한다는 조건을 주었으면

profiles는 이걸 실행하려면 이 프로파일들을 같이 실행시켜라 라는 느낌?

그래서 그룹으로 묶어 이중 하나라도 실행되면 다같이 실행되게 하는 시스템같다.

 

 

GPU관심이 있긴한데...... 아직 이해가 잘안된다 그리고 맥에서 사용법등 이 궁금하긴하다

여러개의 yml 파일을 겹겹으로 할 수도 있는거 같다

혹은 변수 이름이 중복됫을때 겹친것을 이후나온것으로 변경? 하는듯한느낌이다.

이건.. 해보면서 터득해야할듯...

 

이제 네트워크 가자

다들 아는듯 ports로 로컬과 docker를 이어주는데

 

신기한거는 myapp_default라는게 docker-compose 하면 저절로 만들어진다는 것이다

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

이렇게 포트를 해서 8001 로 5432를 접속할수 있지만

myapp_default에서 db라고 정의를 해주기도 하는거 같다

postgres://db:5432로 접속이 된다고 하니...오 신기

아니면 postgres://8001:5432 이렇게 해야할듯

 

links 다른 컨테이너 끼리 네트워크를 공유할 수 있게 만드는 것

services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

이런식으로 이름을 정해서??? 이어주는 방식

https://cumulus.tistory.com/34

 

Docker 네트워크 설정 및 link 기능

1. docker0 Docker가 설치되면 host에 기본으로 생성되는 네트워크 인터페이스 카드이다. 컨테이너의 네트워크 카드를 지정하지 않으면 docker0의 기본적으로 172.16.0.0/16 네트워크를 사용하게 된다. docke

cumulus.tistory.com

 

이분이 실험하신걸 볼 수 있다

 

오 또한 default로 모든 네트워크 기본설정을 할 수  도 있다

 

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

 

그리고 순서도??

이건 wait-for-it.sh or wait-for 같은 명령어가 또있나보다

https://github.com/vishnubob/wait-for-it

 

GitHub - vishnubob/wait-for-it: Pure bash script to test and wait on the availability of a TCP host and port

Pure bash script to test and wait on the availability of a TCP host and port - GitHub - vishnubob/wait-for-it: Pure bash script to test and wait on the availability of a TCP host and port

github.com

 

예시이다

이걸로 순서를 만든다고 하는데....음