•
도커 데몬: 이미지, 컨테이너, 네트워크, 볼륨 등 Docker 개체 관리
•
도커 클라이언트: 도커 데몬에게 Docker API 요청
•
•
도커 개체
◦
이미지: 컨테이너를 생성하기 위한 지침이 포함된 읽기 전용 템플릿
◦
컨테이너: 생성, 시작, 중지, 이동 또는 삭제할 수 있는 실행 가능한 이미지 인스턴스
도커 라이프사이클
•
응용 계층의 추상화
•
각 컨테이너는 격리된 프로세스로 실행
•
호스트 OS의 커널을 다른 컨테이너와 공유
•
일반적으로 수십 MB의 이미지 크기
•
물리적 하드웨어의 추상화
•
Hypervisor를 통해 여러 가상 머신 실행
•
각 VM에는 운영 체제, 애플리케이션, 필수 바이너리 및 라이브러리의 전체 복사본이 포함되어 수십 GB의 용량 필요
chroot의 확장 버전으로 생각해도 되며, 도커는 다음의 기술을 사용하여 컨테이너를 격리합니다.
•
리눅스 커널 네임 스페이스: 각 프로세스가 파일 시스템 마운트, 네트웤, 유저(uid), 호스트네임(uts) 등에 대해 시스템에게 독립적인 뷰 제공
•
리눅스 컨트롤 그룹(cgroup): 프로세스가 소비할 수 있는 리소스 양(CPU, 메모리, I/O, 네트워크 대역대, device 노드 등) 제한
--init 플래그를 사용하여 init 프로세스가 컨테이너에서 PID 1로 사용되어야 함을 나타낼 수 있습니다. init 프로세스를 지정하면 좀비 프로세스 제거와 같은 init 시스템의 일반적인 책임이 생성된 컨테이너 내에서 수행됩니다.
사용되는 기본 init 프로세스는 Docker 데몬 프로세스의 시스템 경로에 있는 첫 번째 docker-init 실행 파일입니다. 기본 설치에 포함된 이 docker-init 바이너리는 tini 에서 지원됩니다.
도커 볼륨 (저장소)
종류 | 저장 위치 |
Volume | 호스트 파일 시스템의 도커 영역 (/var/lib/docker/volumns/) |
Bind | 호스트 파일 시스템의 특정 디렉토리 영역
지정 파일 외의 파일을 추가/수정/삭제 할 수 있으므로 위험!! |
tmpfs | 민감/비밀 정보 등을 컨테이너가 살아있는 동안 메모리에 저장 |
$ docker volume prune
# bind
$ docker container run -v <호스트 경로>:<컨테이너 경로> <이미지명:태그>
# named volume
$ docker container run -v <컨테이너 경로> <이미지명:태그>
# anynomous volume
$ docker container run -v <볼륨명>:<컨테이너 경로> <이미지명:태그>
# tmpfs
$ docker container run --tmpfs <컨테이너 경로> <이미지명:태그>
Shell
복사
# 도커 영역 /var/lib/docker/volumnes/ 마운트
service:
app1:
image: myapp:latest
volumes:
- /container/path # Volume(Anonymous)
- myapp1:/container/path # Volume(Named)
- /host/path:/container/path # Bind Volume
tmpfs:
- /container/path # tmpfs Volume
YAML
복사
도커 데몬을 실행하면 virtual bridge docker0가 생성된다.
컨테이너 생성 시 컨테이너 별로 고유한 network namespace veth000가 생성되며 docker() bridge에 하나씩 바인딩 된다.
드라이버 | 설명 |
bridge | 기본 네트워크 드라이버. |
host | 컨테이너와 Docker 호스트 간의 네트워크 격리를 제거합니다. |
none | 컨테이너를 호스트 및 다른 컨테이너로부터 완전히 격리합니다. |
overlay | 오버레이 네트워크는 여러 Docker 데몬을 함께 연결합니다. |
ipvlan | IPvlan 네트워크는 IPv4 및 IPv6 주소 지정에 대한 완전한 제어를 제공합니다. |
macvlan | 컨테이너에 MAC 주소를 할당합니다. |
$ docker network ls
$ docker network create --driver=bridge <network_name>
$ docker network connect <network_name> <container_name>
$ docker network disconnect <network_name> <container_name>
$ docker network rm <network_name>
$ docker network inspect bridge
$ docker network inspect host
Shell
복사
$ docker run -d -p 외부포트:내부포트 --name nginx nginx
$ docker ps -a
Shell
복사