본문으로 바로가기

Docker 컨테이너 라이프 사이클


Docker 컨테이너는 일종의 라이프 사이클을 가진다.

Docker 이미지를 create하면 이미지로 컨테이너를 생성한다. 이미지는 일종의 docker에서 특정 어플리케이션이 동작하기 위해 필요한 디렉터리와 파일의 집합 이다. 

docker create 를 통해 이미지에 있는 Linux 디렉터리와 파일들로 스냅샷을 만들게 된다. create된 컨테이너는 docker run 명령어를 통해 실제 사용할 수 있도록 구동된다. create명령 없이 run 명령어만으로도 자동으로 create와 run을 동시에 수행해준다.

구동중인 컨테이너는 docker stop 명령어로 중시지킬 수 있고, docker start 명령어로 중지 상태인 컨테이너를 다시 구동시킬 수 있다. 컨테이너를 완전히 삭제하려면 docker rm 명령어를 사용한다.


이 밖에도 docker container의 라이프 사이클의 다양한 상태와 명령어를 잘 표현한 그림이 있어서 가져왔다.

자세히 살펴보면 docker container의 lifecycle을 쉽게 이해할 수 있을 것이다.


(출처 : http://docker-saigon.github.io/post/Docker-Internals/)




docker run(컨테이너 생성/실행)


내려받은 이미지를 컨테이너로 구동시키기 위해서는 docker run 명령어를 사용한다.


docker run [옵션] <이미지명>[:태그명] [값]


※ docker run 기본 옵션

-a , --attach : 표준 입/출력 표준 에러 출력을 연결 (STDIN, STDOUT, STDERR)

--cidfile : 컨테이너 ID를 파일로 출력한다.

-d, --detach : 컨테이너를 생성하고 백그라운드에서 실행시킨다.

-i, --interactive : 컨테이너 표준 입력을 연다.(컨테이너 내부에서 발생하는 일을 사용자에게 보여준다)

-t, --tty : 단말 디바이스(tty)를 사용한다.(터미널과 비슷한 환경으로 조성해준다.)

--name : 컨테이너명을 지정한다.


-d옵션 없이 실행하면 [값] 을 가지고 컨테이너에서를 포어그라운드에서 실행한다.

nginx 이미지를 docker run -it --name nginx2 nginx bash 라는 명령어로 실행한 결과이다.



명령을 실행하면 nginx 이미지가 컨테이너로 구동되며, 바로 bash 상태로 들어온다. 

여기서 exit를 쳐서 컨테이너를 빠져나온 뒤, docker ps 명령어로 컨테이너 구동 상태를 확인하면 구동중인 컨테이너가 없는 것으로 나온다.

그렇다면 컨테이너를 백그라운드 상태로 실행하려면 어떻게 해야 할까?

백그라운드 실행 옵션인 -d 명령어를 사용하면 된다.


※컨테이너 백그라운드 실행 관련 옵션

-d, --detach : 컨테이너를 백그라운드에서 실행

-u, --user : 사용자명을 입력

--restart : 커맨드 실행 결과에 따라서 재기동을 설정 (no, on-failure:횟수 or always)

--rm : 커맨드 실행 완료 후 컨테이너를 자동으로 삭제시키는 옵션


이번에는 docker run -d --name nginx3 nginx 명령어로 nginx 이미지를 백그라운드로 구동시켜 보자.



컨테이너를 백그라운드에서 구동시키고, docker ps 명령어로 확인해 봤을 때 계속 구동중인 것을 확인할 수 있다.




docker run 컨테이너 네트워크 설정


우리는 nginx 라는 웹 서버를 컨테이너로 구동시켰지만, 외부에서 이 서버에 접근할 수 없다. 별도의 네트워크 설정을 해주지 않았기 때문이다.

docker run 명령어로 컨테이너를 생성하며 옵션으로 네트워크 설정을 해 줄 수 있다.


※ docker run 컨테이너 네트워크 설정 관련 옵션

--add-host : 컨테이너 내부의 /etc/hosts에 호스트 이름과 IP 주소를 설정해준다. (없으면 임의의 ip adress 할당)

--dns : DNS 서버의 IP 주소를 설정해준다.

--expose : 포트 번호 할당

--mac-address : 컨테이너 MAC 주소 설정

--net : 컨테이너 네트워크 설정 (bridge, none, container:<name or d> , host)

-h, --hostname : 컨테이너 호스트 이름 설정

-P, --publish-all : 임의의 포트를 컨테이너에 할당

-p [호스트포트]:[컨테이너포트] : 호스트와 컨테이너 포트를 매핑시켜준다.

--link : 다른 컨테이너에서 접근시 이름을 설정


다양한 네트워크 설정 옵션이 있지만, 가장 많이 사용되는 옵션은 포트 매핑 -p 옵션이다.

nginx 컨테이너의 80 포트를 호스트의 8080 포트와 매핑시켜 구동시킨 웹 서버에 접근할 수 있도록 명령해보다.


docker run -d --name nginx4 -p 8080:80 nginx 

로 nginx 컨테이너의 80 포트와 호스트의 8080 포트를 매핑 시켰다.



명령 실행 후, ps 명령으로 구동 정보를 확인해 보면 포트가 매핑된 정보를 확인할 수 있다.

curl 명령어로 8080 포트에 접근해보면 nginx 서버에 정상적으로 접근할 수 있다.

외부 윈도우OS에서 접속해도 서버에 접속 가능한 것을 확인할 수 있다.



nginx 이미지를 pull 받고, 단 한줄의 명령만으로도 외부에서 접근 가능한 웹 서버를 띄우는 것에 성공했다.

이처럼 docker를 사용하면 잘 말아진 이미지만 있으면 얼마든지 손쉽게 서버 환경을 구축할 수 있다.



 Other Contents 

댓글을 달아 주세요

티스토리 툴바