728x90
λ°μν
8μ₯ ν¬μ€ 체ν¬μ λνλμ 체ν¬λ‘ μ ν리μΌμ΄μ μ μ λ’°μ± ν보νκΈ°
- λ컀 μ€μμ΄λ μΏ λ²λ€ν°μ€μ κ²½μ° μ»¨ν μ΄λ νλ«νΌμμμ μ ν리μΌμ΄μ μ΄ μ€μ€λ‘ μ΄μμμ ν볡ν μ μλλ‘ ν΄ μ£Όλ κΈ°λ₯μ μ 곡νλ€.
- μ΄λ―Έμ§μ μ ν리μΌμ΄μ μ μνκ° μ μμΈμ§ νμΈν μ μλ μ 보λ₯Ό ν¨κ» ν¨ν€μ§νλ€.
- μ ν리μΌμ΄μ μ΄ μ μμ μΌλ‘ λμνμ§ μμΌλ©΄, νλ«νΌμ΄ λΉμ μ 컨ν μ΄λλ₯Ό μμ νκ³ μ 컨ν μ΄λλ‘ κ΅μ²΄νλ€.
8.1 ν¬μ€ 체ν¬λ₯Ό μ§μνλ λ컀 μ΄λ―Έμ§
- 컨ν μ΄λλ₯Ό μ€νμν€λ©΄ λ΄λΆμμ νΉμ νλ‘μΈμ€κ° μ€νλλ€.
- κ·Έλ¬λ, ν΄λΉ νλ‘μΈμ€κ° μ€νμ€μ΄λΌκ³ μ ν리μΌμ΄μ μ΄ μ μμ μΈ μνλΌλ λ»μ μλλ€.
- λ컀λ μ ν리μΌμ΄μ μ μνκ° μ μμΈμ§ νμΈν μ μλ μ 보λ₯Ό λ컀 μ΄λ―Έμ§μ λ£μ μ μλ€.
$ docker container run -d -p 8080:80 diamol/ch08-numbers-api
# APIλ₯Ό μΈ λ² νΈμΆ
$ curl
71
$ curl
55
$ curl
9
# λ€ λ²μ§ΈλΆν° API νΈμΆ μ€ν¨.
$ curl
{"type":"<https://tools.ietf.org/html/rfc7231#section-6.6.1","title":"An> error occured while processing your request.","status":500,"traceId":"|7cf3120a-44d7eeec8760b32c."}%
$ docker container ls
- λ€λ²μ§Έ λΆν° 500 μλ²μλ¬λ₯Ό λ°ννμ§λ§, 컨ν μ΄λ μνλ μ¬μ ν up μΌλ‘ λμ¨λ€.
- λ컀 μ μ₯μμλ νλ‘μΈμ€ λ΄λΆ μ ν리μΌμ΄μ μ μνκ° μ μμΈμ§ μ μ μλ λ°©λ²μ΄ μλ€.
HEALTHCHECK μΈμ€νΈλμ
- λ컀λ μΌμ ν μκ° κ°κ²©μΌλ‘ 컨ν μ΄λ μμμ HEALTHCHECK μΈμ€νΈλμ μ μ μλ λͺ λ Ήμ μ€ν ν¨μΌλ‘μ¨ μ ν리μΌμ΄μ μ μνκ° μ μμΈμ§ νμΈν μ μλ€.
FROM diamol/dotnet-aspnet
ENTRYPOINT ["dotnet", "/app/Numbers.Api.dll"]
HEALTHCHECK CMD curl --fail <http://localhost/health>
WORKDIR /app
COPY --from=builder /out/ .
- -f, --fail μ΅μ μ ν΅ν΄ μ€ν¨ μλ΅μ λ컀μ μ λ¬ ν μ μλ€.
- --interval=DURATION (default: 30s)
- μμ² λ°λ³΅μκ°
- --timeout=DURATION (default: 30s)
- μμ²μ μλ΅ νμμμ μκ°
- --start-period=DURATION (default: 0s)
- 컨ν μ΄λ μμ ν μν νμΈ λκΈ° μκ°.
- --retires=N (default: 3)
- N λ² μ€ν¨μ unhealth μν λ³κ²½.
$ cd /ch08/exercises/numbers/numbers-api
$ docker image build -t diamol/ch08-numbers-api:v2 -f ./Dockerfile.v2 .
$ doker ps
$ curl localhost:8081/rng
$ curl localhost:8081/rng
$ curl localhost:8081/rng
curl localhost:8081/rng
{"type":"<https://tools.ietf.org/html/rfc7231#section-6.6.1","title":"An> error occured while processing your request.","status":500,"traceId":"|609d0306-4c47a4871ee78355."}
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d1d67dc1cd9 diamol/ch08-numbers-api:v2 "dotnet /app/Numbers…" 2 minutes ago Up 2 minutes (unhealthy) 0.0.0.0:8081->80/tcp xenodochial_lehmann
- μλ¬κ° λ°μν ν 컨ν μ΄λμ μν unhealth νμΈ.
- 컨ν μ΄λ μ΄μ μνλ λ컀 APIλ₯Ό ν΅ν΄ λ³΄κ³ λλ€.
- 컨ν μ΄λ νλ«νΌλ 컨ν μ΄λμ μ΄μ μνλ₯Ό λ³΄κ³ λ°μ μ ν리μΌμ΄μ 볡ꡬ μ‘°μΉλ₯Ό ν μ μλ€.
$ docker container inspect $(docker container ls --last 1 --format '{{.ID}}'
- docker inspect λ₯Ό ν΅ν΄ κ°μ₯ μ΅κ·Όμ ν¬μ€ μ²΄ν¬ μν κ²°κ³Όλ₯Ό νμΈν μ μλ€.
8.2 λνλμ 체ν¬κ° μ μ©λ 컨ν μ΄λ μ€ννκΈ°
- μ¬λ¬ 컨ν μ΄λμμ μ€ν λλ λΆμ° μ ν리μΌμ΄μ μ κ²½μ°. μ΄μμ΄ μκΈ΄ 컨ν μ΄λ κ΅μ²΄ μμ μ 컨ν μ΄λ κ°μ μμ‘΄μ±μ κ³ λ €λμ§ μλλ€.
- λ°λΌμ, λνλμ 체ν¬λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ€ν μ νμν μꡬ μ¬νμ νμΈνλλ‘ νλ€.
- λνλμ 체ν¬λ λ³λμ μΈμ€νΈλμ μ΄ μλ μ ν리μΌμ΄μ μ€ν λͺ λ Ήμ λ‘μ§μ μΆκ°νλ λ°©λ²μΌλ‘ ꡬννλ€.
FROM diamol/dotnet-aspnet
ENV RngApi:Url=http://numbers-api/rng
CMD curl --fail <http://numbers-api/rng> && \\
dotnet Numbers.Web.dll
WORKDIR /app
COPY --from=builder /out/ .
- CMD μΈμ€νΈλμ μ 컨ν μ΄λλ₯Ό μ€νν λ μ€νλλ€.
- && μ μμ μ€λ λͺ λ Ήμ΄ μ±κ³΅νλ©΄ λ€μ μ€λ λͺ λ Ήμ μ€ννλ€.
- && λͺ λ Ή μμ μ ν쑰건μ ν΅ν΄ μ ν리μΌμ΄μ μ€ν 쑰건μ ꡬννλ€.
- 쑰건μ μ€ν¨ν κ²½μ° μ»¨ν μ΄λλ κ·Έλλ‘ μ’ λ£λλ€.
8.3 μ ν리μΌμ΄μ 체ν¬λ₯Ό μν 컀μ€ν μ νΈλ¦¬ν° λ§λ€κΈ°
- μ€λ¬΄μμλ 보μ μ μ± μμ μ΄μ λ‘ μ΄λ―Έμ§μ curl μ ν¬ν¨μν¬ μ μκΈ° λλ¬Έμ curl μ μ¬μ©νμ§ μλλ€.
curl μ μ΄λ―Έμ§μ ν¬ν¨μν€μ§ μλ μ΄μ μ λ¬Έμ μ
νμ¬μμ docker-compose λ΄λΆμμ healthcheck λ₯Ό λ§μ΄ μ¬μ©νλ κ²μ 보μλ€.
κ·Έλ°λ°, μμ μ λ΄μ©μ λ³΄κ³ ‘μ 보μμ λ¬Έμ κ° λ κΉ?’μ λν μΆκ° μ 리μ΄λ€.
- 보μ
- curl μ λ€νΈμν¬ μμ²μ 보λ΄λ λꡬλ‘, μλͺ»λ μ¬μ© μ 보μ μ·¨μ½μ λ ΈμΆ κ°λ₯.
- νΉν, HEALTHCHECK λ 컨ν μ΄λ λ΄λΆμμ μ€νλκΈ° λλ¬Έμ, 곡격μκ° μ΄λ₯Ό μ μ©νμ¬ μ»¨ν μ΄λ λ°μ΄ν° μ μΆ νΉμ 곡격 κ°λ₯.
- μμ μ±
- curl μ μ΄μ©ν HEALTHCHECK λ λ€νΈμν¬ μν, ν μλΉμ€μ μλ΅ μλ λ± μΈλΆ μμΈμ μν₯μ λ°κΈ° μ¬μ.
- μ΄λ‘ μΈν΄ μλΉμ€κ° μ μμ μΌλ‘ μλνκ³ μμμλ HEALTHCHECK κ° μ€ν¨ν μ μμ.
- μ΄λ―Έμ§μ ν¬κΈ°
- curl μ μ΄λ―Έμ§μ ν¬κΈ°λ₯Ό λΆνμνκ² μ¦κ°μν¨λ€.
- νΉν, μ¬λ¬ λ μ΄λ¬λ₯Ό μ¬μ©νλ 볡μ‘ν μ΄λ―Έμ§μ κ²½μ° λ¬Έμ κ° μμ μ μλ€.
- λν, λͺ¨λ μ΄λ―Έμ§μ curl μ΄ λ°λμ νμν κ²μ μλλ―λ‘ λΆνμν μμ λλΉ.
컀μ€ν μ νΈλ¦¬ν°μ μ₯μ
- 컀μ€ν μ νΈλ¦¬ν°λ μ ν리μΌμ΄μ κ³Ό κ°μ μΈμ΄λ‘ ꡬνν μ ν리μΌμ΄μ μ²΄ν¬ λꡬ.
A. μ ν리μΌμ΄μ κ³Ό κ°μ λꡬλ₯Ό μ¬μ©νλ―λ‘ μ΄λ―Έμ§μ μΆκ°μ μΈ μννΈμ¨μ΄λ₯Ό ν¬ν¨μν¬ νμκ° μλ€.
B. μ μ€ν¬λ¦½νΈλ‘ νννκΈ° κΉλ€λ‘μ΄ λ³΅μ‘ν λ‘μ§μ μ¬μ©ν μ μλ€.
C. μ ν리μΌμ΄μ κ³Ό κ°μ μ€μ μ μ¬μ©ν΄. λ°λ³΅ μ μ μ¬μ©λ° μμ λλ½ λ±μ λ°©μ§ν μ μλ€.
D. μ ν리μΌμ΄μ κ³Ό λμΌν νκ²½μμμ μ€ν μ νμΈμ΄ νμν λͺ¨λ μ¬νμ κ²μ¦ν μ μλ€.
FROM diamol/dotnet-aspnet
ENTRYPOINT ["dotnet", "Numbers.Api.dll"]
HEALTHCHECK CMD ["dotnet", "Utilities.HttpCheck.dll", "-u", "<http://localhost/health>"]
WORKDIR /app
COPY --from=http-check-builder /out/ .
COPY --from=builder /out/ .
FROM diamol/dotnet-aspnet
ENV RngApi:Url=http://numbers-api/rng
CMD dotnet Utilities.HttpCheck.dll -c RngApi:Url -t 900 && \\
dotnet Numbers.Web.dll
WORKDIR /app
COPY --from=http-check-builder /out/ .
COPY --from=builder /out/ .
8.4 λ컀 μ»΄ν¬μ¦μ ν¬μ€ 체ν¬μ λνλμ μ²΄ν¬ μ μνκΈ°
- λ컀 μ»΄ν¬μ¦λ μ ν리μΌμ΄μ μ μνμ μ΄μμ΄ μκ²Όμ λ μ΄λ μ λ 볡μν μ μλ κΈ°λ₯μ΄ μλ€.
- κ·Έλ¬λ, λ컀 μ»΄ν¬μ¦λ μ΄μμ΄ μκΈ΄ 컨ν μ΄λλ₯Ό μλ‘μ΄ μ»¨ν μ΄λλ‘ κ΅μ²΄νμ§ μλλ€.
- μλ‘μ΄ μ»¨ν μ΄λλ‘ κ΅μ²΄ κ³Όμ μ€μ λ ν° μ₯μ κ° λ°μν μ μκΈ° λλ¬Έμ΄λ€.
- λ컀 μ»΄ν¬μ¦ νμΌμμλ ν¬μ€ 체ν¬μ μ΅μ μ λ μΈμΈνκ² μ€μ ν μ μλ€.
numbers-api:
image: diamol/ch08-numbers-api:v3
restart: on-failure
ports:
- "8080:80"
healthcheck:
test: ["CMD", "dotnet", "Utilites.HttpCheck.dll", "-t", "150"]
interval: 5s
timeout: 1s
retries: 2
start_period: 5s
networks:
- app-net
- test : ν¬μ€μ²΄ν¬λ₯Ό μν λͺ λ Ήμ΄.
- restart : 컨ν μ΄λ μ’ λ£μ μ¬μμ κ΄λ ¨ μ΅μ
$ docker comopse up -d
WARN[0000] networks.app-net: external.name is deprecated. Please set name and external: true
[+] Running 13/13
β numbers-web Pulled 6.1s
β 2c6f18abfee2 Pull complete 2.0s
β c8933103e3d5 Pull complete 2.2s
β fae779850b6e Pull complete 2.8s
β numbers-api Pulled 4.9s
β f338bc35613f Already exists 0.0s
β 5636d912c69e Already exists 0.0s
β 362df8b85fca Already exists 0.0s
β 24c3992ceef4 Already exists 0.0s
β 546a81dfea0f Already exists 0.0s
β a1d31c83c9fb Pull complete 1.1s
β b4b21f2c15f2 Pull complete 1.6s
β 5b2370cbc2a2 Pull complete 1.6s
[+] Running 2/2
β Container numbers-numbers-api-1 Started 0.3s
β Container numbers-numbers-web-1 Started
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a27d8181cf94 diamol/ch08-numbers-web:v3 "/bin/sh -c 'dotnet …" 7 seconds ago Up Less than a second (health: starting) 0.0.0.0:8088->80/tcp, [::]:8088->80/tcp numbers-numbers-web-1
25079f8a8819 diamol/ch08-numbers-api:v3 "dotnet Numbers.Api.…" 7 seconds ago Up 6 seconds (healthy) 0.0.0.0:8087->80/tcp, [::]:8087->80/tcp numbers-numbers-api-1
26e8b5893314 diamol/ch08-numbers-web "dotnet /app/Numbers…" 47 minutes ago Up 47 minutes 0.0.0.0:8082->80/tcp, [::]:8082->80/tcp infallible_maxwell
$ docker logs numbers-numbers-web-1
HTTPCheck: status OK, url <http://numbers-api/rng>, took 5098ms
HTTPCheck: status OK, url <http://numbers-api/rng>, took 39ms
...
8.5 ν¬μ€ 체ν¬μ λνλμ 체ν¬λ‘ 볡μλ ₯μλ μ ν리μΌμ΄μ μ λ§λ€ μ μλ μ΄μ
- dependency μ healthcheck λ₯Ό μ¬μ©νλ©΄, νλ«νΌμ΄ μ€ν μμλ₯Ό 보μ₯νκ² ν νμκ° μλ€.
- μμ‘΄κ΄κ³λ₯Ό λ§μ‘±νμ§ λͺ»ν μνμ κ²½μ° μ€μ μ λ°λΌ μ¬μ€νλκ±°λ λ€λ₯Έ 컨ν μ΄λλ‘ κ΅μ²΄λ κ²μ΄λ€.
- μκ° μ볡μ΄λ μΌμμ μΈ μ€λ₯λ₯Ό νλ«νΌμ΄ ν΄μν΄μ£Όλ κ²μ΄λ€.
dependency μ healthcheck μ¬μ©μλ μ£Όμμ .
- healthcheckλ μ£ΌκΈ°μ μΌλ‘ μμ£Ό μ€νλλ―λ‘, μμ€ν μ λΆνλ₯Ό μ£Όλ λ΄μ©μ΄μ΄μλ μλλ€.
- μ ν리μΌμ΄μ μ΄ μ€μ§μ μΌλ‘ λμμ€μΈμ§ κ²μ¦ν μ μλ ν΅μ¬μ μΈ λΆλΆλ§μ ν μ€νΈ ν΄μΌ λλ€.
- dependency λ μ ν리μΌμ΄μ μμ μμλ§ μ€νλλ€.
- λ°λΌμ, ν μ€νΈμ μλͺ¨λλ 리μμ€λ ν¬κ² μ§μ₯μ΄ μμ§λ§, ν μ€νΈ λμμ΄ λΉ μ§μλλ‘ ν΄μΌνλ€.
- λνλμ 체ν¬μ λλ½λ μμ‘΄ κ΄κ³λ μ ν리μΌμ΄μ μ₯μ κ° λ μ μλ€.
Toss Tech ν¬μ€μ²΄ν¬ μ₯μ κ΄λ ¨ κΈ
Spring Boot Actuatorμ ν¬μ€μ²΄ν¬ μ΄ν΄λ³΄κΈ°
8.6 μ°μ΅λ¬Έμ
- Dockerfile μ dependency check μ health check λ₯Ό μΆκ°ν΄λΌ.
Base Dockerfile
FROM diamol/node
ENV MAX_ALLOCATION_MB=4096 \\
LOOP_ALLOCATION_MB=512 \\
LOOP_INTERVAL_MS=2000
CMD ["node", "memory-hog.js"]
WORKDIR /app
COPY src/ .
Solution Dockerfile
FROM diamol/node
ENV MAX_ALLOCATION_MB=4096 \\
LOOP_ALLOCATION_MB=512 \\
LOOP_INTERVAL_MS=2000
CMD node memory-check.js && \\
node memory-hog.js
HEALTHCHECK --interval=5s \\
CMD node memory-check.js
WORKDIR /app
COPY src/ .
728x90
λ°μν