'Tool/Docker'에 해당하는 글 10건

docker run

Tool/Docker 2016. 1. 18. 22:10

이제 Docker 데몬을 올려 놓았다고 가정한다.

docker info 명령으로 현재 Docker 의 컨테이너 수, 이미지 수, Docker 버전, ROOT Dir, ...  등의 정보를 확인할 수 있다.


$ docker info
 
Containers: 2
Images: 2
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 6
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-74-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-11-122
ID: BVTB:PMXW:2IG2:3LE6:K2Q5:DLNS:AWMG:M3JE:3EKO:U6V4:ZZMD:7QUM
cs



이미지 다운로드


Docker 설치 후에 보유한 이미지가 없으므로 일단 어떤 이미지든 다운 받아본다.

다운받는 방법은 pull / run 이 있는데 pull 은 Docker Hub 에서 이미지를 검색하여 다운로드 하는 방식이고,

run 은 이미지를 로컬에서 먼저 검색한 후 없으면 Docker Hub 에서 다운받아 실행하는 방법이다.

즉, pull 은 다운로드만, run 은 다운로드 후 실행. 이미 다운로드 되어 있으면 실행만.


$ docker pull ubuntu
 
Using default tag: latest
latest: Pulling from library/ubuntu
fcee8bcfe180: Pull complete
4cdc0cbc1936: Pull complete
d9e545b90db8: Pull complete
c4bea91afef3: Pull complete
Digest: sha256:b53bb7b0d18842214ac7472c2a8801e8682c247d30f1ba4bab0083a2e2e091ea
Status: Downloaded newer image for ubuntu:latest
cs


이미지를 다운로드 할 때, 해시코드로 작성된 이미지 ID를 보여주지만 대부분의 명령에서는 전체 ID 를 사용하지 않고 ID의 첫 12글자를 보여준다.

전체 ID 의 확인이 필요할 때는 docker inspect [image] 나 docker images --no-trunc=true 명령을 사용한다.



이미지 실행


$ docker run ubuntu:14.04 /bin/echo 'Hello world'
cs


ubuntu 는 실행할 이미지 이름이며 콜론(:) 뒤에는 버전이다. 명시하지 않으면 가장 최신 버전을 실행한다.

이미지를 지정하면 Docker 는 먼저 Docker 호스트 에서 해당 이미지를 찾아보고, 없으면 공개 이미지 레지스트리인 Docker Hub 에서 이미지를 다운받는다.

그 후 컨테이너가 실행되면 Docker 는 새로운 Ubuntu 14.04 환경을 생성하고, 입력한 명령어(/bin/echo 'Hello world')를 새로운 컨테이너에서 실행하고, 컨테이너는 중지(stopped)된다.


$ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
cs


이번에는 두개의 옵션(flag)이 추가됐다.

-t (tty) 는 새 컨테이너 안에 터미널(가상 장치: TTY)을 할당하는 것이다.

-i (interactive) 는 컨테이너의 표준 입력을 사용하여 대화형 연결을 할 수 있다.

명령문(/bin/bash)대로 컨테이너 안에서 Bash 쉘을 시작하고, Bash 쉘 프로세스를 종료하면 컨테이너도 중지한다.


위의 Hello World 를 데몬화 하기.


$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
023959abc767d858171dd91c812fee2dd1a37eb232911317c951ece4b7e2691c
cs


-d (detach) 옵션은 컨테이너를 백그라운드에서 실행하게 하고 컨테이너 ID 를 반환한다.

/bin/sh 로 시작되는 명령문은 1초마다 hello world 를 계속해서 출력한다.

백그라운드에서 실행하게 하였기 때문에 명령에 대한 결과가 출력되지는 않는다.



실행중인 컨테이너 확인


# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
023959abc767        ubuntu:14.04        "/bin/sh -c 'while tr"   7 seconds ago       Up 7 seconds                                 boring_hodgkin
611bed8edf61        ubuntu              "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                       awesome_leavitt
5c7c984d5d45        hello-world         "/hello"                 4 hours ago         Exited (0) 4 hours ago                       naughty_bardeen
cs


-a(all) 옵션은 모든 컨테이너를 보여주고, 옵션을 사용하지 않으면 실행 중인 컨테이너만 출력한다.

docker 는 컨테이너가 시작되면 위 출력 내용처럼 이름을 자동으로 할당한다.

docker logs 명령을 사용하여 위에 백그라운드에서 실행 중인 컨테이너 내부를 볼 수 있다.


$ docker logs [컨테이너 이름]
cs



실행중인 이미지 중지


$ docker stop boring_hodgkin
boring_hodgkin
cs



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

docker 설치 후 docker info 를 확인하자 마자 보이는 경고.


WARNING: No swap limit support


에러를 안나타나게 하려면, 시스템에서 cgroup 에 메모리와 스왑 메모리 관리를 사용할 수 있게 하면 된다.

메모리와 스왑 메모리를 사용 가능하게 하면 Docker 를 사용하지 않을 때도 메모리 오버헤드(약 1%), 성능 저하(약 10%)를 유발한다.

GNU GRUB(GRand Unified Bootloader)을 수정하여 cgroup 에 메모리와 스왑메모리를 가능하게 할 수 있다.


# vi /etc/default/grub

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"


변경된 GRUB 을 적용하고 재부팅한다.


# update-grub

Generating grub configuration file ...

Found linux image: /boot/vmlinuz-3.13.0-74-generic

Found initrd image: /boot/initrd.img-3.13.0-74-generic

done


# shutdown -r now



여기까지가 문서에 있는 얘기고...

현재 커널이 cgroup swap 메모리 제한을 하고 있지 않다는 것인데.

이것을 가능하게 세팅하고 나면 성능 저하가 생긴다는게 말인가 방구인가.

Docker 를 위해서 시스템의 성능을 저하시킨하는게 말인가 방구인가.

Docker 돌리는데는 이러나 저러나 지장은 없지만 이게 무슨 말인지 정말 궁금하긴 하다.

이것때매 cgroup 까지 찾아보기는 좀...ㅜ



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Install on Ubuntu

Tool/Docker 2016. 1. 16. 22:53

Docker 는 거의 모든 리눅스 배포판에서 사용 가능하다.

Docker 를 설치할 수 있는 Ubuntu 배포판이다.


- Ubuntu Wily 15.10

- Ubuntu Vivid 15.04

- Ubuntu Trusty 14.04 (LTS)

- Ubuntu Precise 12.04 (LTS)



요구사항


- Ubuntu 버전과 상관없이 Docker 64-bit 를 설치.

- 커널 버전 3.10 이상 (uname -r 체크)



APT 저장소 업데이트


- 현재 apt 저장소에서 docker-engine 을 사용하기 위해 APT 저장소를 업데이트 한다.


gpg(Gnu Private Guard) key 추가

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net

gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) <docker@docker.com>" imported

gpg: Total number processed: 1

gpg:               imported: 1  (RSA: 1)


저장소 리스트 추가 (해당하는 버전의 주소 한 줄만 입력)

# vi /etc/apt/sources.list.d/docker.list


# On Ubuntu Precise 12.04 (LTS)

deb https://apt.dockerproject.org/repo ubuntu-precise main

# On Ubuntu Trusty 14.04 (LTS)

deb https://apt.dockerproject.org/repo ubuntu-trusty main

# On Ubuntu Vivid 15.04

deb https://apt.dockerproject.org/repo ubuntu-vivid main

# On Ubuntu Wily 15.10

deb https://apt.dockerproject.org/repo ubuntu-wily main


새 저장소에서 리스트 갱신

# apt-get update

# apt-get upgrade


docker-engine 패키지 확인

# apt-cache policy docker-engine


Ubuntu Trusty 14.04 (LTS) 버전부터는 aufs 스토리지 드라이버를 사용할 수 있도록 linux-image-extra 패키지를 설치한다.

# apt-get install linux-image-extra-$(uname -r)



Docker 설치


# apt-get install docker-engine



Docker 데몬 실행


# service docker start



Docker 작동 확인


# docker run hello-world



* 이후의 docker 사용시에는 docker 그룹 권한이 필요하므로 유저에게 그룹 권한을 부여하거나 sudo 를 이용해서 docker 를 사용하도록 한다.

(docker 데몬은 TCP 포트 대신 Unix 소켓에 바인드하여 실행되는데 Unix 소켓은 root 에게 소유권이 있으므로 docker 데몬은 root 로만 실행 가능하다.)




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Install on Windows

Tool/Docker 2016. 1. 15. 01:13

Docker Toolbox 를 다운받아 Docker 를 설치한다.

설치 방법은 Windows 나 Mac OS X 에서나 거의 흡사하다.


Docker Toolbox 구성


- Docker Machine

- Docker Engine

- Docker GUI (Kitematic)

- Docker Compose (윈도우즈 설치시 제외)

- CLI

- Oracle VM VirtualBox


Docker 데몬이 리눅스 커널을 사용하기 때문에, 윈도우즈에서 Docker 를 사용하려면 docker-machine 을 이용해서 Docker VM 을 생성하고 연결해야 한다.

Docker VM 은 윈도우에서 Docker 데몬을 실행하기 위해 특별히 만든 초경량 리눅스 가상 머신이다.



요구사항


- Windows 7 이상

- Microsoft® Hardware-Assisted Virtualization Detection Tool 설치 http://www.microsoft.com/en-us/download/details.aspx?id=592



주의


- 리눅스 상에서 Docker 를 설치하면, Docker 는 localhost 상에서 직접 실행되므로 localhost:8000 식으로 포트를 할당할 수 있다.

- 윈도우즈에서 Docker 데몬은 리눅스 가상 머신에서 실행되므로 리눅스 가상 머신에는 localhost 가 아닌 사설 IP 가 할당된다. ex) 192.168.99.100:2345



다운로드 & 설치


- Docker Toolbox https://www.docker.com/toolbox

- 만약 VirtualBox 나 Git 이 이미 설치되어 있으면 업데이트 된다.



Docker 접속 후 컨테이너(이미지) 실행하기


- Docker Quickstart terminal 사용하는 방법과 CMD 를 사용하는 방법이 있다.

- 컨테이너와 이미지의 구분... 컨테이너는 이미지를 Docker Engine 에서 실행하면 메모리에 저장되는 인스턴스이다. 이미지를 실행한 이미지 안의 어플리케이션을 담고 있다고 보면 된다. 이미지를 여러개 실행하면 여러 컨테이너가 생성된다.



Docker Quickstart terminal 사용하여 Docker 컨테이너 실행하기

- 바탕화면에 생성된 Docker Quickstart Terminal 아이콘을 클릭하면, 자동으로 default VM 을 만들어 Docker 를 실행한다.

- 생성된 default VM 은 계속해서 사용할 수 있다.

- 터미널에서 docker -v 를 실행하여 정상 작동하는지 확인한다.

- 생성된 default VM 에는 리눅스 OS가 full 이미지로 깔린 것처럼 느낄 수 있지만, 사실 OS 구동에 필요한 자원들은 Host OS(여기서는 윈도우즈)의 것을 공유하여 사용하고, 서버 운영에 필요한 라이브러리와 프로그램만 설치되어 OS 이미지 용량을 크게 줄인 것이 일반 VM 과의 다른 점이다.




CMD 사용하여 Docker 컨테이너 실행하기

- Docker Quickstart Terminal 을 사용하지 않고 CMD 로 직접 VM 을 만드는 방법이다.


1. Docker VM 생성

C:\Users\hklee>docker-machine create --driver virtualbox default
Running pre-create checks...
Creating machine...
(default) Copying C:\Users\hklee\.docker\machine\cache\boot2docker.iso to C:\Users\hklee\.docker\machine\machines\default\boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting VM...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env default
cs


create 명령으로 default 라는 VM 이 새로 생성되었다.(VM 이름은 default 대신 다른 것으로 바꿔도 된다.)

출력문의 마지막에 쓰인것 처럼 docker-machine env default 명령으로 생성된 VM 에 접속한다.


2. 로컬 컴퓨터에서 default VM 에 접속하기 위해 환경 설정하기

C:\Users\hklee>docker-machine env default
You can further specify your shell with either 'cmd' or 'powershell' with the --shell flag.
 
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.102:2376
SET DOCKER_CERT_PATH=C:\Users\hklee\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
REM Run this command to configure your shell:
REM     FOR /f "tokens=*" %i IN ('docker-machine env default') DO %i
 
cs


default Docker VM 에 접속할 IP, PORT, PATH 등이 준비되었다.

출력문의 마지막에 쓰인 명령으로 생성된 VM 에 접속한다.

FOR /f "tokens=*" %i IN ('docker-machine env default') DO %i

or FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO %i (터미널마다 다름)


3. default VM 에 접속

C:\Users\hklee>FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO %i
C:\Users\hklee>SET DOCKER_TLS_VERIFY=1
C:\Users\hklee>SET DOCKER_HOST=tcp://192.168.99.105:2376
C:\Users\hklee>SET DOCKER_CERT_PATH=C:\Users\hklee\.docker\machine\machines\default
C:\Users\hklee>SET DOCKER_MACHINE_NAME=default
cs


4. 접속 테스트

C:\Users\hklee>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker.
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com
 
For more examples and ideas, visit:
 https://docs.docker.com/userguide/
cs



새로운 hello-world 이미지를 다운받아서 실행해 보았다.

로컬에 이미지가 없기 때문에 hub 에서 이미지를 pull 하여 실행한 것이다.

이로써 docker VM 을 생성하고 접속하는 것까지 마무으리!



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Docker

Tool/Docker 2016. 1. 14. 00:30




Docker 는 오픈 소스 컨테이너 프로젝트이다.


STEP 1. 원하는 프로그램들을 통째로 이미지화 하여 컨테이너에 넣어 보관한다.

STEP 2. 어디서든 컨테이너를 풀어 동일한 환경으로 세팅할 수 있게 해준다.



로고


로고를 보면 고래가 컨테이너 박스를 여러 개 싣고 다닌다.

컨테이너는 각종 프로그램이 들어있는 이미지를, 고래는 이 이미지들을 이곳저곳에 전달하는 의미를 가진듯 하다.



배경


요즘은 클릭 몇 번 만으로 원하는 만큼의 서버를 만들어 낼 수 있는  클라우드 서비스를 많이들 이용한다.

보통 원하는 OS를 설치하고, 각종 응용 프로그램들을 설치하고 설정하는데, 만약 서버가 100대라면 이 과정을 100번…?

프로그램 설정이 변경될 경우 서버 100대에 수정 작업을 100번??

Docker 는 이러한 반복 작업에 유용한 프로그램이며, 변경 사항 만을 업데이트 해 줄 수도 있으며, Git 처럼 버전 관리가 가능하다.



Immutable Infrastructure 패러다임


호스트 OS서비스 운영 환경(서버 프로그램, 소스 코드, 컴파일된 바이너리)을 분리한다.

서비스 운영 환경을 이미지로 생성하여 한번 설정한 서비스 운영 환경은 변하지 않는다는 개념이다.

만약 설정이 바뀌어야 한다면?

기존 이미지를 버리고 변경된 서비스 운영 환경을 이미지로 다시 생성하여 재배포 한다.

Docker는 이 Immutable Infrastructure 패러다임을 구현할 수 있도록 도와준다.



장점


서비스 운영 환경 만을 이미지로 생성했기 때문에 가볍다.(Lightweight)

어디서든 실행이 가능(Portable)하므로 PC 나 테스트 서버에서 테스트를 손쉽게 할 수 있다.

이미지를 중앙 관리하여 체계적인 배포와 관리를 할 수 있다.

클라우드 플랫폼의 자동 확장 기능(Auto Scaling)과 연동하면 손쉽게 서비스 확장이 가능하다.



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,