Docker 도커
Docker ( Container )가 나오기 까지의 과정
Traditional Deployment
서버를 설정하기 위해 많은 노력과 시간 필요
전통적인 배포 방법으로 물리 서버에서 애플리케이션을 직접 실행하는 형태
하나의 물리서버에 여러 애플리케이션을 실행하면 리소스 할당 등 여러가지 오류상황이 발생하는 문제점이 있음
해결책으로 서로 다른 여러 물리 서버에서 각 다른 애플리케이션을 실행했었지만
많은 물리 서버를 유지하기 위해 많은 비용이 들고 확장하는 방법도 매우 불편한 단점이 있었음
성능이 좋은걸 미리 구매하고 효율적인 사용을 위해 여러 어플리캐이션을 설치
[서버 구성 과정]
서버 주문 -> 서버 설치 -> CPU, 메모리, 하드 디스크 조립 ->
네트워크 연결 -> OS 설치 -> 계정 설정 -> 방화벽 설정 -> ...
Virtualized Deployment
전통적인 배포 방법의 문제점을 해결하기 위해 가상화 즉 VM기능이 나옴
VM은 가상화된 하드웨어 상에서 자체 운영체제를 만들어서
그 운영체제 위에서 다양한 애플리케이션을 동작 시킬 수 있음
즉 Host OS에 Hypervisor가 있고 그 위해 다양한 가상 OS 를 만들어서 사용할 수 있음
Hypervisor 란?
호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼
하나의 물리 서버의 CPU에서 여러 가상 시스템을 실행 할 수 있음
가상화로 인해 리소스를 보다 효율적으로 사용할 수 있고
쉽게 애플리케이션을 추가하거나 업데이트 할 수 있었음
가상 머진 자체는 완전한 컴퓨터라 항상 게스트 OS를 설치해야함
VM 이미지 안에는 OS가 포함되기 때문에 이미지 용량이 커짐
[ 대표 Tool ]
VMware, VirtualBox
Container Deployment
컨테이너는 애플리케이션과 애플리케이션을 구동하는 환경을 격리한 공간을 뜻함
VM이 Hypervisor를 사용하여 가상 OS 위에서 애플리케이션을 구동했다면
컨테이너는 가상 OS를 설치하지 않고 애플리케이션을 구동할 수 있음
[ 장점 ]
01. VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적임.
02. 지속적인 개발, 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 쉽게 롤백할 수 있음
03. 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션이 인프라스트럭처에서 디커플됨
04. 가시성은 OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있음
05. 개발, 테스팅 및 운영 환경에 걸친 일관성: 랩탑에서도 클라우드에서와 동일하게 구동
06. 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine 및 다른 어디에서든 구동
07. 애플리케이션 중심 관리: 가상 하드웨어의 OS에서 애플리케이션을 구동하는 수준에서 OS의 논리적인 자원을 사용하여 애플리케이션을 구동하는 수준으로 추상화 수준이 높아짐
08. 느슨하게 커플되고, 분산되고, 유연하며, 자유로운 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있음
09. 자원 격리: 애플리케이션 성능을 예측할 수 있음
10. 자원 사용량: 고효율 고집적
[ 대표 Tool ]
Docker, Docker, rkt, CRI-O, Hyper container
Docker 란?
2013년 창업자인 Solomon Hykes가 The futrure of Linux Containers 새션을 발표하면서 처음 세상에 알려짐
컨테이너 기반의 오픈소스 가상화 플랫폼
엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화 가능
조립PC, AWS, Azure, Google cloud등 어디에서든 실행 가능
개념은 상위의 Conatiner Deployment 설명과 동일
컨테이너 런타임 중에 가장 대표적인것이 Docker
[ 컨테이너 런타임 종류 ]
Docker, rkt, CRI-O, Hyper container
git hub 처럼 docker hub를 통해 이미지를 공유함
도커의 기반 기술 : 리눅스 LXC (LinuX Container)
도커는 리눅스 자체에 이미 있었던 기술을 사용하고 있는것
리눅스에서 LXC를 제공
리눅스 컨테이너 기능을 위한 사용자 영역 인터페이스
컴퓨터를 통째로 가상화 하여 OS를 실행하는 것이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리된 가상 공간
이 가상 공간을 Container 라 부름
LXC 가 사용하는 커널 기능
[ Namesapce ]
커널의 자원들을 구분해서 이를 프로세스에 제공해 그 프로세스에 소속된 자원처럼 가상화 함
ipc, uts, 마운트, pid, 네트워크, 사용자 등을 격리시켜 호스트와 별개의 공간을 만드는 기술
[ Chroots (pivot_root 사용) ]
파일 시스템에서 루트 디렉터리 ( / )를 변경하는 명령
chroot로 특정 디렉터리를 루트 디렉터리로 설정하면 chroot jail(감옥)이라는 환경이 생성
chroot jail안에서는 바깥의 파일과 디렉터리에 접근할 수 없음
이런 원리로 chroot는 디렉터리 경로를 격리하기 때문에 서버 정보 유출과 피해를 최소화 하는데 사용되었음
[ CGroups (컨트롤 그룹) ]
프로세스 리소스를 격리하고 사용을 제어하는 기능
CPU, 메모리, 디스크, 네트워크 자원을 할당하여 완전한 형태의 가상 공간을 만든는 기술
(역할)
자원 제한 : 특정 프로세스의 메모리 사용량을 제한.
우선 순위 : 특정 프로세스에 더 많은 CPU와 디스크 I/O 처리량을 할당.
기록 : 프로세스가 자원을 얼마나 사용하고 있는지 측정.
제어 : 프로세스를 멈추거나, 프로세스의 체크포인트를 설정해주거나 재시작 가능.
[ 커널 캐퍼빌리티 ]
프로세스 권한을 제어하는 기능
리눅스의 프로세스는 크게 루트 권한(사용자 ID 0)으로 실행되는 특권 프로세스와
일반 사용자(사용자 ID 0 이외)가 실행하는 비특권 프로세스로 나뉨
루트의 권한을 세분화해서 프로세스 적용할 수 있도록 만든 기능이 바로 리눅스 캐퍼빌리티
컨테이너 런타임에서도 일부 루트 권한이 필요한 경우
리눅스 캐퍼빌리티를 사용해 필요한 권한을 지정하는 방식을 지원
[ 결론 ]
초창기에는 도커도 LXC 기술을 사용했었는데
지금은 다시 구현해서 libcontainer 기술을 사용하고 있음
거의 동일한 기술이지만 조금더 추상화한 기술임
libcontainer는 커널이 아니라 유저모드 라이브러리
[실행 옵션에 따라 LXC, libcontainer 를 사용할 수 있음]
libcontainer : native
LXC : lxc
그래도 결과적으로 Docker 의 기반이 된 기술은 LXC 임.
이미지와 컨테이너
이미지 Image
컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 파일
즉 실행파일과 라이브러리가 조합된 이미지
상태값을 가지고 변하지 않음
[ 실행 파일 형태 ]
아래와 같이 다운받은 이미지의 용량이 생각보다는 큼
[ 이유 ]
커널을 제외한 리눅스 배포판이 전부 들어있음.
여러가지 라이브러리들이 기본적으로 들어가있음.
컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에
의존성 파일을 컴파일하고 다른 파일을 설치할 필요가 없음.
컨테이너 Container
이미지를 실행한 상태가 컨테이너
추가 되거나 변하는 값은 컨테이너에 저장
프로세스 형태
이미지 하나로 여러 컨테이너 생성가능
컨테이너에서 하는건 이미지에 어떠한 영향을 미치지 않음.
특정 WAS 가 설치된 이미지를 받아서 컨테이너를 실행할 수 있음.
예제 : JEUS Container에서 WAR 파일도 올리는 방법은?
백그라운드에서 돌면
디렉토리에 접근을 못하니 war를 배치할수가 없음.
이런 경우는 미리 애초에 이미지에서 jeus를 설치한 후
특정 경로에 소스코드 등 모두 배치를 한후에 패키징을 하고 배포를 해야함.
또는
도커 명령으로 설정할 수도 있음.
컨테이너를 띄울때 호스트의 디렉토리를 링크해서
거기에 파일을 올리면 컨테이너에 적용 될수도 있음.
Docker Network 설정
가상의 네트워크를 생성함
이 가상 네트워크에 포함되어 있는 컨테이너는 외부 port 를 사용하지 않아도
서로 설정한 port 로 접속이 가능함
[ 명령어 ]
docker netowrk create 네트워크 이름
도커 컴포즈란?
도커 컴포즈는 다수의 컨테이너를 쉽게 운용하기 위한 도구
멀티 컨테이너의 동시 운용은 생각보다 만만치 않음
왜냐? 컨테이너별 많은 설정들이 필요하기 때문.
개발자라면 이러한 작업을 보다 간편하게 하길 원한다.
도커 컴포즈로 가능
기본 수행 절차
1. Dockerfile 정의: 앱 환경 설정.
2. docker-compose.yml 설정: 앱과 같이 수행 될 서비스 설정.
3. docker-compose up을 통한 전체 앱 실행.
명령어
root 권한에서 작업해야함
도커 설치 (CentOS 환경)
yum update 진행
yum -y update
docker 설치
yum -y install docker
무조건 root 권한에서 해야함
docker 시작
systemctl start docker
부팅 시 docker를 실행하도록 설정
systemctl start enable docker.service
명령어 참고
도커 버전 확인
docekr version
도커 상태 정보 보기
docker info
도커 이미지 조회
docker images
REPOSITORY : 이미지 이름
TAG : 보통 version 을 표시함
IMAGE ID : 이미지의 해쉬값
CREATED : 만든 날짜
SIZE : 이미지 size
도커 이미지 다운(Pull)
docker pull centos:7.7.1908
받고자 하는 os 이름 옆에 클론 ( : )표시로 버전 명을 적어서 다운
상위는 명령 예제는
centos 의 7.7.1908 version 을 다운
version 를 명시 안할경우 default 로 가장 최신버전을 받아옴
[ 예제 ]
docker pull centos
docker pull centos:lastest
[ 이미지 검색 방법 ]
1.) 사이트에서 검색
https://hub.docker.com/ 에서 centos 검색
OFFICIAL IMAGE를 받는것이 보안상 좋음.
공식 이미지
2.) 명령어 : docker search [찾고자 하는 이미지]
찾기 불편하여 보통 사이트에서 검색함
앞에 아이디가 없는게 공식 이미지
도커 이미지 실행 ( Container 생성 )
docker run <옵션> <이미지 이름 or 이미지 ID> <실행할 파일>
예) docker run -i -t docker.io/centos:7.7.1908 /bin/bash
실행을 한다, 혹은 띄운다 느낌인데
실제로는 컨테이너를 생성함과 동시에 컨테이너를 시작하는것
즉 run 은 다운받은 image를 실행한 형태인 컨테이너로 만드는 명령
[ 명령어 옵션 설명 ]
-i : 사용자가 입출력을 할수 있게 해줌
-t : 가상 터미널 환경을 애뮬레이션 해주겠다
bash 를 띄워서 명령어를 볼 수 있다.
docker.io/centos:7.7.1908 이미지를 실행
/bin/bash 를 실행함
run 한 상태에서
ps ax 명령을 하면
다음과 같이
실행한 /bin/bash 만 떠있는것을 확인할 수 있음
OS에서 해보면 다른 프로세스가 엄청 많이 돌고있음
실행되고 있는 Container 목록 확인
docker ps
종료 된 Container 목록 확인
docker ps -a
[명령어 옵션 설명]
CONTAINER ID : 생성된 컨테이너 ID
IMAGE : 사용한 이미지 파일
COMMAND : 이미지를 실행할때 줬던 실행 파일 항목
CREATED : 생성된 날짜
STATUS : 종료된 날짜
PORTS : 이미지를 실행할때
-p 포트옵션을 줄 수 있는데
그때 부여했던 포트번호가 나옴
NAMES : 컨테이너의 이름
명시를 안하면 도커가 랜덤으로 부여함
기존에 있던 컨테이너를 실행
docker start [Container ID 또는 Name]
예) docker start nginx
run 은 컨테이너도 만든 상태이고
start 명령은 docker ps -a 로 확인된 목록의 Container를 시작시키는 명령.
컨테이너 종료
docker stop [Container ID 또는 Name]
예) docker stop nginx
실행 중인 컨테이너 안으로 들어가기
docker attach [Container ID 또는 Name]
예) docker attach gallant_elion
컨테이너에서 나오는 방법은
ctrl+p
ctrl+q
를 순서대로 누르면 됨
근데 만약 run 을 할때 -i -t 옵션을 안줬었으면
무중단 탈출이 불가능함
컨테이너 삭제
docker rm [Container ID 또는 Name]
-f 옵션을 추가 시 현재 실행 중인 컨테이너도 정지시키고 삭제함
이미지 삭제
docker rmi [ Image ID 또는 Name:Tag ]
메인 프로세스 실행파일 이외에 또 다른 실행파일을 실행할수 있도록 해주는것
docker exec [Container ID 또는 Name]
Host 에서 컨테이너 명령을 실행할 수 있다.
혹은 -it 옵션과 shell 을 추가해서 명령을 실행하면
container 안으로 들어갈 수 있음
docker exec -it [Container ID 또는 Name] [shell]
예) docker exec -it nginx:latest /bin/bash
컨테이너의 스펙을 보여줌
docker inspect [Container ID 또는 Name]
ip port 등등을 각종 정보를 확인할 수 있음
컨테이너의 log 정보를 볼 수 있음
docker logs -t [Container ID 또는 Name]
컨테이너의 파일, 디렉터리를 local 로 복사
docker cp [host파일 or 디렉터리 경로] [Container ID 또는 Name]:[Container 파일 or 디렉터리 경로]
예)docker cp iksoon_test/ iksoonTomcatTest:/usr/local/tomcat/testHome
local 의 파일,디렉터리를 컨테이너로 복사
파일, 디렉터리를 구분하지 않고 cp 명령으로 모두 복사 가능
앞뒤를 바꾸면
Container의 파일, 디렉터리를 host로 복사 가능
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
리눅스 LXC 참고
https://lng1982.tistory.com/267
https://linuxcontainers.org/ko/lxc/introduction/
도커 실습 따라하기 :
https://www.youtube.com/watch?v=Bhzz9E3xuXY&list=LL_EcQ6dgrDsR1lJViaHLQNg&index=7&t=1666s
https://suwoni-codelab.com/docker/2018/06/11/Docker-Use/
docker hub
도커 간단한 설명
https://www.youtube.com/watch?v=tPjpcsgxgWc
네트워크 참고
https://jungwoon.github.io/docker/2019/01/13/Docker-4/
https://www.youtube.com/watch?v=4T6wKk_ZWCM
컨테이너 리눅스 개발 예제 오픈소스
https://github.com/lizrice/containers-from-scratch
'클라우드 > Docker' 카테고리의 다른 글
06. Docker Private Registry IP가 아닌 Domain으로 접속하기 (0) | 2020.09.15 |
---|---|
05. Docker Private Registry 암호 설정 (2) | 2020.09.15 |
04. Docker Private Registry 구성하기 (0) | 2020.09.15 |
03. Docker Hub에 image push 하기 (0) | 2020.08.30 |
02. Docker tomcat, MySQL 환경 구성 (1) | 2020.08.30 |