Container


컨테이너는 간단히 생각하면 애플리케이션를 포함한 그릇 혹은 집 정도로 의미를 두면 될 것 같다.

컨테이너는 각자의 독립된 공간을 갖고 있으며 OS의 커널을 공유할 수 있으며 컨테이너간 영향을 주지 않으며 OS 호스트에도 영향을 주지 않는다.







명령어



1) run vs create


- 두 명령어 모두 이미지를 통해 컨테이너를 생성하는 명령어이다.

- Run 명령어는 생성과 동시에 컨테이너 내부로 접근이 가능하다.

- Create 명령어는 생성에만 관여한다. 이 후 접근하기 위해 start 와  attatch(컨테이너 내부 접근) 명령을 추가로 수행해야 한다.


ex ) Docker run -i -t --name ubuntu ubuntu:latest

ex ) Docker create -i -t --name ubuntu ubuntu:latest

       Docker start  ubuntu

       Docker attach -i -t ubuntu




일반적으로 컨테이너를 생성과 동시에 접근하기 때문에 run 명령어에 익숙해지는 것이 좋다. 형식은 다음과 같다.



docker run [옵션] [이미지] [명령] [매개변수]





자주쓰는 옵션 대해 살펴보면..


옵션 

설명 

 -i, -t

 -interactive  -tty  i와 t는 터미널 입력을 위한 옵션으로 일반적으로 -it  혹은 -i -t

 -d

 detached mode 흔히 말하는 백그라운드 모드

 --name

 컨테이너 이름 설정

 -p

 호스트와 컨테이너 포트의 연결 : 포워딩

 -e 

 컨테이너 내에서 사용할 환경변수 설정

 -rm

 프로세스 종료시 컨테이너 자동 삭제

 --link

 컨테이너 연결 [컨테이너명:별칭] 

 -v

 호스트와 컨테이너의 디렉토리 연결 (마운트) 

 -e

 컨테이너 내에서 사용할 환경변수 설정 



보다 더 자세한 사항은 docker run --help 를 통해 확인할 수 있다.


위의 옵션을 사용한 예를 사용해보면..



docker run -d -i -t -p 80:80 -p 192.168.10.1:7777:80 --name myserver --link mysql:mysql ubuntu:latest 



=> 컨테이너 생성과 동시에 내부에 접근하며 호스트 포트 80과 외부에서 접근 가능하도록 192.168.10.1:7777 포트 2개를 포워딩했으며 mysql 이름을 갖는 mysql 서버를 링크했다.


=>  우분투 컨테이너 내부에 접근해서 mysql 서버의 DNS를 확인하면 다음과 같다.







아래표는 자주 사용하는 도커 명령어에 대한 정리 사항입니다.





명령어

설명 

 run, create

 컨테이너 생성

 pull

 docker hub로부터 이미지를 내려받음

 start

 컨테이너 시작 

 stop

 컨테이너 중지 

 ps [-a]

 컨테이너 목록 확인 
 -a 옵션은 중지된 컨테이너까지 확인 

 -q 옵션은 아이디만 얻어옴


 ex) docker stop $(docker ps -a -q)  : 모든 컨테이너 중지

 ex) docker rm $(docker ps -a -q) : 모든 컨테이너 삭제


 rm

 컨테이너 삭제 

 rmi

 이미지 삭제 

 prune


 모든 컨테이너 삭제


 ex) docker container prune 

 rename

 컨테이너 이름 재지정 

 exec

 

컨테이너 내부에서 명령어를 실행한 뒤 그 결과 값을 반환


ex) docker exec -it [container] [cmd] 

 inspect

 이미지,컨테이너, 볼륨 등 도커 모든 구성단위의 세부 정보 출력 





2) 도커 볼륨 (Volume)


도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경사항만 별도로 각 컨테이너의 정보로 보존한다.


예를 들어 mysql 이미지의 경우 이미지에는 mysql을 실행하는데 필요한 애플리케이션 정보만 들어있고, 컨테이너를 생성하여 mysql 컨테이너에는 쓰기모드가 가능하여 여러 


데이터가 저장된다. 하지만 만일 도커 컨테이너를 삭제한다면, 컨테이너 계층의 데이터도 모두 삭제 된다. 그렇기 때문에 데이터의 영속성을 유지해야 하는데 이 때 볼륨을 통해 


쉽게 활용할 수 있다. 볼륨을 활용하는 방법은 호스트와 볼륨을 공유하거나, 볼륨 컨테이너를 활용하거나, 혹은 도커가 관리하는 볼륨을 생성할 수 있다.





[i] 호스트 볼륨 공유


docker run  -v  [호스트 공유 디렉토리] : [컨테이너 공유디렉토리] 컨테이너


ex) docker run -e MYSQL_ROOT_PASSWORD=1234 -v /Users/chul/Documents/Docker/volume:/var/lib/mysql mysql





해당 경로에 파일이 생성된 것을 확인 할 수 있다. 


혼동할 수 있는 점은 /var/lib/mysql 을 동기화 하는 것이 아닌 완전히 같은 디렉토리라는 것이다. 


호스트 디렉토리가 없다면, 생성하고 컨테이너 내부의 디렉토리는 삭제하게 된다. 


만일 컨테이너 내부에 디렉토리가 존재하고, 호스트 볼륨공유를 통해 호스트 디렉토리를 지정하면 컨테이너 디렉토리는 덮어씌워진다. (Mount)





[ii] 볼륨 컨테이너 


볼륨을 사용하는 두 번째 방법은 볼륨 컨테이너를 지정하여 공유하는 것이다.


볼륨 컨테이너는 -v, -volume 옵션을 통해 호스트 디렉토리와 공유하고 있으며, -volumes-from 옵션을 통해 컨테이너와 공유 할 수 있다.


ex) docker run --name mycontainer --volumes-from volumes_container ubuntu:latest



즉, 간접적으로 볼륨컨테이너와 연결해 데이터를 공유하는 방식이다.





[iii] 도커 볼륨



볼륨을 사용하는 세 번째 방법은 볼륨 명령어를 사용하는 것이다.


ex) docker volume create --name volume_container

 

ex) docker volume ls




ex) docker run -it --name volume_ex_server -v volume_container:/etc/ ubuntu:latest

[볼륨 이름 : 컨테이너의 공유 디렉토리]






 이 처럼 컨테이너가 아닌 외부에 데이터를 저장하고 동작하도록 stateless 하도록 설계하는 것이 바람직하다.









참고 

 

https://www.docker.com/

https://www.joinc.co.kr/w/man/12/docker/privateRepository

http://blog.naver.com/alice_k106        






'Cloud & NoSQL & Middleware > Docker' 카테고리의 다른 글

Docker Network (2) - 브리지(bridge) network  (0) 2018.09.17
Docker Network (1) - docker0  (0) 2018.09.14
Docker Engine, image  (0) 2018.09.08
Docker?  (0) 2018.09.08
Docker in MacOS 설치  (0) 2018.08.04

Docker


- 도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트이다.

- Go 언어로 작성 돼 있다.

- 도커와 관련된 프로젝트는 도커 컴포즈(Compose), 레지스트리, 도커머신, Kitematic 등 여러가지가 있지만 일반적으로 도커 엔진, 도커 관련 프로젝트를 일컫는다.


- 도커는 원래 리눅스에서 작동하는데 최적화 돼 있으므로, 윈도우 혹은 MAC OS에서 사용할 경우 일부 기능의 제약이 있을 수 있다.




가상 머신과 도커 컨테이너


기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었다.




출처: https://devnet.kentico.com/articles/running-kentico-in-a-docker-container

(기존의 가상화 머신과 도커의 비교)




그러나 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼 바이저를 반드시 거치기에 일반 호스트에 비해 성능 손실이 발생한다. 즉 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 이에 따른 배포에 부담이 있을 수 있다.


반면 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, namespace, cgroup를 사용함으로서 프로세스 단위의 격리 환경을 만들기 때문에 성능의 손실이 거의 없다. 


컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용할 수 있으며, 컨테이너 안에서 사용하는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재하기 때문에 이미지의 크기가 줄어들게 된다.


도커 컨테이너 이미지는 코드, 런타임, 시스템 도구, 라이브러리 및 설정과 같은 애플리케이션 단위의 프로그램을 실행하는데 필요한 모든 것을 포함하는 경량 소프트웨어 패키지다.


컨테이너 이미지를 생성하여 실행(Runtime)할 때 컨테이너가 생성된다. - (이미지는 도커엔진이 실행하여 컨테이너로 만들어준다.)



정리하면 도커 컨테이너의 특징은 간단하게 3가지로 구분할 수 있다.


1) Standard : 컨테이너는 표준화된 소프트웨어이기에 손쉽게 개발, 배포가 가능하다.

2) LightWeight : 컨테이너는 OS의 커널을 공유하기 때문에 애플리케이션 별 OS가 필요하지 않다. 때문에 서버효율성이 증대된다.

3) Secure : 애플리케이션은 컨테이너에서 안전하며, 도커에서 기본적으로 안정성을 제공한다.








'Cloud & NoSQL & Middleware > Docker' 카테고리의 다른 글

Docker Network (2) - 브리지(bridge) network  (0) 2018.09.17
Docker Network (1) - docker0  (0) 2018.09.14
Docker Container - 명령어 & Volume  (0) 2018.09.09
Docker Engine, image  (0) 2018.09.08
Docker in MacOS 설치  (0) 2018.08.04

+ Recent posts