앞서 도커 기본 커맨드에 간단히 살펴보았는데 이중 컨테이너를 시작하는 경우 사용되는
docker run 명령에 대한 옵션 부분을 좀 더 자세히 살펴보자.
Pulling Image
docker run 명령은 이미지 다운로드(이미지가 없는 경우) + 이미지 실행 을 수행하는 명령으로
해당 이미지가 없으면 도커 레지스트리에서 이미지를 다운로드 한 다음 실행시킨다.
$ docker run redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
8d691f585fa8: Pull complete
8ccd02d17190: Pull complete
4719eb1815f2: Pull complete
200531706a7d: Pull complete
eed7c26916cf: Pull complete
e1285fcc6a46: Pull complete
Digest: sha256:fe80393a67c7058590ca6b6903f64e35b50fa411b0496f604a85c526fb5bd2d2
Status: Downloaded newer image for redis:latest
1:C 06 Nov 2019 01:57:38.638 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 06 Nov 2019 01:57:38.638 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 06 Nov 2019 01:57:38.638 # Warning: no config file specified, using the default config. In order to specify a config file use red is-server /path/to/redis.conf
1:M 06 Nov 2019 01:57:38.641 * Running mode=standalone, port=6379.
1:M 06 Nov 2019 01:57:38.641 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 06 Nov 2019 01:57:38.641 # Server initialized
|
Process
사용자가 docker run unbuntu 라고 실행하면 즉시 종료되어 버린다.
왜냐하면 도커 컨테이너는 내부에 실행중인 프로세스가 없는 경우에는 자동으로 종료시키기 때문이다.
이외에 실행중이던 컨테이너 내부의 웹 서비스가 중지되거나 크래쉬가 나면 컨테이너가 종료된다.
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
$ docker run centos
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
|
Foreground
docker run 명령시 프로세스가 로컬에서 포그라운드 (attach) 모드로 실행되어 현재 프롬프트가 대기 상태가 된다.
만약 docker run 명령후 프로상태를 계속 이용하려면 docker run 명령을 백그라운드로 실행해야 한다.
이를 위해 -d (detach) 옵션을 붙여 명령어가 백그라운드로 실행되도록 할 수 있다.
# run container foreground
$ docker run <imageName>
# run container background
$ docker run -d <imageName>
|
Tag
docker 을 imageName 으로만 실행하면 latest 태그를 기본적으로 할당한다.
만약 특정 Tag 의 image 를 실행하고자 하는 경우 <imageName>:<tagName> 형식으로 이미지명을 기술해야 한다.
사용 가능한 태그는 도커 레지스트리의 태그를 확인해 봐야 한다.
$ docker run redis:4.0
Unable to find image 'redis:4.0' locally
4.0: Pulling from library/redis
8d691f585fa8: Already exists
8ccd02d17190: Already exists
4719eb1815f2: Already exists
5b29e5956b2b: Pull complete
843731137de7: Pull complete
690896382cff: Pull complete
Digest: sha256:cec5a7380743294ad8f1eb641cbf7d8b594fcd085ca32bd962b4f67d6d4389db
Status: Downloaded newer image for redis:4.0
...
|
STDIN
기본적으로 도커는 실행시 입력을 읽을 수 있는 터미널이 없으며
옵션 (-t) 로 터미널을 컨테이너에 제공하더라도 비대화(Non-Interactive) 쉘로
터미널을 실행하기 때문에 사용자 입력을 받아들이는 Standard Input (STDIN) 을 리슨하지 않는다.
그래서 만약 아래와 같이 STDIN 입력을 받아 실행해야 하는 프로그램이 있더라도
컨테이너를 실행시 컨테이너에 포함된 이 sh 파일이 실행되더라도
사용자 입력을 무시하고 결과가 바로 출력된다.
만약 대화형 쉘 + 터미널 모드로 사용자 입력을 사용하고자 한다면 대화형 쉘 옵션인 -i 와
터미널을 제공하기 위한 -t 옵션을 주어야 한다.
Port Mapping
아래와 같이 컨테이너를 실행한 경우
현재 사용자가 사용하고 있는 도커 호스트 (사용자 데탑) 은 아래와 같은 상태가 된다.
즉 도커 호스트의 IP 가 있고 컨테이너는 인터널 IP 가 탑재되며 5000 번 포트가 열린 상태가 된다.
그래서 사용자가 http://172.17.0.2:5000 으로 접속할 수 있다.
문제는 이렇게 사용하는 경우 도커 컨테이너의 인터널 IP 를 docker inspect 명령으로 조회해야 하며
컨테이너의 IP 는 실행, 정지, 재실행 등의 동작이 반복될 때 항상 바뀌기 때문에 이렇게 사용하면 안된다.
즉 이런 경우 도커 호스트와 컨테이너 간에 -p 옵션을 통해 포트 맵핑을 하여 서비스를 외부로 노출시켜야 한다.
그래서 포트 맵핑을 위와 같이 하게 되면 http://192.168.1.5:80 으로 접속시
도커 호스트의 포트 80 의 모든 트래픽은 도커 내부의 포트 5000 으로 라우팅 된다.
그래서 이 포트 매핑을 사용하면 컨테이너에서 설령 같은 포트를 사용하고 있더라도
여러 서비스를 동시에 사용할 수 있게 되는 것이다.
Volume
MySQL 을 컨테이너로 운용한다고 생각해보자.
이 경우 사용자에 의해 쌓인 DB 데이터가 데이터가 도커 호스트에 쌓이지 않으며 컨테이너 내부에 저장된다.
그래서 아래와 같이 컨테이너가 중지되면 데이터가 저장되지 않고 사라진다.
그래서 데이터가 중요한 경우에는 컨테이너 데이터를 도커 호스트에 저장하도록 마운트 볼륨을 구성해야 한다.
이 경우 -v 옵션을 통해 마운트 볼륨을 사용할 수 있게 된다.
Link
Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link 옵션을 사용한다.
$ docker run --link <컨테이너이름>:<별칭>
|
Inspect Container
컨테이너의 설정을 확인하기 위해서 docker inspect 명령을 사용할 수 있다.
이 명령은 컨테이너의 상태, 마운트, 구성 데이터, 네트워크와 같은 컨테이너의 모든 세부 정보를
JSON 형식으로 반환한다.
Log
컨테이너 실행 로그를 보고 싶은 경우는 docker logs 명령을 사용할 수 있다.
Exercise
'Container > Docker' 카테고리의 다른 글
08. Docker Image Inspect (0) | 2020.01.14 |
---|---|
07. Docker Image (0) | 2020.01.14 |
04. Docker CE 설치하기 (0) | 2020.01.14 |
03. Docker 시스템 (0) | 2020.01.14 |
02. 가상 머신과 Docker (0) | 2020.01.14 |