Docker Compose: κ°œλ°œλΆ€ν„° μƒμ‚°κΉŒμ§€

팟캐슀트 λŒ€λ³Έμ˜ λ²ˆμ—­μ€ μˆ˜μ—… μΆœμ‹œμ— λŒ€λΉ„ν•˜μ—¬ μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. "λ¦¬λˆ…μŠ€ κ΄€λ¦¬μž"

Docker Compose: κ°œλ°œλΆ€ν„° μƒμ‚°κΉŒμ§€

Docker ComposeλŠ” μž‘μ—… ν™˜κ²½μ„ λ§Œλ“œλŠ” 데 λ†€λΌμš΄ λ„κ΅¬μž…λ‹ˆλ‹€.
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λŠ” μŠ€νƒμ— λŒ€ν•œ ν™˜κ²½μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹€μŒμ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
κ·€ν•˜μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 각 ꡬ성 μš”μ†ŒλŠ” λͺ…ν™•ν•˜κ³  κ°„λ‹¨ν•œ ꡬ문을 λ”°λ¦…λ‹ˆλ‹€. YAML-
파일
.

의 μΆœν˜„μœΌλ‘œ 도컀 컴포즈 v3 μ΄λŸ¬ν•œ YAML νŒŒμΌμ€ μž‘μ—… μ‹œ ν”„λ‘œλ•μ…˜μ—μ„œ 직접 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
무리 도컀 μŠ€μ›œ.

ν•˜μ§€λ§Œ 이것은 λ™μΌν•œ docker-compose νŒŒμΌμ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆκΉŒ?
개발 ν™˜κ²½κ³Ό ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‚˜μš”? μ•„λ‹ˆλ©΄ 같은 νŒŒμΌμ„ μ‚¬μš©ν•˜μ„Έμš”.
μŠ€ν…Œμ΄μ§•μ΄μš”? 음, μΌλ°˜μ μœΌλ‘œλŠ” κ·Έλ ‡μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

  • λ³€μˆ˜ 보간: 일뢀 ν™˜κ²½ λ³€μˆ˜ μ‚¬μš©
    각 ν™˜κ²½λ§ˆλ‹€ λ³€ν™”ν•˜λŠ” κ°€μΉ˜.
  • ꡬ성 μž¬μ •μ˜: 두 번째(λ˜λŠ” λͺ¨λ“ )λ₯Ό μ •μ˜ν•˜λŠ” κΈ°λŠ₯
    μƒλŒ€μ μœΌλ‘œ 무언가λ₯Ό λ³€κ²½ν•  또 λ‹€λ₯Έ 후속 docker-compose 파일
    λ¨Όμ €, docker composeκ°€ 두 νŒŒμΌμ„ λ³‘ν•©ν•©λ‹ˆλ‹€.

개발 파일과 ν”„λ‘œλ•μ…˜ 파일의 차이점

개발 쀑에 μ½”λ“œ λ³€κ²½ 사항을 μ²΄ν¬μΈν•˜κ³  싢을 κ°€λŠ₯성이 κ°€μž₯ λ†’μŠ΅λ‹ˆλ‹€.
μ‹€μ‹œκ°„ λͺ¨λ“œ. 이λ₯Ό μœ„ν•΄ μ†ŒμŠ€ μ½”λ“œ λ³Όλ₯¨μ€ 일반적으둜
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λŸ°νƒ€μž„μ„ ν¬ν•¨ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ˜ 경우
이 방법은 μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μƒμ‚°μ—μ„œλŠ” μ—¬λŸ¬ λ…Έλ“œκ°€ μžˆλŠ” ν΄λŸ¬μŠ€ν„°κ°€ 있고 λ³Όλ₯¨μ€ λ‘œμ»¬μž…λ‹ˆλ‹€.
μ»¨ν…Œμ΄λ„ˆ(λ˜λŠ” μ„œλΉ„μŠ€)κ°€ μ‹€ν–‰ 쀑인 λ…Έλ“œλ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λ―€λ‘œ
λ³΅μž‘ν•œ μž‘μ—… 없이 μ†ŒμŠ€ μ½”λ“œλ₯Ό λ§ˆμš΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ½”λ“œ 동기화, μ‹ ν˜Έ λ“±

λŒ€μ‹ , μš°λ¦¬λŠ” 일반적으둜 νŠΉμ • λ²„μ „μ˜ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 이미지λ₯Ό λ§Œλ“€κ³  μ‹Άμ–΄ν•©λ‹ˆλ‹€.
μ μ ˆν•œ νƒœκ·Έλ‘œ ν‘œμ‹œν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€(의미적 νƒœκ·Έλ₯Ό μ‚¬μš©ν•  수 있음)
버전 관리 λ˜λŠ” κ·€ν•˜μ˜ μž¬λŸ‰μ— λ”°λ₯Έ λ‹€λ₯Έ μ‹œμŠ€ν…œ).

ꡬ성 μž¬μ •μ˜

차이점을 κ³ λ €ν•˜κ³  μ‹œλ‚˜λ¦¬μ˜€μ— 따라 쒅속성이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
개발과 μš΄μ˜μ—μ„œλŠ” μ„œλ‘œ λ‹€λ₯Έ ꡬ성 파일이 ν•„μš”ν•˜λ‹€λŠ” 것이 λΆ„λͺ…ν•©λ‹ˆλ‹€.

Docker ComposeλŠ” λ‹€μ–‘ν•œ Compose νŒŒμΌμ„ κ²°ν•©ν•˜λŠ” 것을 μ§€μ›ν•©λ‹ˆλ‹€.
μ΅œμ’… ꡬ성을 μ–»μŠ΅λ‹ˆλ‹€. μž‘λ™ 방식은 λ‹€μŒ μ˜ˆμ‹œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ docker composeλŠ” μ—¬λŸ¬ composeλ₯Ό κ²°ν•©ν•˜λŠ” 것을 μ§€μ›ν•©λ‹ˆλ‹€.
νŒŒμΌμ„ μ‚¬μš©ν•˜λ©΄ 두 번째 파일의 λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

이 ꡬ문은 개발 쀑에 λͺ…령을 μ‚¬μš©ν•  λ•Œ 맀우 νŽΈλ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ—¬λŸ¬ 번 ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹€ν–‰νžˆλ„ docker composeλŠ” μžλ™μœΌλ‘œ λ‹€μŒκ³Ό 같은 특수 νŒŒμΌμ„ μ°ΎμŠ΅λ‹ˆλ‹€.
docker-compose.override.yml 값을 μž¬μ •μ˜ν•˜λ €λ©΄ docker-compose.yml. λ§Œμ•½
두 번째 파일의 이름을 λ°”κΎΈλ©΄ μ›λž˜ λͺ…λ Ήλ§Œ μ‚¬μš©ν–ˆμ„ λ•Œμ™€ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

μ•Œκ² μŠ΅λ‹ˆλ‹€. 그러면 κΈ°μ–΅ν•˜κΈ°κ°€ 더 μ‰¬μ›Œμ§€κ² λ„€μš”.

λ³€μˆ˜μ˜ 보간

ꡬ성 파일 지원 보간
λ³€μˆ˜
기본값을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

그리고 λ§Œμ•½ 당신이 κ·Έλ ‡κ²Œ ν•œλ‹€λ©΄ docker-compose λΉŒλ“œ(λ˜λŠ” ν‘Έμ‹œ) ν™˜κ²½ λ³€μˆ˜ 없이
λ‚΄ μ„œλΉ„μŠ€ 버전, 값이 μ‚¬μš©λ©λ‹ˆλ‹€ 졜근, ν•˜μ§€λ§Œ μ„€μΉ˜ν•˜λ©΄
λΉŒλ“œ μ „ ν™˜κ²½ λ³€μˆ˜μ˜ 값은 λΉŒλ“œ λ˜λŠ” ν‘Έμ‹œ 쀑에 μ‚¬μš©λ©λ‹ˆλ‹€.
등둝뢀에 개인 λ ˆμ§€μŠ€νŠΈλ¦¬ κ΄‘μ‚°.

λ‚΄ 원칙

λ‚˜μ—κ²Œ νŽΈλ¦¬ν•œ μ ‘κ·Ό 방식이 μ—¬λŸ¬λΆ„μ—κ²Œλ„ μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ‹€μŒ 사항을 λ”°λ¦…λ‹ˆλ‹€.
κ°„λ‹¨ν•œ κ·œμΉ™:

  • 생산, 개발(λ˜λŠ” 기타 ν™˜κ²½)을 μœ„ν•œ λͺ¨λ“  μŠ€νƒμ€ λ‹€μŒμ„ 톡해 μ •μ˜λ©λ‹ˆλ‹€.
    docker-compose 파일.
  • λ‚΄ λͺ¨λ“  ν™˜κ²½μ„ ν¬κ΄„ν•˜λŠ” 데 ν•„μš”ν•œ ꡬ성 νŒŒμΌμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    쀑볡을 ν”Όν•˜μ„Έμš”.
  • λͺ¨λ“  ν™˜κ²½μ—μ„œ μž‘λ™ν•˜λ €λ©΄ κ°„λ‹¨ν•œ λͺ…λ Ή ν•˜λ‚˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • μ£Όμš” ꡬ성은 νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. docker-compose.yml.
  • ν™˜κ²½ λ³€μˆ˜λŠ” 이미지 νƒœκ·Έλ‚˜ 기타λ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
    ν™˜κ²½λ§ˆλ‹€ 변경될 수 μžˆλŠ” λ³€μˆ˜(μŠ€ν…Œμ΄μ§•, 톡합,
    생산).
  • 생산 λ³€μˆ˜ 값은 κ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
    기본적으둜 이것은 ν”„λ‘œλ•μ…˜μ—μ„œ μŠ€νƒμ„ μ‹€ν–‰ν•  경우 μœ„ν—˜μ„ μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.
    ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
  • ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜λ €λ©΄ λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜μ„Έμš”. docker stack 배포 β€” docker-compose.yml β€”with-registry-auth my-stack-name μž‘μ„± 파일.
  • μž‘μ—… ν™˜κ²½μ€ λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ‹œμž‘λ©λ‹ˆλ‹€. 도컀 - μœ„λ‘œ ꡬ성 dd.

κ°„λ‹¨ν•œ 예λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

λ‚˜λŠ” μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ docker-compose(docker-compose up)μŠ€νƒμ„ μ‹œμž‘ν•˜λ €λ©΄
μ†ŒμŠ€ μ½”λ“œκ°€ 마운트된 개발 λͺ¨λ“œ /ν”„λ‘œμ νŠΈ/μ†ŒμŠ€.

ν”„λ‘œλ•μ…˜μ—μ„œλ„ λ™μΌν•œ νŒŒμΌμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€! 그리고 μ •ν™•νžˆ
같은 파일 docker-compose.yml μŠ€ν…Œμ΄μ§•μ„ μœ„ν•΄. 이것을 λ°°ν¬ν•˜λ €λ©΄
μ œμž‘μ„ μœ„ν•΄μ„œλŠ” 미리 μ •μ˜λœ νƒœκ·Έλ‘œ 이미지λ₯Ό λΉŒλ“œν•˜κ³  μ „μ†‘ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.
CI λ‹¨κ³„μ—μ„œ:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

운영 ν™˜κ²½μ—μ„œλŠ” λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

그리고 λ¬΄λŒ€μ—μ„œλ„ 같은 것을 ν•˜κ³  μ‹Άλ‹€λ©΄ μ •μ˜λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.
μŠ€ν…Œμ΄μ§• ν™˜κ²½μ—μ„œ μž‘μ—…ν•˜λŠ” 데 ν•„μš”ν•œ ν™˜κ²½ λ³€μˆ˜:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

μš°λ¦¬λŠ” 두 개의 λ‹€λ₯Έ docker-compose νŒŒμΌμ„ μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
ꡬ성 λ³΅μ œλŠ” λͺ¨λ“  ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

과정에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ° "λ¦¬λˆ…μŠ€ κ΄€λ¦¬μž"

좜처 : habr.com

μ½”λ©˜νŠΈλ₯Ό μΆ”κ°€