일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- C++
- 안드로이드스튜디오
- BAEKJOON
- AndroidStudio
- DFS와BFS
- codingtest
- docker
- Python
- Algorithm
- 코테
- 파이썬
- Flutter
- 백준
- 분할정복
- 동적계획법
- android
- cos pro 1급
- 개발
- DART
- DFS
- cos
- issue
- 코드품앗이
- 알고리즘
- cos pro
- 코딩테스트
- django
- 안드로이드
- 동적계획법과최단거리역추적
- vuejs
- Today
- Total
Development Artist
도커(Docker) 엔진 개념부터 실전까지: DevOps 엔지니어의 정리 노트 본문
서론
DevOps 엔지니어로 일하다 보면 도커(Docker)는 매일 사용하는 필수 도구다.
컨테이너를 활용하면 애플리케이션을 빠르게 배포하고, 개발과 운영 환경을 동일하게 맞출 수 있어서 협업이 훨씬 수월해진다.
‘시작하세요! 도커/쿠버네티스’ 책을 읽으면서 도커에 대해 다시 한 번 정리하고 싶은 내용들을 이렇게 기록하고자 한다.
도커 엔진
도커 엔진에서 가장 핵심이 되는 구성 요소는 이미지(Image)와 컨테이너(Container)다.
- 이미지는 여러 계층(layer)으로 구성된 읽기 전용 파일이다. 애플리케이션 실행에 필요한 모든 파일과 설정이 포함되어 있다.
- 컨테이너는 이 이미지를 실행한 결과물로, 독립된 프로세스 공간에서 동작하는 일종의 가상 환경이다.
컨테이너를 실행하면 도커는 해당 이미지 기반으로 컨테이너 계층을 생성하고, 그 위에서 애플리케이션이 동작하게 된다.
이 계층은 쓰기 가능한 영역으로, 변경 사항은 이미지 자체에 영향을 주지 않고 컨테이너에만 저장된다.
컨테이너 다루기
생성
컨테이너는 보통 docker run 명령어로 생성하고 실행한다. 기본적으로 컨테이너 내부의 사용자는 root이며, 호스트 이름은 무작위의 16진수로 구성된 해시값이다.
자주 사용하는 옵션은 다음과 같다.
- -i: 입력을 받을 수 있도록 상호작용 모드를 활성화한다.
- -t: 터미널을 활성화한다. 주로 -i와 함께 -it로 묶어서 사용한다.
- -d: Detach 모드. 컨테이너를 백그라운드에서 실행할 때 사용한다.
외부에 노출
도커는 기본적으로 컨테이너에 172.17.0.x 대역의 IP를 순차적으로 할당한다.
이 IP는 호스트 외부에서 접근할 수 없기 때문에, 외부 노출이 필요한 경우에는 다음과 같이 포트를 바인딩해야 한다.
docker run -p 8080:80 nginx
이렇게 하면 호스트의 8080 포트가 컨테이너의 80 포트로 연결된다.
볼륨
도커에서 파일을 영속적으로 저장하거나, 컨테이너 간에 파일을 공유하려면 볼륨(volume)을 사용해야 한다.
볼륨은 다음과 같은 방식으로 구성할 수 있다.
- 호스트 볼륨: -v /host/path:/container/path
- 컨테이너 볼륨 공유: --volumes-from [다른 컨테이너 이름]
- 도커 네이티브 볼륨: -v volume-name:/container/path
호스트 볼륨은 운영체제의 파일을 직접 공유하므로 개발할 때 디버깅이나 로그 확인에 자주 사용된다.
반면, 네이티브 볼륨은 도커가 내부적으로 관리하며, 스냅샷이나 백업에도 유리하다.
네트워크
도커는 컨테이너마다 가상 네트워크 인터페이스를 생성한다. 이 인터페이스는 vethXXXX 형태로 이름이 만들어지고, 내부적으로는 docker0 브리지와 연결되어 있다.
docker0는 호스트와 컨테이너 간 통신을 중개하는 가상의 네트워크 브리지다.
도커 네트워크 드라이버는 다음과 같은 옵션을 제공한다.
- bridge: 기본 설정. 별도 브리지를 생성하거나 지정할 수 있다. (--net bridge)
- host: 컨테이너가 호스트와 네트워크를 공유한다. (--net host)
- none: 네트워크 인터페이스를 생성하지 않는다. (--net none)
- container:<id>: 다른 컨테이너와 네트워크를 공유한다.
그 외에도 멀티 호스트 환경에서 사용하는 오버레이 네트워크인 Weave, Flannel, Open vSwitch 등이 있다.
MacVLAN은 실제 네트워크 인터페이스처럼 보이도록 IP를 할당할 수 있는 드라이버다. 고정 IP가 필요한 환경에서 유용하다.
로깅
기본 로그 드라이버는 json-file이며, 로그는 아래 경로에 저장된다.
/var/lib/docker/containers/<CONTAINER_ID>/<CONTAINER_ID>-json.log
다른 로그 드라이버도 사용할 수 있다.
- --log-driver=syslog: 운영체제의 syslog로 로그를 전송한다.
- --log-driver=fluentd: 로그를 fluentd로 전달한다.
- AWS CloudWatch, Graylog, Splunk 등 외부 로깅 시스템도 지원한다.
운영 환경에서는 로그 수집 및 분석 도구와 연동하는 것이 일반적이다.
자원 할당 제한
메모리 제한
docker run --memory="512m"
컨테이너가 설정된 메모리를 초과하면 자동으로 종료된다.
기본적으로 스왑은 메모리의 2배로 설정되며, --memory-swap 옵션으로 조절할 수 있다.
CPU 제한
- --cpu-shares: CPU 점유 우선순위 설정
- --cpuset-cpus: 특정 CPU만 사용하게 제한
- --cpu-quota, --cpu-period: 시간 단위로 CPU 사용량 제어
- --cpus: CPU 개수처럼 쉽게 설정할 수 있는 옵션
디스크 I/O 제한
디바이스의 쓰기/읽기 속도 제한도 가능하다.
--device-read-bps=/dev/sda:1mb
--device-write-iops=/dev/sda:100
이 제한은 Direct I/O에만 적용되며, Buffered I/O는 제한되지 않는다.
이미지
도커 이미지는 공식적으로 Docker Hub에서 관리된다.
공식 라벨이 없는 이미지는 안정성이 떨어지거나 문서화가 부족할 수 있으니 주의가 필요하다.
구조
도커 이미지는 레이어(layer) 기반이다.
docker commit으로 새로운 이미지를 생성할 때마다 하나의 레이어가 추가된다.
중간 레이어를 삭제하면 이를 사용하는 이미지가 있다면 삭제되지 않고 dangling 이미지(고아 이미지)가 될 수 있다.
저장 및 추출
• docker save / docker load: 이미지 전체를 tar 파일로 저장하고 복원한다.
• docker export / docker import: 컨테이너의 파일 시스템만 저장하며, 이미지 설정은 제외된다.
배포
도커 이미지를 다른 환경에 배포하려면 보통 도커 레지스트리(Docker Registry)를 사용한다. 크게 두 가지 방식이 있다.
공식 Docker Hub에 배포
Docker Hub는 도커에서 공식으로 제공하는 퍼블릭 이미지 저장소다.
이미지를 푸시하려면 먼저 태그를 설정해야 한다.
docker tag my-app docker.io/username/my-app:latest
그리고 로그인 후 푸시한다.
docker login
docker push docker.io/username/my-app:latest
- username은 Docker Hub 계정 이름이어야 한다.
- 퍼블릭으로 등록하면 누구나 pull 가능하고, private 저장소는 유료 플랜에서 제한적으로 제공된다.
사설 레지스트리에 배포
자체 구축하거나 AWS ECR, GitLab Container Registry, Harbor 같은 외부 서비스를 사용할 수 있다.
예를 들어 AWS ECR에 푸시하려면,
aws ecr get-login-password | docker login --username AWS --password-stdin <AWS 계정>.dkr.ecr.<region>.amazonaws.com
docker tag my-app <레포지토리 URI>/my-app:latest
docker push <레포지토리 URI>/my-app:latest
사설 레지스트리를 직접 운영하려면 도커에서 레지스트리 컨테이너를 실행할 수도 있다.
docker run -d -p 5000:5000 --name registry registry:2
그리고 localhost:5000에 이미지 푸시.
docker tag my-app localhost:5000/my-app
docker push localhost:5000/my-app
'Research > Devops' 카테고리의 다른 글
한 줄로 쉽게 올리는 서비스 – Docker Compose 이야기 (0) | 2025.03.30 |
---|---|
DWG 파일을 GLTF로 변환하는 서버리스 컨테이너 Lambda 이야기 (0) | 2025.03.11 |
[FastAPI] 비동기로 RabbitMQ 연결하기 (0) | 2025.02.09 |
[Helm] Helm Chart 템플릿 파일에 대하여 - Loki Ingester StatefulSet (0) | 2025.02.08 |
GluserFS에 대하여 (0) | 2025.02.04 |