일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 엘라스틱서치
- Spring Batch
- 제주
- Storm
- Linux
- 스프링 배치
- spark
- Angular2
- hibernate
- hadoop
- Java
- Clean Code
- Spring XD
- Hbase
- elasticsearch
- Gradle
- nginx
- docker
- intellij
- SBT
- Spring Boot
- DDD
- scala
- hdfs
- 도메인주도설계
- Spring
- design pattern
- elastic search
- apache storm
- Domain Driven Design
- Today
- Total
욱'S 노트
Docker Engine - Quickstart Containers 본문
Quickstart Docker Engine
이 퀵스타트는 도커 엔진이 동작하도록 설치가 되어있다고 가정한다. 엔진이 설치되었는지를 확인하기 위해 다음과 같은 명령을 수행해보자.
$ docker info
Containers: 12
Images: 14
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 38
Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.0.9-boot2docker
Operating System: Boot2Docker 1.8.2 (TCL 6.4); master : aba6192 - Thu Sep 10 20:58:17 UTC 2015
CPUs: 1
Total Memory: 1.956 GiB
Name: default
ID: HKZF:4Z5M:L7XJ:ISX7:HEVF:BDZS:EBWI:LOR3:KVS4:JNRI:UDSA:V4SH
Debug mode (server): true
File Descriptors: 12
Goroutines: 16
System Time: 2016-02-17T01:28:02.039605398Z
EventsListeners: 0
Init SHA1:
Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
Username: devsun98
Registry: https://index.docker.io/v1/
Labels:
provider=virtualbox
만약 도커를 설치했는데, 명령을 찾을 수 없다거나 /var/lib/docker/repositories에 대한 권한이 없다고 나온다면 불완전하게 도커 엔진이 설치되었거나 엔진에 접근할 수 있는 권한이 불충분하다는 것이다. 도커 엔진에 대한 명령은 도커 그룹이나 루트 유저로 실행해야 한다.
엔진 시스템 설정에 따라 각 도커 명렬은 sudo로 수핼시켜야 할 수 있다. sudo를 회피하는 하나의 방법은 docker라는 유닉스 그룹을 생성하고 전체 도커 커맨드에 접근할 수 있는 유저를 docker 그룹에 추가하는 것이다.
도커 엔진의 설치나 sudo 설정에 대한 더 많은 정보를 얻으려면 당신의 os에 설치 지시에 언급된 내용을 잘 살펴보자.
Download a pre-built image
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
f15ce52fc004: Pull complete
c4fae638e7ce: Pull complete
a4c5be5b6e59: Pull complete
8693db7e8a00: Pull complete
library/ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:457b05828bdb5dcc044d93d042863fba3f2158ae249a6db5ae3934307c757c54
Status: Downloaded newer image for ubuntu:latest
이 명령은 도커허브에서 ubuntu라는 이미지를 찾은 후 로컬 이미지 캐쉬로 해당 이미지를 다운로드 받는 것이다.
Running an interactive shell
우분투 이미지에 있는 대화형 쉘을 실행해보자.
$ docker run -i -t ubuntu /bin/bash
root@5615e8b6c789:/#
-i 플래그는 대화형 컨테이너를 실행하는 것이다. -t 플래그는 표준입출력을 위한 pseudo-TTY를 생성한다.
exit 명령을 사용하지 않고 tty를 분리한다면 Ctrl-p + Ctrl-q 이스케이브를 사용하면 된다. 컨테이너를 exit로 나오면 stopped 상태로 컨테이너는 계속 존재할 것이다. stopped 나 running 상태의 모든 컨테이너를 리스트할려면 docker ps -a 커맨드를 사용하면 된다.
To detach the tty without exiting the shell, use the escape sequence Ctrl-p + Ctrl-q. The container will continue to exist in a stopped state once exited. To list all containers, stopped and running, use the docker ps -a command.
Bind Docker to another host/port or a Unix socket
주의 : 기본 도커 데몬에 바인딩된 TCP 포트 또는 유닉스 docker 유저 그룹을 변경시키면 non-root 유저가 호스트에 대한 root 권한을 획득할 수 있는 보안 리스크가 증대된다. docker에 접근 권한을 확실히 해야한다. 만약 TCP port를 바인딩하면 누구든지 해당 포트로 모든 도커에 접근할 수 있다.
-H 플래그로 도커 데몬이 특정한 IP나 포트를 listen할 수 있도록 만들 수 있다. 기본적으로 도커 데몬은 unix:///var/run/docker.sock에 있는 내용들을 루트 유저에 의한 로컬 커넥션만을 허용한다. 0.0.0.0:2375 또는 특정한 호스트 IP로 세팅하면 모두에게 접근권한을 주는 것이다. 하지만 이것은 권장하지 않는데 이유는 데몬이 실행되고 있는 호스트에 루트 권한을 획득할 수 있는 위험이 있기 때문이다.
비슷하게 도커 클라이언트는 -H를 사용하여 커스텀 포트로 접속할 수 있다. 도커 클라이언트는 기본적으로 unix:///var/run/docker.sock를 리눅스에서는 사용하고 윈도우에서는 tcp://127.0.0.1:2376을 사용한다.
-H는 접근 호스트와 포트를 할당한다.
tcp://[host]:[port][path] or unix://path
For example:
tcp:// -> TCP 접속 로컬호스트에서 2376 포트로 TLS 암호화가 설정된 상태로 가능 또는 2375 포트로 plain text 커뮤니케이션 가능
tcp://host:2375 -> host:2375 상에 TCP 접속
tcp://host:2375/path -> host:2375으로 TCP 접속하고 모든 리퀘스트에 path를 첨가
unix://path/to/socket -> path/to/socket에 위치한 Unix 소켓
-H 하고 비워두면 -H를 전달하지 않았을때와 같음
-H 플래그는 TCP 바인딩을 위한 단순한 폼을 허용함
`host:` 또는 `host:port` 또는 `:port`
도커를 데몬모드로 실행
$ sudo <path to>/docker daemon -H 0.0.0.0:5555 &
우분투 이미지를 다운로드
$ docker -H :5555 pull ubuntu
또한 우리는 다수의 -H를 사용할 수 있다. 예를들어 tcp와 유닉스 소켓을 모두 리슨하고 싶다면 다음과 같이 한다.
도커를 데몬 모드로 실행
$ sudo <path to>/docker daemon -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
디폴트 유닉스 소켓을 이용하여 우분투 이미지를 다운로드
$ docker pull ubuntu
또는 TCP 포트를 사용해서 다운로드
$ docker -H tcp://127.0.0.1:2375 pull ubuntu
Starting a long-running worker process
long-running 프로세스는 매우 유용하다.
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")
작업의 아웃풋을 수집하자.
$ docker logs $JOB
작업을 종료하자.
$ docker kill $JOB
Listing containers
$ docker ps # running 중인 컨테이너 리스트
$ docker ps -a # 모든 컨테이너 리스트
Controlling containers
# 새로운 컨테이너 시작
$ JOB=$(docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")
# 컨테이너 종료
$ docker stop $JOB
# 컨테이너 시작
$ docker start $JOB
# 컨테이너 재시작
$ docker restart $JOB
# 컨테이너 킬
$ docker kill $JOB
# 컨테이너 제거
$ docker stop $JOB # 제거할 컨테이너는 반드시 종료되어야 한다.
$ docker rm $JOB
Bind a service on a TCP port
# 컨테이너의 4444 포트를 바인드 시켜 netcat이 해당 포트를 리슨하게 한다.
$ JOB=$(docker run -d -p 4444 ubuntu:12.10 /bin/nc -l 4444)
# 컨테이너의 Nated 퍼블릭 포트는 무엇인가?
$ PORT=$(docker port $JOB 4444 | awk -F: '{ print $2 }')
# 퍼블릭 포트로 연결한다.
$ echo hello world | nc 127.0.0.1 $PORT
# 네트워크 연결이 잘 동작하는것을 확인한다.
$ echo "Daemon received: $(docker logs $JOB)"
Committing (saving) a container state
컨테이너 상태를 이미지에 저장한다. 상태는 재사용될 수 있다.
컨테이너를 커밋하면 도커는 소스 이미지와 현재 상태의 이미지와 차이점만을 저장한다. 가지고 있는 이미지를 출력하기 위해서는 docker images 명령을 사용한다.
# 새로운 이름을 가진 이미지로 컨테이너를 커밋한다.
$ docker commit <container> <some_name>
# 이미지를 리스트한다.
$ docker images
'Programming > Docker' 카테고리의 다른 글
Docker Engine - Hello world in a container (0) | 2016.02.18 |
---|---|
Docker Engine - Architecture (0) | 2016.02.17 |
Docker - Tag, push, and pull your image (0) | 2016.02.02 |
Docker - Create a Docker Hub account & repository (0) | 2016.02.02 |
Docker - Build your own imag (0) | 2015.10.12 |