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

+ Recent posts