일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Linux
- docker
- Spring Batch
- elastic search
- Storm
- 제주
- Java
- SBT
- elasticsearch
- Angular2
- nginx
- Hbase
- apache storm
- hdfs
- 도메인주도설계
- scala
- Gradle
- DDD
- Spring Boot
- Spring XD
- hibernate
- hadoop
- 엘라스틱서치
- spark
- Spring
- Clean Code
- Domain Driven Design
- design pattern
- 스프링 배치
- intellij
- Today
- Total
욱'S 노트
Docker Engine - Hello world in a container 본문
Hello world in a container
그래서 도커의 모든것은 무엇인가?
도커는 컨테이너내에서 어플리케이션을 실행하고 세상을 만들 수 있게 한다. 컨테이너내의 어플리케이션을 실행하는 명령은 다음과 같다.
docker run
Note: 도커 시스템 설정에 따라 도커 명령에 sudo을 항당 붙어야 할 수 있다. 이러한 것을 피하기 위해 docker라는 유닉스 유저그룹을 생성하고 거기에 유저를 추가하자.
Run a Hello world
그냥 따라해보자.
$ docker run ubuntu /bin/echo 'Hello world'
Hello world
첫번째 컨테이너 구동에 성공했다.
어떤일들이 일어났는지 살펴보자.
먼저 도커 바이너리를 명시하고 실행하고하는 명령을 명시한다. docker run의 조합은 컨테이너를 실행시키는 것이다.
다음 이미지를 명시하자 : ubuntu. 이것은 컨테이너의 소스이다. 도커는 이것을 이미지라고 부른다. 이 경우 우분투 OS를 사용한다.
먼저 도커는 해당이미지가 호스트에 있는지 찾는다. 만약에 존재하지 않는다면 퍼블릭 이미지 레지스트리 도커허브로부터 이미지를 다운받는다.
그런 다음 컨테이너 내부에서 다음과 같은 커맨드를 실행한다.
/bin/echo 'Hello world'
우리는 커맨드라인에 다음과 같은 결과를 볼 수 있다.
Hello world
그런 다음 컨테이너는 어떻게 될까? 도커 컨테이너는 명령을 수행할때만 활성화된다. 여기서는 Hello world를 출력한 다음 컨테이너는 중지된다.
An interactive container
docker run 커맨드를 다시 수행하는데 이번에는 아래와 같이 수행해보자.
$ docker run -t -i ubuntu /bin/bash
root@af8bae53bdd3:/#
여기서 우리는 다시 우분투 이미지를 구동하였다. 그리고 또한 우리는 -t 와 -i라는 두가지 플래그를 함께 전달하였다. -t 플래그는 컨테이너 내부에 pseudo-tty를 할당하는 것이고, -i는 컨테이넌 표준 입력에 대한 대화형 연결을 생성하는 것이다.
또한 우리는 새로운 커맨드를 명시하였다. : bin/bash. 이것은 컨테이너 내부에 배쉬셀을 구동할 것이다.
이제 컨테이너 내부의 다음과 같은 명령들을 수행해보자.
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
pwd를 실행하면 / 루트 디렉토리가 표시하는 것을 알 수 있고, ls 명령을 통해 루트 디렉토리의 하위 디렉토리들이 나타나는 것을 알 수 있다.
exit 커맨드 또는 Ctrl-D로 배쉬 셀에서 빠져나올 수 있다.
root@af8bae53bdd3:/# exit
배쉬셀 프로세스가 종료되었으므로 컨테이너는 중지된다.
A daemonized Hello world
명령을 실행하고 바로 종료되는 것은 일반적으로 유용하지 못하다. 이제 컨테이너를 데몬으로 실행해보자. 도커에서 대부분의 컨테이너들은 데몬 형태로 실행될 것이다.
다시 다음과 같은 명령을 수행해보자.
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
d80bcaf03897ac48647ac78104607af1edca9f81795b55d171d09a179697b9d5
우리의 hello world 출력은 어디에 갔을까? 우리는 도커를 -d라는 플래그를 명시하여 구동하였다. -d 플래그는 도커를 백그라운드 데몬으로 실행하라는 명령이다.
우리는 또한 똑같은 이미지를 명시하였다. : ubuntu.
마지막으로 우리는 다음과 같은 커맨드를 실행하였다.
/bin/sh -c "while true; do echo hello world; sleep 1; done"
이것은 멍청한 데몬이다. 쉘스크립트는 무한대로 hello world를 출력할 것이다.
그러면 hello world는 왜 볼 수 없다? 우리는 대신에 긴 문자열을 리턴받았다.
d80bcaf03897ac48647ac78104607af1edca9f81795b55d171d09a179697b9d5
이것이 컨테이너 아이디이다.
Note: 컨테이너 아이디는 길고 어렵다. 다음에 짧은 아이디나 컨테이너에 이름을 쉽게 부여하는 방법을 배울 것이다.
이 컨테이너 아이디를 이용하여 hello world 데몬에 어떤일이 벌어지는지 알 수 있다.
먼저 컨테이너가 실행중이라는 것을 알아보자. docker ps 라는 명령을 수행하면 된다. docker ps는 도커 데몬에 대한 정보를 질의하는 명령이다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d80bcaf03897 ubuntu "/bin/sh -c 'while tr" 6 minutes ago Up 6 minutes high_jang
우리는 데몬 컨테이너를 확인할 수 있다. doekcer ps는 몇가지 유용한 정보를 포함하고 있는데 첫번째 내용이 컨테이너 아이디이다.
또한 우리는 컨테이너를 빌드하기 위해 사용한 이미지가 우분투임을 알 수 있고 실행시 수행된 명령 자동으로 할당된 이름등을 확인할 수 있다.
Note: 컨테이너가 시작되면 도커는 이름을 자동으로 생성한다. 하지만 이후에 직접 지정할 수 있는 방법을 배울 것이다.
컨테이너가 동작하고 있다는 것을 알 수 있다. 그러면 무엇을 하고 있는지 물어보자. docker logs 커맨드를 수행해보자. 이때 컨테이너 이름을 같이 명시해주자.
$ docker logs high_jang
hello world
hello world
hello world
hello world
hello world
docker logs 커맨드는 도커내부의 표준출력이 리턴된다.
우리는 데몬은 동작하고 있고 이것이 우리의 첫번째 도커라이즈드 어플리케이션이다.
이제 docker stop 커맨드로 컨테이너를 중지해보자.
$ docker stop high_jang
high_jang
docker stop명령은 우아하게 수행중인 컨테이너를 중지한다. 성공적으로 중지되면 컨테이너의 이름이 반환된다.
docker ps 명령으로 컨테이너가 수행중인지 알아보자.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
완벽하다. 우리의 컨테이너는 중지되었다.
'Programming > Docker' 카테고리의 다른 글
Docker - Build your own images (0) | 2016.03.11 |
---|---|
Docker - Run a simple application (0) | 2016.03.11 |
Docker Engine - Architecture (0) | 2016.02.17 |
Docker Engine - Quickstart Containers (0) | 2016.02.17 |
Docker - Tag, push, and pull your image (0) | 2016.02.02 |