본문 바로가기
클라우드

🐳 Docker 이미지와 컨테이너 관리 개념 정리

by Mostlove 2025. 5. 14.
728x90
반응형

1. 📦 Docker 이미지 레이어 구조와 캐시 활용

  • docker pull nginx와 같이 이미지를 받을 때 여러 줄로 표시되는 이유는 이미지가 여러 Layer로 구성되어 있어서임.
  • 도커는 각 Layer를 캐시로 저장해 두었다가, 이후 같은 이미지나 유사한 이미지를 받을 경우 중복된 부분은 캐시에서 재사용하고, 업데이트된 부분만 새로 다운로드함.
    • ✅ 덕분에 이미지 업데이트가 훨씬 빠르게 처리됨.

2. 🧱 하나의 이미지 vs 여러 이미지로 구성

  • 예전처럼 rockylinux:8 이미지에 Apache, PHP, MySQL을 모두 설치해서 하나의 컨테이너로 실행할 수도 있지만,
  • 도커 철학은 ❗ “한 컨테이너는 하나의 역할만” 하도록 구성하는 것임.
    • 예: PHP는 php 이미지, MySQL은 mysql 이미지, 웹 서버는 nginx 이미지 등으로 각자 컨테이너에서 실행 → 이후 연결해서 사용
    • ✅ 이렇게 하면 유지보수, 배포, 확장성이 좋아짐.

3. 🌐 Nginx 컨테이너 포트와 IP 연결

  • docker run으로 Nginx 웹 서버를 실행하면 PORTS 80/tcp로 외부 접속이 가능.
  • 이때 컨테이너 자체는 독립적인 IP가 없기 때문에, 외부에서 접근하려면 아래와 같이 설정해야 함:
상황 설명
a) 외부에서 접속 Ubuntu 노드가 8080 포트를 열고, 이를 Nginx 컨테이너의 80포트로 포트 포워딩 (8080 → 80)
b) 내부 컨테이너 간 통신 같은 Ubuntu 노드에서 실행되는 다른 컨테이너에서도 Nginx 컨테이너로 접속 가능
  • 💡 만약 Nginx 컨테이너가 독립된 IP를 가진다면, 그 IP로도 직접 접속할 수 있음.

4. 🔐 환경 변수로 보안 유지

docker run -d --name wordpressdb \
-e MYSQL_ROOT_PASSWORD=rootoor \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
  • -e 옵션은 환경변수로 설정을 전달함.
    • MYSQL_ROOT_PASSWORD는 root 비밀번호
    • MYSQL_DATABASE는 생성할 DB 이름
  • 컨테이너는 기본적으로 영구 저장소가 없으므로, 환경변수로 비밀번호를 직접 주입함.
  • ✅ 이렇게 하면 데이터가 컨테이너에 남지 않기 때문에 보안에 유리함.
  • ❗ 단, 이 상태에서 docker commit 명령어로 이미지를 생성해 배포하면 root 비밀번호가 노출될 수 있으니 주의!

5. 🛠 Docker 이미지 생성 방법 4가지

방법 설명
1. docker pull hub.docker.com에서 이미지 직접 다운로드
2. docker commit 기존 컨테이너를 수정 후 새 이미지로 저장
3. Dockerfile 이미지 생성을 위한 스크립트 작성
4. docker tag 기존 이미지에 새로운 태그 붙이기 (버전 관리 용도)

💡 하나의 Nginx 이미지에 여러 포트를 매핑하여 여러 웹 사이트를 운영 가능 → round-robin 방식 사용 시 로드밸런싱 가능


6. 📡 컨테이너의 IP와 Kubernetes 연계

  • 도커 컨테이너는 보통 Class A(10.0.0.0) 또는 Class B(172.17.0.0)의 가상 IP 주소를 사용.
  • 이 IP로 직접 접속하려면 포트 매핑이 필요하며, 접속이 불안정할 수 있음.
  • 따라서 Kubernetes의 Service를 이용해 고정된 IP를 제공하고, 실제 컨테이너로 자동 연결되게 설정함.

✅ Kubernetes는 Auto-Scaling 기능을 제공하여, 컨테이너 장애 시 자동으로 대체 컨테이너를 생성함 → 안정성 향상


7. 💾 Docker Volume으로 데이터 유지

  • 컨테이너는 삭제되면 내부 데이터도 함께 사라지므로 데이터를 외부에 보관해야 함.
  • Volume을 이용하면 다음과 같은 방식으로 데이터를 공유 가능:
유형  설명
a) 노드 볼륨 Ubuntu 노드의 로컬 디스크와 공유
b) 컨테이너 볼륨 컨테이너 간의 데이터 공유
c) NAS 네트워크 스토리지를 통한 전체 컨테이너 공유 가능

8. 📂 Nginx 컨테이너에 외부 파일 연동

docker run --name some-nginx \
-v /some/content:/usr/share/nginx/html:ro \
-d nginx

 

경로  설명
/some/content Ubuntu 노드에 있는 HTML 파일 위치
/usr/share/nginx/html Nginx 컨테이너 내 HTML 기본 디렉터리
:ro 읽기 전용(read-only) 설정
  • 디폴트 index.html 파일을 원하는 것으로 바꿔치기해서, 외부에서 새 홈페이지를 띄울 수 있음.

9. 🔁 컨테이너 간 데이터 이동

  • 외부에서 다운로드한 홈페이지 파일을 A 컨테이너에 저장하고, B 컨테이너로 복사하여 동일한 홈페이지로 사용 가능
  • 컨테이너 간 공유 또는 Volume 연동을 통해 데이터 이동 가능

10. ☁️ 하이브리드 클라우드 운영

  • 실제 조직에서는 로컬 도커 서버 + AWS 등 상용 클라우드를 함께 연계함.
  • 내부에서 데이터를 관리하고, AWS에 있는 웹 서버는 단순히 출력만 담당 → 보안 향상
  • ❗ AWS와 같은 상용 클라우드는 Tenant 구조로 모든 사용자가 동일한 권한 구조를 가짐 → 보안상 취약할 수 있음
    • 🏠 단독주택(내부 클라우드) vs 아파트(공용 클라우드)의 비유가 적절함

정리 요약

  • 도커는 이미지를 Layer 단위로 관리하고, 캐시로 속도 향상
  • 하나의 기능을 하나의 컨테이너로 나누는 것이 도커 철학
  • 컨테이너 간의 통신은 포트 매핑과 가상 IP로 가능
  • 중요한 데이터는 Volume을 통해 외부에 보존
  • Kubernetes와 연동하면 고정 IP, Auto-scaling 등 고급 기능 가능
  • 실무에서는 하이브리드 클라우드 방식으로 도커와 외부 클라우드를 병행 사용

 

반응형