ν™”. 8μ›” 12th, 2025

G: μ•ˆλ…•ν•˜μ„Έμš”! 🐳 ν˜„λŒ€ 개발/운영 ν™˜κ²½μ—μ„œ DockerλŠ” 이제 선택이 μ•„λ‹Œ ν•„μˆ˜κ°€ λ˜μ–΄κ°€κ³  있죠. μ»¨ν…Œμ΄λ„ˆ 기술의 핡심인 Dockerλ₯Ό 톡해 μš°λ¦¬λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 더 λΉ λ₯΄κ³  효율적으둜 λ°°ν¬ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 처음 μ ‘ν•˜λŠ” 뢄듀은 μˆ˜λ§Žμ€ λͺ…령어와 μ˜΅μ…˜λ“€ λ•Œλ¬Έμ— ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμ–΄μš”.

이 글은 그런 μ—¬λŸ¬λΆ„λ“€μ„ μœ„ν•΄ μ€€λΉ„ν–ˆμŠ΅λ‹ˆλ‹€! μ‹€λ¬΄μ—μ„œ λ°”λ‘œ μ“Έ 수 μžˆλŠ” 핡심 Docker λͺ…령어와 자주 μ‚¬μš©λ˜λŠ” μ˜΅μ…˜λ“€μ„ ν•œλˆˆμ— νŒŒμ•…ν•  수 μžˆλ„λ‘ μΉ˜νŠΈμ‹œνŠΈ ν˜•μ‹μœΌλ‘œ μ •λ¦¬ν•˜κ³ , ν’λΆ€ν•œ μ˜ˆμ‹œμ™€ ν•¨κ»˜ μ„€λͺ…ν•΄ λ“œλ¦΄κ²Œμš”. 이 κΈ€ ν•˜λ‚˜λ©΄ μ—¬λŸ¬λΆ„λ„ Docker κ³ μˆ˜κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€! ✨


πŸ’‘ Docker 핡심 κ°œλ… 짚고 κ°€κΈ°

본격적인 λͺ…λ Ήμ–΄ μ„€λͺ…에 μ•žμ„œ, Dockerλ₯Ό μ΄ν•΄ν•˜λŠ” 데 κΌ­ ν•„μš”ν•œ λͺ‡ κ°€μ§€ 핡심 κ°œλ…μ„ 짧게 짚고 λ„˜μ–΄κ°ˆκ²Œμš”. 이 κ°œλ…λ“€μ„ μ•Œκ³  λ‚˜λ©΄ λͺ…령어듀이 훨씬 더 λͺ…ν™•ν•˜κ²Œ λ‹€κ°€μ˜¬ κ±°μ˜ˆμš”.

  • 이미지 (Image): μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 읽기 μ „μš© ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜, 라이브러리, ν™˜κ²½ μ„€μ • λ“± λͺ¨λ“  것이 ν¬ν•¨λœ μΌμ’…μ˜ ‘청사진’ λ˜λŠ” ‘λΆ•μ–΄λΉ΅ ν‹€’이라고 μƒκ°ν•˜μ‹œλ©΄ λΌμš”. πŸ“¦
  • μ»¨ν…Œμ΄λ„ˆ (Container): μ΄λ―Έμ§€μ˜ μ‹€ν–‰ κ°€λŠ₯ν•œ μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€. 이미지λ₯Ό λ°”νƒ•μœΌλ‘œ λ…λ¦½λœ ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ κ²©λ¦¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ” 곡간이죠. ‘λΆ•μ–΄λΉ΅ ν‹€’둜 λ§Œλ“€μ–΄μ§„ μ‹€μ œ ‘λΆ•μ–΄λΉ΅’에 λΉ„μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŸ°νƒ€μž„ ν™˜κ²½μ΄λΌκ³  λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€. πŸƒβ€β™€οΈ
  • λ ˆμ§€μŠ€νŠΈλ¦¬ (Registry): Docker 이미지λ₯Ό μ €μž₯ν•˜κ³  κ³΅μœ ν•˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€. κ°€μž₯ 유λͺ…ν•œ 것이 λ°”λ‘œ Docker Hub이며, λΉ„κ³΅κ°œ 이미지λ₯Ό μœ„ν•œ 프라이빗 λ ˆμ§€μŠ€νŠΈλ¦¬λ„ μ‘΄μž¬ν•©λ‹ˆλ‹€. πŸ’Ύ
  • λ³Όλ₯¨ (Volume): μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜μ–΄λ„ 데이터가 사라지지 μ•Šκ³  영ꡬ적으둜 μ €μž₯될 수 μžˆλ„λ‘ μ»¨ν…Œμ΄λ„ˆ 외뢀에 데이터λ₯Ό μ—°κ²°ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆμ˜ νœ˜λ°œμ„± 문제λ₯Ό ν•΄κ²°ν•΄ μ€λ‹ˆλ‹€. πŸ—„οΈ
  • λ„€νŠΈμ›Œν¬ (Network): μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ“€μ΄ μ„œλ‘œ ν†΅μ‹ ν•˜κ±°λ‚˜, μ»¨ν…Œμ΄λ„ˆκ°€ 외뢀와 톡신할 수 μžˆλ„λ‘ μ—°κ²°ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. πŸ”—

πŸš€ Docker λͺ…λ Ήμ–΄ μΉ˜νŠΈμ‹œνŠΈ & 핡심 μ˜΅μ…˜

자, 이제 μ‹€μ „μž…λ‹ˆλ‹€! κ°€μž₯ 자주 μ‚¬μš©ν•˜κ³  μ€‘μš”ν•œ λͺ…령어듀을 μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ λ‚˜λˆ„μ–΄ μžμ„Ένžˆ μ‚΄νŽ΄λ³Όκ²Œμš”.

I. μ»¨ν…Œμ΄λ„ˆ κΈ°λ³Έ 라이프사이클 πŸ”„

μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ³ , μ‹€ν–‰ν•˜κ³ , μ€‘μ§€ν•˜κ³ , μ‚­μ œν•˜λŠ” κ°€μž₯ 기본적인 λͺ…λ Ήμ–΄λ“€μž…λ‹ˆλ‹€.

  1. docker run: μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€. Docker의 꽃이라고 ν•  수 있죠! 🌹

    docker run [μ˜΅μ…˜] <이미지 이름>[:νƒœκ·Έ] [μ‹€ν–‰ν•  λͺ…λ Ήμ–΄]
    • 핡심 μ˜΅μ…˜:

      • -d (or --detach): λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. 터미널을 μ μœ ν•˜μ§€ μ•Šμ•„ 맀우 μœ μš©ν•©λ‹ˆλ‹€.
      • -p <호슀트포트>:<μ»¨ν…Œμ΄λ„ˆν¬νŠΈ> (or --publish): ν˜ΈμŠ€νŠΈμ™€ μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 포트 맀핑을 μ„€μ •ν•©λ‹ˆλ‹€. 외뢀에 μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•  λ•Œ ν•„μˆ˜μž…λ‹ˆλ‹€.
      • --name <μ»¨ν…Œμ΄λ„ˆμ΄λ¦„>: μ»¨ν…Œμ΄λ„ˆμ— μ•Œμ•„λ³΄κΈ° μ‰¬μš΄ 이름을 λΆ€μ—¬ν•©λ‹ˆλ‹€. 이름을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ Dockerκ°€ μž„μ˜μ˜ 이름을 μƒμ„±ν•©λ‹ˆλ‹€.
      • --rm: μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ μ‹œ μžλ™μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€. μΌνšŒμ„± ν…ŒμŠ€νŠΈ μš©λ„μ— μ ν•©ν•©λ‹ˆλ‹€.
      • -it (or --interactive --tty): μ»¨ν…Œμ΄λ„ˆμ™€ μƒν˜Έμž‘μš© κ°€λŠ₯ν•œ 터미널을 μ—°κ²°ν•©λ‹ˆλ‹€. 보톡 μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‘œ μ§„μž…ν•˜κ±°λ‚˜, νŠΉμ • λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
      • -v <호슀트경둜>:<μ»¨ν…Œμ΄λ„ˆκ²½λ‘œ> (or --volume): 호슀트의 λ””λ ‰ν† λ¦¬λ‚˜ λ³Όλ₯¨μ„ μ»¨ν…Œμ΄λ„ˆμ— λ§ˆμš΄νŠΈν•©λ‹ˆλ‹€. 데이터 지속성을 μœ„ν•΄ ν•„μˆ˜μž…λ‹ˆλ‹€.
      • -e <ν™˜κ²½λ³€μˆ˜λͺ…>=<κ°’> (or --env): μ»¨ν…Œμ΄λ„ˆ 내뢀에 ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ λΉ„λ°€λ²ˆν˜Έ λ“± 민감 정보λ₯Ό μ„€μ •ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      • Nginx μ›Ή μ„œλ²„λ₯Ό λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•˜κ³  80번 포트λ₯Ό 호슀트의 8080번 ν¬νŠΈμ— μ—°κ²°ν•˜λ©°, 이름을 my-nginx둜 μ§€μ •:
        docker run -d -p 8080:80 --name my-nginx nginx:latest

        ➑️ 이제 μ›Ή λΈŒλΌμš°μ €μ—μ„œ http://localhost:8080으둜 μ ‘μ†ν•˜λ©΄ Nginx κΈ°λ³Έ νŽ˜μ΄μ§€λ₯Ό λ³Ό 수 μžˆμ–΄μš”! 🌐

      • MySQL λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λ©° root λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•˜κ³ , 데이터λ₯Ό my-mysql-dataλΌλŠ” λ³Όλ₯¨μ— μ €μž₯:
        docker run -d -p 3306:3306 --name my-mysql \
        -e MYSQL_ROOT_PASSWORD=mysecretpassword \
        -v my-mysql-data:/var/lib/mysql \
        mysql:8.0

        ➑️ λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μ‹œ ν™˜κ²½ λ³€μˆ˜ μ„€μ •κ³Ό λ³Όλ₯¨ λ§ˆμš΄νŠΈκ°€ ν•„μˆ˜μ μž…λ‹ˆλ‹€! πŸ”‘

      • Ubuntu μ»¨ν…Œμ΄λ„ˆλ₯Ό λŒ€ν™”ν˜•μœΌλ‘œ μ‹€ν–‰ν•˜κ³  λ°”λ‘œ bash μ…Έλ‘œ μ§„μž…:
        docker run -it ubuntu:latest bash

        ➑️ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ 자유둭게 λͺ…λ Ήμ–΄(ls, pwd λ“±)λ₯Ό μ‹€ν–‰ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. exit둜 λΉ μ Έλ‚˜μ˜¬ 수 μžˆμ–΄μš”. πŸ’»

  2. docker ps: ν˜„μž¬ μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

    docker ps [μ˜΅μ…˜]
    • 핡심 μ˜΅μ…˜:

      • -a (or --all): μ‹€ν–‰ μ€‘μ΄κ±°λ‚˜ μ€‘μ§€λœ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.
      • -q (or --quiet): μ»¨ν…Œμ΄λ„ˆ ID만 λ³΄μ—¬μ€λ‹ˆλ‹€. λ‹€λ₯Έ λͺ…령어와 μ‘°ν•©ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      • μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ 보기:
        docker ps
      • λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ (μ‹€ν–‰ 쀑 + 쀑지됨) 보기:
        docker ps -a
      • λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆμ˜ ID만 보기:
        docker ps -aq

        ➑️ 이 ID듀은 docker stop, docker rm λ“± λ‹€λ₯Έ λͺ…령어와 ν•¨κ»˜ μ‚¬μš©λ  λ•Œ κ°•λ ₯ν•©λ‹ˆλ‹€! πŸ’ͺ

  3. docker start <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ€‘μ§€λœ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker start my-nginx
  4. docker stop <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ •μƒμ μœΌλ‘œ μ€‘μ§€ν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker stop my-nginx
  5. docker restart <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ€‘μ§€ν–ˆλ‹€κ°€ λ‹€μ‹œ μ‹œμž‘ν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker restart my-nginx
  6. docker rm <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ€‘μ§€λœ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • -f (or --force): μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆλ„ κ°•μ œλ‘œ μ‚­μ œν•©λ‹ˆλ‹€. (μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•˜μ„Έμš”!)
    • μ˜ˆμ‹œ:

      • my-nginx μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ:
        docker rm my-nginx
      • λͺ¨λ“  μ€‘μ§€λœ μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ (κΏ€νŒ!):
        docker rm $(docker ps -aq --filter "status=exited")

        ➑️ 이 λͺ…λ Ήμ–΄λŠ” exited μƒνƒœμ˜ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ IDλ₯Ό μ°Ύμ•„ ν•œλ²ˆμ— μ‚­μ œν•΄ μ€λ‹ˆλ‹€. πŸ—‘οΈ

II. 이미지 관리 πŸ–ΌοΈ

μ»¨ν…Œμ΄λ„ˆμ˜ 기반이 λ˜λŠ” 이미지λ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ³ , λΉŒλ“œν•˜κ³ , κ΄€λ¦¬ν•˜λŠ” λͺ…λ Ήμ–΄λ“€μž…λ‹ˆλ‹€.

  1. docker pull <이미지 이름>[:νƒœκ·Έ]: Docker Hub λ“± λ ˆμ§€μŠ€νŠΈλ¦¬μ—μ„œ 이미지λ₯Ό λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker pull ubuntu:22.04
      docker pull nginx

      ➑️ :latest νƒœκ·ΈλŠ” 기본값이라 μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€. ⬇️

  2. docker build -t <이미지이름>[:νƒœκ·Έ] <Dockerfile 경둜>: Dockerfile을 μ΄μš©ν•΄ μ‚¬μš©μž μ •μ˜ 이미지λ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • -t <이미지이름>[:νƒœκ·Έ> (or --tag): λΉŒλ“œλœ 이미지에 이름과 νƒœκ·Έλ₯Ό λΆ€μ—¬ν•©λ‹ˆλ‹€.
      • .: Dockerfile이 ν˜„μž¬ 디렉토리에 μžˆμ„ λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. (Context path)
    • μ˜ˆμ‹œ (Dockerfile μ˜ˆμ‹œμ™€ ν•¨κ»˜):

      • Dockerfile λ‚΄μš©:
        # Dockerfile
        FROM alpine:latest
        RUN apk add --no-cache curl
        CMD ["curl", "https://www.google.com"]
      • 이미지 λΉŒλ“œ:
        docker build -t my-curl-app:1.0 .

        ➑️ 이 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ my-curl-app:1.0μ΄λΌλŠ” 이미지가 μƒμ„±λ©λ‹ˆλ‹€. 이제 이 μ΄λ―Έμ§€λ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  수 μžˆμ–΄μš”! πŸ› οΈ

  3. docker images: λ‘œμ»¬μ— μ €μž₯된 이미지 λͺ©λ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • -a (or --all): λΉŒλ“œ 쀑간에 μƒμ„±λœ λ ˆμ΄μ–΄ μ΄λ―Έμ§€κΉŒμ§€ λͺ¨λ‘ λ³΄μ—¬μ€λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      docker images
  4. docker rmi <이미지ID λ˜λŠ” 이름>[:νƒœκ·Έ]: λ‘œμ»¬μ— μ €μž₯된 이미지λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • -f (or --force): ν•΄λ‹Ή 이미지λ₯Ό μ‚¬μš©ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μžˆμ–΄λ„ κ°•μ œλ‘œ μ‚­μ œν•©λ‹ˆλ‹€. (주의)
    • μ˜ˆμ‹œ:

      docker rmi my-curl-app:1.0

      ➑️ μ‚¬μš© 쀑인 μ΄λ―Έμ§€λŠ” μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ΄€λ ¨ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ¨Όμ € μ‚­μ œν•΄μ•Ό ν•©λ‹ˆλ‹€. ❌

III. μ»¨ν…Œμ΄λ„ˆ 정보 확인 및 μ§„μž… πŸ”

μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆμ˜ 둜그λ₯Ό ν™•μΈν•˜κ±°λ‚˜, μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‘œ μ§„μž…ν•˜μ—¬ λ””λ²„κΉ…ν•˜λŠ” 데 μœ μš©ν•œ λͺ…λ Ήμ–΄λ“€μž…λ‹ˆλ‹€.

  1. docker logs <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ»¨ν…Œμ΄λ„ˆμ˜ ν‘œμ€€ 좜λ ₯(STDOUT) 및 ν‘œμ€€ μ—λŸ¬(STDERR) 둜그λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. 디버깅에 ν•„μˆ˜μ μž…λ‹ˆλ‹€. πŸ“œ

    • 핡심 μ˜΅μ…˜:

      • -f (or --follow): μ‹€μ‹œκ°„μœΌλ‘œ 둜그λ₯Ό κ³„μ†ν•΄μ„œ λ³΄μ—¬μ€λ‹ˆλ‹€. (Ctrl+C둜 μ’…λ£Œ)
      • --tail <숫자>: 둜그의 λ§ˆμ§€λ§‰ 숫자 μ€„λ§Œ λ³΄μ—¬μ€λ‹ˆλ‹€.
      • -t (or --timestamps): λ‘œκ·Έμ— νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      docker logs my-nginx
      docker logs -f my-nginx
      docker logs --tail 100 my-nginx
  2. docker exec -it <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름> <λͺ…λ Ήμ–΄>: μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ μ…Έλ‘œ μ§„μž…ν•  λ•Œ 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€. πŸ’»

    • 핡심 μ˜΅μ…˜:

      • -it: μƒν˜Έμž‘μš© κ°€λŠ₯ν•œ 터미널 μ—°κ²° (ν•„μˆ˜!)
    • μ˜ˆμ‹œ:

      • my-nginx μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ ls -l /etc/nginx λͺ…λ Ήμ–΄ μ‹€ν–‰:
        docker exec -it my-nginx ls -l /etc/nginx
      • my-nginx μ»¨ν…Œμ΄λ„ˆμ˜ bash μ…Έλ‘œ μ§„μž…:
        docker exec -it my-nginx bash

        ➑️ μ»¨ν…Œμ΄λ„ˆ 내뢀에 bash 셸이 μ—†μœΌλ©΄ sh λ˜λŠ” λ‹€λ₯Έ 셸을 μ‹œλ„ν•΄ λ³΄μ„Έμš”. (docker exec -it my-nginx sh)

  3. docker inspect <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름> / docker inspect <이미지ID λ˜λŠ” 이름>: μ»¨ν…Œμ΄λ„ˆλ‚˜ μ΄λ―Έμ§€μ˜ 상세 정보λ₯Ό JSON ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ μ„€μ •, λ³Όλ₯¨ 마운트, ν™˜κ²½ λ³€μˆ˜ λ“± λͺ¨λ“  정보λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. πŸ”¬

    • 핡심 μ˜΅μ…˜:

      • --format "{{.NetworkSettings.IPAddress}}": νŠΉμ • ν•„λ“œλ§Œ μΆ”μΆœν•˜μ—¬ 보기 μ‰½κ²Œ ν¬λ§·νŒ…ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      • my-nginx μ»¨ν…Œμ΄λ„ˆμ˜ λͺ¨λ“  정보 확인:
        docker inspect my-nginx
      • my-nginx μ»¨ν…Œμ΄λ„ˆμ˜ IP μ£Όμ†Œλ§Œ 확인:
        docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx
  4. docker stats <μ»¨ν…Œμ΄λ„ˆID λ˜λŠ” 이름>: μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆμ˜ CPU, λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬ μ‚¬μš©λŸ‰ 등을 μ‹€μ‹œκ°„μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€. πŸ“ˆ

    • μ˜ˆμ‹œ:
      docker stats
      docker stats my-nginx

IV. λ³Όλ₯¨ 관리 πŸ’Ύ

μ»¨ν…Œμ΄λ„ˆμ˜ 데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λͺ…λ Ήμ–΄λ“€μž…λ‹ˆλ‹€.

  1. docker volume create <λ³Όλ₯¨μ΄λ¦„>: μƒˆλ‘œμš΄ λ³Όλ₯¨μ„ μƒμ„±ν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker volume create my-app-data
  2. docker volume ls: μƒμ„±λœ λ³Όλ₯¨ λͺ©λ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker volume ls
  3. docker volume inspect <λ³Όλ₯¨μ΄λ¦„>: νŠΉμ • λ³Όλ₯¨μ˜ 상세 정보λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. μ‹€μ œ μ €μž₯ 경둜 등을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker volume inspect my-app-data
  4. docker volume rm <λ³Όλ₯¨μ΄λ¦„>: λ³Όλ₯¨μ„ μ‚­μ œν•©λ‹ˆλ‹€. λ³Όλ₯¨ λ‚΄μ˜ λͺ¨λ“  데이터가 μ‚­μ œλ˜λ―€λ‘œ μ£Όμ˜ν•˜μ„Έμš”. ⚠️

    • μ˜ˆμ‹œ:
      docker volume rm my-app-data

      ➑️ μ‚¬μš© 쀑인 λ³Όλ₯¨μ€ μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ¨Όμ € ν•΄λ‹Ή λ³Όλ₯¨μ„ μ‚¬μš©ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•΄μ•Ό ν•©λ‹ˆλ‹€.

V. λ„€νŠΈμ›Œν¬ 관리 🌐

μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 톡신, λ˜λŠ” μ»¨ν…Œμ΄λ„ˆμ™€ μ™ΈλΆ€μ˜ 톡신 방식을 κ΄€λ¦¬ν•˜λŠ” λͺ…λ Ήμ–΄λ“€μž…λ‹ˆλ‹€.

  1. docker network create <λ„€νŠΈμ›Œν¬μ΄λ¦„>: μ‚¬μš©μž μ •μ˜ λ„€νŠΈμ›Œν¬λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 같은 λ„€νŠΈμ›Œν¬μ— μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ“€μ€ μ»¨ν…Œμ΄λ„ˆ μ΄λ¦„μœΌλ‘œ μ„œλ‘œ 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€. 🀝

    • κΈ°λ³Έ λ“œλΌμ΄λ²„: bridge (κ°€μž₯ 일반적), host, none 등이 μžˆμŠ΅λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:

      docker network create my-custom-network
      • μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μ‹œ λ„€νŠΈμ›Œν¬ μ§€μ •:
        docker run -d --name web --network my-custom-network nginx
        docker run -d --name db --network my-custom-network mysql

        ➑️ 이제 web μ»¨ν…Œμ΄λ„ˆμ—μ„œ dbλΌλŠ” μ΄λ¦„μœΌλ‘œ MySQL μ»¨ν…Œμ΄λ„ˆμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  2. docker network ls: ν˜„μž¬ μ‹œμŠ€ν…œμ— μ‘΄μž¬ν•˜λŠ” λ„€νŠΈμ›Œν¬ λͺ©λ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker network ls
  3. docker network inspect <λ„€νŠΈμ›Œν¬μ΄λ¦„>: νŠΉμ • λ„€νŠΈμ›Œν¬μ˜ 상세 정보λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. μ—°κ²°λœ μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 등을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker network inspect my-custom-network
  4. docker network rm <λ„€νŠΈμ›Œν¬μ΄λ¦„>: λ„€νŠΈμ›Œν¬λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker network rm my-custom-network

VI. μ‹œμŠ€ν…œ 정리 🧹

μ˜€λž«λ™μ•ˆ Dockerλ₯Ό μ‚¬μš©ν•˜λ‹€ 보면 λΆˆν•„μš”ν•œ 이미지, μ»¨ν…Œμ΄λ„ˆ, λ³Όλ₯¨ 등이 μŒ“μ—¬ λ””μŠ€ν¬ 곡간을 μ°¨μ§€ν•˜κ²Œ λ©λ‹ˆλ‹€. 이듀을 효율적으둜 μ •λ¦¬ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

  1. docker system prune: μ‚¬μš©λ˜μ§€ μ•ŠλŠ”(dangling) μ»¨ν…Œμ΄λ„ˆ, 이미지, λ„€νŠΈμ›Œν¬ 등을 ν•œ λ²ˆμ— μ‚­μ œν•˜μ—¬ λ””μŠ€ν¬ 곡간을 ν™•λ³΄ν•©λ‹ˆλ‹€. ♻️

    • 핡심 μ˜΅μ…˜:

      • -a (or --all): μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λͺ¨λ“  이미지 (dangling이 μ•„λ‹Œ 이미지 포함)λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
      • --volumes: μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ³Όλ₯¨κΉŒμ§€ ν•¨κ»˜ μ‚­μ œν•©λ‹ˆλ‹€. (이 μ˜΅μ…˜μ€ 데이터λ₯Ό μ‚­μ œν•˜λ―€λ‘œ μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€!)
    • μ˜ˆμ‹œ:

      • κΈ°λ³Έ 정리 (dangling μ»¨ν…Œμ΄λ„ˆ, 이미지, λ„€νŠΈμ›Œν¬):
        docker system prune
      • λ³Όλ₯¨κΉŒμ§€ ν¬ν•¨ν•˜μ—¬ 전체 정리:
        docker system prune --volumes

        ➑️ 주기적으둜 μ‹€ν–‰ν•˜μ—¬ λΆˆν•„μš”ν•œ μžμ›μ„ μ •λ¦¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. ✨

VII. Docker Compose (μ‹€λ¬΄μ˜ 꽃) πŸ’

단일 μ»¨ν…Œμ΄λ„ˆκ°€ μ•„λ‹Œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(예: μ›Ή μ„œλ²„ + λ°μ΄ν„°λ² μ΄μŠ€ + Redis)을 관리할 λ•Œ docker-compose.yml νŒŒμΌμ„ 톡해 ν•œ λ²ˆμ— μ •μ˜ν•˜κ³  μ‹€ν–‰ν•  수 μžˆλ„λ‘ λ•λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. μ‹€λ¬΄μ—μ„œ λŒ€λΆ€λΆ„μ˜ 볡합 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ Composeλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΄€λ¦¬λ©λ‹ˆλ‹€.

  1. docker-compose up: docker-compose.yml νŒŒμΌμ— μ •μ˜λœ μ„œλΉ„μŠ€λ“€μ„ λΉŒλ“œν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • -d: λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€.
      • --build: 이미지 λ³€κ²½ 사항이 μžˆμ„ 경우 λ‹€μ‹œ λΉŒλ“œν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ:

      • docker-compose.yml μ˜ˆμ‹œ:

        # docker-compose.yml
        version: '3.8'
        services:
          web:
            image: nginx:latest
            ports:
              - "80:80"
            volumes:
              - ./nginx.conf:/etc/nginx/nginx.conf
          db:
            image: mysql:8.0
            environment:
              MYSQL_ROOT_PASSWORD: mysecretpassword
            volumes:
              - db_data:/var/lib/mysql
        
        volumes:
          db_data:
      • docker-compose.yml 파일이 μžˆλŠ” λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν–‰:
        docker-compose up -d

        ➑️ ν•œ 번의 λͺ…λ Ήμ–΄λ‘œ μ›Ή μ„œλ²„μ™€ λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆκ°€ λ™μ‹œμ— μ‹€ν–‰λ©λ‹ˆλ‹€! πŸš€

  2. docker-compose down: docker-compose.yml νŒŒμΌμ— μ •μ˜λœ μ„œλΉ„μŠ€λ“€μ„ μ€‘μ§€ν•˜κ³  μ‚­μ œν•©λ‹ˆλ‹€. μ—°κ²°λœ λ„€νŠΈμ›Œν¬λ„ ν•¨κ»˜ μ‚­μ œλ©λ‹ˆλ‹€.

    • 핡심 μ˜΅μ…˜:

      • --volumes: μ„œλΉ„μŠ€μ™€ κ΄€λ ¨λœ λ³Όλ₯¨κΉŒμ§€ ν•¨κ»˜ μ‚­μ œν•©λ‹ˆλ‹€. (데이터 μ‚­μ œμ— 주의!)
    • μ˜ˆμ‹œ:

      docker-compose down
      docker-compose down --volumes # λ³Όλ₯¨κΉŒμ§€ μ‚­μ œ
  3. docker-compose ps: docker-compose.yml νŒŒμΌμ— μ •μ˜λœ μ„œλΉ„μŠ€λ“€μ˜ μƒνƒœλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

    • μ˜ˆμ‹œ:
      docker-compose ps

✨ 핡심 μ˜΅μ…˜ ν•œλˆˆμ— 보기 (μš”μ•½)

μœ„μ—μ„œ μ„€λͺ…λœ μ£Όμš” μ˜΅μ…˜λ“€μ„ λ‹€μ‹œ ν•œλ²ˆ λΉ λ₯΄κ²Œ μš”μ•½ν•΄ λ³ΌκΉŒμš”?

  • -d, --detach: λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰ (μ»¨ν…Œμ΄λ„ˆ)
  • -p, --publish: 포트 λ§€ν•‘ (호슀트:μ»¨ν…Œμ΄λ„ˆ)
  • -v, --volume: λ³Όλ₯¨/디렉토리 마운트 (호슀트경둜:μ»¨ν…Œμ΄λ„ˆκ²½λ‘œ)
  • --name: μ»¨ν…Œμ΄λ„ˆ 이름 μ§€μ •
  • --rm: μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ μ‹œ μžλ™ μ‚­μ œ
  • -it, --interactive --tty: μƒν˜Έμž‘μš© κ°€λŠ₯ν•œ 터미널 μ—°κ²°
  • -e, --env: ν™˜κ²½ λ³€μˆ˜ μ„€μ •
  • --network: μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  λ„€νŠΈμ›Œν¬ μ§€μ •
  • -f, --force: κ°•μ œ μ‹€ν–‰/μ‚­μ œ

πŸ’‘ μ‹€λ¬΄μ—μ„œ μœ μš©ν•œ 팁 & λ…Έν•˜μš°

여기에 λͺ‡ κ°€μ§€ 싀무 νŒμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

  1. 별칭 (Alias) μ„€μ •: 자주 μ“°λŠ” λͺ…λ Ήμ–΄λŠ” .bashrcλ‚˜ .zshrc νŒŒμΌμ— λ³„μΉ­μœΌλ‘œ 등둝해두면 νŽΈλ¦¬ν•©λ‹ˆλ‹€.

    # ~/.bashrc λ˜λŠ” ~/.zshrc 에 μΆ”κ°€
    alias dps='docker ps -a'
    alias dlog='docker logs -f'
    alias drma='docker rm $(docker ps -aq)' # λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
    alias dprune='docker system prune -f --volumes' # κ°•λ ₯ν•œ 정리

    ➑️ 터미널을 λ‹€μ‹œ μ‹œμž‘ν•˜κ±°λ‚˜ source ~/.bashrc λ“±μœΌλ‘œ μ μš©ν•˜λ©΄ dps처럼 짧게 μ‚¬μš©ν•  수 μžˆμ–΄μš”!

  2. λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ ν•œ λ²ˆμ— 쀑지/μ‚­μ œ:

    docker stop $(docker ps -aq)  # λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 쀑지
    docker rm $(docker ps -aq)    # λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ (μ€‘μ§€λœ μƒνƒœμ—¬μ•Ό 함)

    ➑️ κ°•λ ₯ν•˜μ§€λ§Œ μ‹€μˆ˜ν•˜λ©΄ μ•ˆ λ˜λ‹ˆ 주의! 🚨

  3. 둜그 ν™•μΈμ˜ μ€‘μš”μ„±: μ»¨ν…Œμ΄λ„ˆκ°€ μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” 항상 docker logs <μ»¨ν…Œμ΄λ„ˆμ΄λ¦„>으둜 둜그λ₯Ό λ¨Όμ € ν™•μΈν•˜μ„Έμš”. λŒ€λΆ€λΆ„μ˜ λ¬Έμ œλŠ” λ‘œκ·Έμ— λ‹¨μ„œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

  4. docker inspect ν™œμš©: μ»¨ν…Œμ΄λ„ˆμ˜ λ„€νŠΈμ›Œν¬ μ„€μ •, 마운트된 λ³Όλ₯¨ 경둜 λ“± 상세 정보λ₯Ό μ•Œκ³  싢을 λ•Œ docker inspectλŠ” 맀우 κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. νŠΉμ • ν•„λ“œλ§Œ λ½‘μ•„λ‚΄λŠ” --format μ˜΅μ…˜μ„ 잘 ν™œμš©ν•˜μ„Έμš”.

  5. .dockerignore 파일: Dockerfile을 λΉŒλ“œν•  λ•Œ μ»¨ν…Œμ΄λ„ˆμ— λΆˆν•„μš”ν•œ 파일(예: .git, node_modules, *.log)듀이 ν¬ν•¨λ˜μ§€ μ•Šλ„λ‘ .dockerignore νŒŒμΌμ„ ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— μƒμ„±ν•˜μ—¬ κ΄€λ¦¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 이미지 크기λ₯Ό 쀄이고 λΉŒλ“œ 속도λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

  6. Multi-stage builds: ν”„λ‘œλ•μ…˜ 이미지λ₯Ό 더 μž‘κ³  μ•ˆμ „ν•˜κ²Œ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ Dockerfileμ—μ„œ λ©€ν‹° μŠ€ν…Œμ΄μ§€ λΉŒλ“œ(multi-stage builds)λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄μ„Έμš”. λΉŒλ“œμ— ν•„μš”ν•œ 도ꡬ듀을 μ΅œμ’… 이미지에 ν¬ν•¨μ‹œν‚€μ§€ μ•Šμ•„ 이미지 크기λ₯Ό λŒ€ν­ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ₯³ λ§ˆλ¬΄λ¦¬ν•˜λ©°

이 μΉ˜νŠΈμ‹œνŠΈκ°€ μ—¬λŸ¬λΆ„μ˜ Docker ν™œμš©μ— 큰 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€! DockerλŠ” μ²˜μŒμ—λŠ” μ–΄λ ΅κ²Œ 느껴질 수 μžˆμ§€λ§Œ, λͺ‡ κ°€μ§€ 핡심 λͺ…령어와 κ°œλ…λ§Œ 잘 μ΅ν˜€λ‘λ©΄ 개발 및 배포 μ›Œν¬ν”Œλ‘œμš°λ₯Ό ν˜μ‹ μ μœΌλ‘œ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

자주 μ‚¬μš©ν•΄λ³΄λ©΄μ„œ 손에 μ΅νžˆλŠ” 것이 κ°€μž₯ μ€‘μš”ν•©λ‹ˆλ‹€. 이 글을 즐겨찾기에 좔가해두고 ν•„μš”ν•  λ•Œλ§ˆλ‹€ κΊΌλ‚΄ λ³΄μ„Έμš”. κΎΈμ€€νžˆ μ—°μŠ΅ν•˜λ‹€ 보면 μ–΄λŠμƒˆ Docker의 λ§ˆλ²•μ— ν‘Ή λΉ μ Έλ“€κ²Œ 될 κ±°μ˜ˆμš”! 🌟

κΆκΈˆν•œ μ μ΄λ‚˜ μΆ”κ°€ν•˜κ³  싢은 λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ–Έμ œλ“ μ§€ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”! Happy Dockering! πŸ³πŸ“š

λ‹΅κΈ€ 남기기

이메일 μ£Όμ†ŒλŠ” κ³΅κ°œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μˆ˜ ν•„λ“œλŠ” *둜 ν‘œμ‹œλ©λ‹ˆλ‹€