서버 가상화 기술
- 호스트형 서버 가상화 : 하드웨어 위에 호스트 OS를 설치하고, 호스트 OS에 가상화 소프트웨어를 설치한 후, 이 가상화 소프트웨어 상에서 게스트 OS를 작동시키는 기술. (주로 개인목적)
VM VirtualBox, VMware Wrokstation Player등
- 하이퍼바이저형 서버 가상화 : 하드웨어 위에 바로 하이퍼바이저를 배치하여 가상환경을 제어하는 기술. (주로 기업목적)
Vmware ESXi 등
컨테이너 유형
- System Container : 여러 Process를 분리 (LXC, Jail, Solaris Zone 등)
- APP Container : main 서비스는 오직 하나, 가벼움 (Docker 등)
개발자의 Docker
- 애플리케이션의 실행모듈, 미들웨어나 라이브러리, 인프라 환경설정 등 모든 과정이 하나의 Docker 이미지에 담겨있기 때문에 빠르고 편리하다
Docker 에디션
- Docker Community Edition(CE) : Docker사가 제공하는 무료 에디션. 매월마다 보안지원과 버그 수정 지원인 Edge, 4분기별로는 안정판인 Stable이 릴리즈 된다.
- Docker Enterprise Edition(EE) : Docker사가 지원하고 상용 이용에 적합한 에디션. CE의 Stable과 똑같은 타이밍에 릴리즈 된다.
Docker 컴포넌트
- Docker Engine (핵심기능, Demon) : Docker 이미지를 생성하고 컨테이너를 기동시키기 위한 핵심기능.
- Docker Registry (이미지 공개 및 공유) : Docker 이미지를 공개 및 공유하기 위한 레지스트리 기능. Docker Hub도 이 Registry를 사용하고 있다.
- Docker Compose (컨테이너 일원관리) : 여러개의 컨테이너 구성정보를 코드로 정의하고, 명령을 실행함으로써 실행환경을 구성하는 컨테이너들을 일원 관리하기 위한 툴.
- Docker Machine (실행 환경 구축) : VirtualBox, EC2, Azure와 같은 클라우드 환경에 Docker의 실행 환경을 명령으로 자동생성하기 위한 툴.
- Docker Swarm (클러스터 관리) : 여러 Docker 호스트를 클러스터화 하기위한 툴. 오픈 소스인 Kubernetes도 이용가능 (Kubernetes는 현재 대기업에서 많이 사용중이다)
Docker 네트워크 구성(가상 NIC)
- Docker를 설치하면 서버의 물리 NIC가 docker0이라는 가상 브리지 네트워크로 연결. (디폴트로 만들어짐) 주소는 172.17.0.0/16 (B클래스)
- 외부 네트워크와 통신을 할 땐 NAPT 기능을 사용.
- NAT과 IP 마스커레이드의 차이
- NAT : 공인 IP와 사설 IP를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 액세스 할 수 없다.
- NAPT : 공인 IP와 사설 IP 주소는 똑같지만 포트(: )로 구별하기 때문에 여러 클라이언트가 액세스 할 수 있다.
- NAT과 IP 마스커레이드의 차이
- 포트 포워딩을 통한 nginx 웹서버 접속.
docker container run —name webserver -d -p 80:80 nginx
- —name : 컨테이너 이름 지정
- -d : 백그라운드에서 실행
- -p 80:80 포트포워딩. 앞 80포트는 비어있는 아무 포트 가능하고(호스트포트) 뒤 80포트는 nginx의 기본 포트이기때문에 임의지정 불가능. 포트포워딩 해줌으로써 들어오는 모든 접속을 80포트로 포워딩해준다. 따라서 윈도우(외부네트워크)에서도 포트포워딩된 centos의 아이피주소를 입력하면 nginx페이지에 접속할 수 있다. (80포트는 기본이라 생략 가능하고 나머지 포트로 설정했으면 :포트번호를 적어주어야 한다.)
- docker ps로 확인해보면 80>80/tcp(포트포워딩 된모습)을 확인해볼 수 있다.
docker ps = 작동중인 컨테이너만
docker ps -a = 모든 컨테이너 다 출력
Docker 이미지의 데이터 관리 장치
Docker이미지는 ro전용이기 때문에 수정할 수 없다. 따라서 수정이 필요하다면 rw가 가능한 공간을 새로 만들어서 이미지를 관리하게 된다. 이것을 Union FS라 하는데 그 중에서 OverlayFS를 최근에 가장 많이 사용한다.
Docker 설치
Microsoft가 제공하는 하이퍼바이저인 Hyper-V를 사용하게 되는데 Windows 10 Pro, Enterprise, Education에서 작동한다. 만약 버전이 다르다면 Docker-toolBox를 설치하여 사용하여야 한다
- Docker-toolBox : VB기반, Docker전용의 가상머신으로서 패키지 설치가 불가능하다, 그래픽도구를 지원한다
Docker 설치과정
- docker 이미지 push
docker login
docker image push rosehs00/app:v1
- docker 이미지 pull
docker pull rosehs00/app:v1
rosehs00 : docker 아이디
app : repository 이름
v1 : 태그 이름 (입력 안할시 기본이 latest)
Docker에서 'Hello world' 출력
docker container run ubuntu /bin/echo 'hello world'
- ubuntu에 따로 태그 지정해주지 않으면 자동으로 latest로 태그
- 만일 ubuntu이미지가 로컬환경에 없다면 자동으로 먼저 다운로드한다.(자동 pull)
docker.io 파일은 dockerhub에 있다.
- 명령어와 수명주기가 같아 echo가 실행되고 중지된다면 컨테이너도 똑같이 중지된다.
Docker 확인
- 버전 확인 : docker version (centos에선 버전을 다르게 보여주고 ubuntu에선 그대로 보여줌)
- 실행 환경 확인 : docker system info
- 디스크 이용 상황 확인 : docker system df
RECLAIMABLE은 불필요한 이미지 등을 삭제할 때 얻을 수 있는 용량
Web Server 작동시키기
- nginx 이미지 다운로드.
docker pull nginx
- nginx 작동.
docker container run —name webserver -d -p 80:80 nginx
- —name : 이름지정
- -d : 백그라운드 작업
- -p 80:80 : 포트포워딩 작업. 들어온 포트를 뒤 nginx 80포트로 포트포워딩
- 서버 상태 확인
docker container ps
Docker 이미지 조작
- 이미지 다운로드
docker image pull -a centos : centos의 모든 태그 이미지 취득
docker image pull 주소/ID 형태로도 취득가능
- 이미지 목록 표시
docker image ls -a : 모든 이미지 표시
- 이미지 상세 정보 확인
docker image inspect centos:7 - centos7의 세부정보 확인 (호스트 네임이 따로 지정되지 않으면 컨테이너 이름이 들어감)
- 이미지 태그 설정
docker image tag nginx abc/webserver:1.0
태그를 붙인 이미지와 원래의 이미지는 IMAGE ID가 똑같음.
- 이미지 검색
docker search —filter=stars=1000 nginx
stars의 건수가 1000건 이상인 인기있는 이미지만 검색 가능
- 이미지 삭제
docker image rm (-f)
태그 지정 안하면 동일 image 다 삭제.
-f 넣으면 강제로 삭제
docker image prune
사용하지 않는 이미지 삭제.
docker rm $(docker ps -a -q)
작동되고있지 않은 컨테이너 조용히(-q) 다(-a) 삭제(작동중인건 에러를 리턴)
Docker 컨테이너의 라이프 사이클
run은 생성과 시작을 한번에 해줌 (create + start)
컨테이너 생성 및 시작
- docker run -it --name test1 centos /bin/cal
-it : 콘솔에 결과를 출력
—name test1 : 컨테이너명
centos : 이미지명
/bin/cal : 실행할 명령
컨테이너와 명령은 생명주기가 똑같기 때문에 cal(달력)명령을 실행하고 컨테이너가 종료된다.
- docker run -it --name test1 centos /bin/bash
-it를 이용하여 콘솔에 출력하면서 bash쉘이 터미널에 계속 물려있기 때문에 종료되지 않는다.
- docker exec -it webserver /bin/bash
기존 작동중이었던 webserver컨테이너에 연결한다.
컨테이너 자동 삭제와 재시작
- —rm : 명령 실행 완료후에 컨테이너를 자동으로 삭제해준다 (테스트하는 상황에 적합)
- —restart=always : 명령 실행 후 항상 재시작한다. (서비스가 지속되어야 하는 기억에 적합
hostname 지정
- docker run -it --rm --hostname kms --name test6 centos /bin/bash
kms의 hostname을 가진 컨테이너 실행
nginx컨테이너 안에는 ps,vi 등 관리 커맨드는 설치 되어있지않기 때문에 ls /bin을 입력하여 있는 명령셋만 사용 가능하다!