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 컨테이너에 외부 파일 연동
- https://hub.docker.com/_/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 등 고급 기능 가능
- 실무에서는 하이브리드 클라우드 방식으로 도커와 외부 클라우드를 병행 사용
반응형
'클라우드' 카테고리의 다른 글
🐳 Docker Swarm 완전정복: 실습과 개념 총정리 (0) | 2025.05.20 |
---|---|
🐳 Docker 이미지 태그와 리소스 할당 완벽 정리 (1) | 2025.05.19 |
🐳 Docker와 연동 기술 완전 정리 (이벤트, Dockerfile, Node.js, Flask 등) (1) | 2025.05.16 |
☁️ Docker와 Kubernetes 완전 정복! (0) | 2025.05.13 |
☁️ 클라우드 기반 Hadoop 분산 시스템 정리 (1) | 2025.05.12 |