[Docker] 시작하세요! 도커쿠버네티스 1장~2-4장
시작하세요! 도커/쿠버네티스 1장 ~ 2.4장 정리
1장. 도커란?
1.1 가상머신 & 도커 컨테이너
가상머신
- 완벽한 운영체제를 생성할 수 있음
- 일반 호스트에 비해 성능 손실 발생, 배포 부담
도커 컨테이너
- 리눅스의 chroot, 네임스페이스, cgroup 사용 → 프로세스 단위의 격리 환경
- 호스트 커널 공유해서 사용
- 배포 시간이 가상머신보다 빠름
1.2 도커를 시작해야 하는 이유
- 애플리케이션의 개발과 배포가 편해짐
- 여러 애플리케이션의 독립성과 확장성이 높아짐
1.3 도커 엔진 설치
도커 엔진은 EE(Enterprise Edition) / CE(Community Edition) 존재
docker-machine & Virtualbox 통해 docker 설치
virtualbox 설치 :
brew install virtualbox --cask
docker-machine 설치 :
brew install docker-machine --formula
docker-machine 생성 :
docker-machine create --driver [virtualbox/...등의 driver] [name]
- Virtual box 기본적으로 linux OS로 docker 실행 가능한 VM이 실행됨
Docker host 설정 :
docker-machine env [name]
Virtual box instance ssh 접속
docker-machine ssh default
2장. 도커엔진
2.1 도커 이미지 & 컨테이너
도커 엔진에서 사용하는 기본 단위, 핵심
2.1.1 도커 이미지
- 여러 계층으로 된 바이너리 파일
컨테이너를 생성/실행할 때 읽기 전용으로 사용됨
- [저장소 이름]/[이미지 이름]/[태그]
2.1.2 도커 컨테이너
- 독립된 파일시스템, 호스트와 분리
- 이미지를 통해 생성되는 격리된 공간
2.2 도커 컨테이너 다루기
2.2.1 컨테이너
docker run
: 컨테이너를 생성 후 실행
- 컨테이너 내부 접속 후
- Ctrl + d : 컨테이너 종료
- Ctrl + p,q : 컨테이너 셸 접속에서만 나옴
- 옵션
- -d : Detached 모드
- -e : 컨테이너 내부의 환경변수 설정
- –link : 컨테이너 간 연결. alias로 접근.
- –link [연결하고자 하는 컨테이너명]:[alias]
- docker exec [container name] curl [alias]:[port] –silent
- ❗️유의할 점❗️ 컨테이너가 실행 중이지 않거나 존재하지 않는다면 –link를 적용한 컨테이너 또한 실행할 수 없음
- deprecated 옵션
docker pull
: 이미지 가져오기
docker images
: 이미지 조회
docker attach
: 컨테이너 내부로 들어감
docker rm
: 컨테이너 삭제
docker container prune
: 모든 컨테이너 삭제
docker run -p 옵션
: 컨테이너 외부에 노출
docker port [container name]
: 호스트와 바인딩된 포트 조회
- eg) docker run -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu
도커에서는 한 컨테이너에 프로세스 하나만 실행하는 것이 권장됨.
2.2.6 도커 볼륨
컨테이너 삭제 시 컨테이너의 파일도 같이 날라감. 이를 보존하기 위한 방법 3가지 존재
- 호스트와 볼륨 공유
- docker run의
-v
옵션 : -v [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리] - 동기화 ❌ 동일한 디렉터리 ⭕️
- 단일 파일 단위 공유도 가능
- 여러 개의 -v 옵션 사용 가능
- 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너 디렉터리에 마운트 → 컨테이너의 디렉터리가 덮어싀워짐
- docker run의
- 볼륨 컨테이너 활용
- -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유
- 도커가 관리하는 볼륨 생성
2.2.7.2 도커 네트워크 기능
- 도커 자체 제공 네트워크 드라이버 : 브릿지, 호스트, none, 컨테이너, 오버레이
- 서드파티 플러그인 솔루션 : weave, flannel, openvswitch
docker network
- docker network [connect/disconnect] [네트워크 명] [컨테이너 명]: 컨테이너에 네트워크를 유동적으로 붙이고 뗄 수 있음
- 브리지, 오버레이 네트워크와 같이 특정 IP대역을갖는 네트워크 모드에만 사용 가능
브리지 네트워크
docker0이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조
- 브리지 네트워크 생성 : docker network create —driver bridge mybridge
- —net 옵션 : 컨테이너가 지정한 네트워크를 사용하도록 설정
- docker run -it —name mynetwork_container —net mybridge ubuntu
호스트 네트워크
호스트의 네트워크 환경을 그대로 사용
별도의 생성 필요 없이, —net 옵션에서 사용
- docker run -it —name network_host —net host ubuntu
논 네트워크
아무런 네트워크를 쓰지 않는 것. 외부와 연결 단절
컨테이너 네트워크
다른 컨테이너의 네트워크 네임스페이스 환경 공유
- 공유되는 속성 : 내부 IP, 네트워크 인터페이스의 MAC 주소 등
- —net container:[다른 컨테이너 ID]
- 내부 ip 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성 X.
2.2.9 컨테이너 자원 할당 제한
아무런 옵션을 입력하지 않으면 컨테이너는 호스트 자원 무제한 사용
docker update (변경할 자원 제한) (컨테이너 이름)
2.2.9.1 컨테이너 메모리 제한
- docker run -d
--memory="1g"
- 입력 단위 : m(메가바이트), g(기가바이트)
- 최소 메모리 : 4MB
- 컨테이너 할당 메모리 초과시 자동으로 컨테이너는 종료됨
- 스왑 메모리 설정
- docker run -it –momory=200m
--memory-swap=500m
ubuntu - 컨테이너의 스왑 메모리 default : 메모리의 2배
- docker run -it –momory=200m
2.2.9.2 컨테이너 CPU 제한
--cpu-shares
- docker run -it –name cpu_share
--cpu-shares 1024
ubuntu - cpu-shares 값은 상대적인 값
- 컨테이너에 가충지를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지 표기
--cpuset-cpu
- 호스트에 CPU가 여러 개 있을 때 컨테이너가 특정 CPU만 사용하도록 설정
docker run -d --name cpuset_2 --cpuset-cpu=2 {image}
- 컨테이너가 3번째 CPU만 사용
- –cpuset-cpus=”0,3” : 1,4 번째 CPU
- –cpuset-cpus=”0-2” : 1,2,3번째 CPU
--cpu-period
, --cpu-quota
- 컨테이너의 CFS(Completely Fair Scheduler) 주기 설정 : default 100ms\
- docker run -d –name quote_1
--cpu-period=100000 --cpu-quota=25000
{image}- cpu-period : 기본적으로 100000(100ms)
- cpu-quota : 설정된 시간 중 CPU 스케줄링에 얼마나 할당할지 설정
- 100000 중 25000만큼을 할당. CPU 주기 1/4로 감소. 일반적인 컨테이너보다 CPU성능이 1/4 감소
- 컨테이너 CPU 시간 할당 계산식 : [–cpu-period 값] / [–cpu-quota 값]
--cpus
- CPU의 개수를 직접 지정
- –cpus=0.5 → –cpu-period=100000 –cpu-quota=50000과 동일하게 제한
2.3 도커 이미지
2.3.1 도커 이미지 생성
docker commit
docker commit -a “author” -m “commit message” CONTAINER [REPOSITORY[:TAG]]
도커 이미지는 Layer 구조
- docker history IMAGE : 이미지 레이어 구성 조회
2.4 Dockerfile
- FROM
- 생성할 이미지의 베이스 이미지
- MAINTAINER
- 이미지 생성한 개발자 정보
- LABEL
- 메타데이터 추가, “key”=”value” 형태로 저장
- RUN
- 컨테이너 내부 명령어 실행
- ADD
- 파일을 이미지에 추가
- cf) COPY
- COPY : 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 파일을 복사하는 역할
- 로컬 파일만 가능
- ADD
- 외부 URL 및 tar 파일 가능
- 사용 권장 X
- COPY : 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 파일을 복사하는 역할
- WORKDIR
- 명령어 실행할 디렉터리
- WORKDIR 명령어 여러 번 사용 시 cd 명령어 사용과 동일
- EXPOSE
- 이미지 노출할 포트 설정
- 반드시 이 포트가 호스트의 포트와 바인딩되는 것은 X, 단지 컨테이너의 해당 포트를 사용할 것임을 나타내는 것뿐
- CMD
- 컨테이너가 시작될 때마다 실행할 명령어
- Dockerfile에서 한 번만 사용 가능
- CMD [“실행 가능한 파일”, “명령줄 인자 1”, …]
- ENTRYPOINT의 명령줄 인자로 사용될 수도 있음
- cf) ENTRYPOINT
- ENTRYPOINT
- 컨테이너가 시작될 때 수행할 명령어 지정
- 커맨드를 인자로 받아 사용할 수 있는 스크립트 역할 가능
- entrypoint 설정 X : cmd에 설정된 명령어 그대로 실행
- entrypoint 설정 O : cmd는 단지 entrypoint에 대한 인자 기능
- ENTRYPOINT
- ENV
- Dockerfile에서 사용될 환경변수. 이미지에도 저장되어 컨테이너에서도 활용 가능
- docker run -e 옵션을 사용할 경우 기존의 값은 덮어 씌어짐
- VOLUME
- 호스트와 공유할 컨테이너 내부의 디렉터리 설정
- ARG
- build 명령어를 실행할 때 추가로 입력을 받아 Dockerfile 내에서 사용될 변수 값 설정
- default 값 설정 가능
- USER
- 컨테이너 내에서 사용될 사용자 계정의 이름/UID 설정
- ONBUILD
- 빌드된 이미지를 기반으로 하는 다른 이미지가 Dockerfile로 생성될 때 실행할 명령어 추가
- STOPSIGNAL
- 컨테이너가 정지될 때 사용될 시스템 콜 종류 지정
- Eg) STOPSIGNAL SIGKILL
- HEALTHCHECK
- 애플리케이션 상태 체크
- curl 먼저 설치 필요
docker build
-t mybuild:0.0 ./
- -t : 생성될 이미지 이름 설정
docker run
- -P 옵션 : EXPOSE의 모든 포트를 호스트에 연결하도록 설정
- docker port CONTAINER : 호스트와 연결된 포트 확인
빌드 컨텍스트
이미지를 생성하는 데 필요한 각종 파일, 소스코드, 메타데이터 등을 담고 있는 디렉터리
Dockerfile이 위치한 디렉터리
- .dockerignore : 빌드에서 제외시킴
Dockerfile에서 명령어 한 줄이 실행될 때 마다 이전 Step에서 생성된 이미지에 의해 새로운 컨테이너가 생성되며, Dockerfile에 적힌 명령어를 수행하고 다시 새로운 이미지 레이어로 저장됨
이미지 빌드 시 이전에 생성된 캐시 레이어를 사용함. 사용하지 않으려면 docker build –no-cache 옵션 추가.
캐시를 활용하고 싶다면 –cache-from 옵션 사용.
Dockerfile 빌드 주의점
RUN 명령어 &&로 하나로 묶기
- RUN 마다 layer가 생성되기 때문