Search
Duplicate

Docker

Tags
Study

Docker

도커 데몬: 이미지, 컨테이너, 네트워크, 볼륨 등 Docker 개체 관리
도커 클라이언트: 도커 데몬에게 Docker API 요청
도커 레지스트리: 도커 이미지 저장소. 기본적으로 Docker Hub 사용
도커 개체
이미지: 컨테이너를 생성하기 위한 지침이 포함된 읽기 전용 템플릿
컨테이너: 생성, 시작, 중지, 이동 또는 삭제할 수 있는 실행 가능한 이미지 인스턴스

도커 라이프사이클

응용 계층의 추상화
각 컨테이너는 격리된 프로세스로 실행
호스트 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
복사