본문 바로가기
infra/Docker

[Docker] docker를 이용하여 centOS 환경을 만들어 보자

by hjhello423 2020. 2. 7.

docker는 사용할 줄 알면 매우 편리한 도구입니다.

docker가 설치되어 있다는 가정하에 centOS 이미지를 다운로드하고 실행시켜 리눅스 환경을 구성해 보겠습니다.

저는 윈도 10 환경에서 진행하였지만 os환경에 상관없이 아래의 내용을 진행하셔도 됩니다.

 

참고로 아래의 docker 버전을 이용하였습니다.

$ docker --version
Docker version 19.03.5, build 633a0ea

이미지 다운로드

먼저 centOS 이미지를 다운로드하여 보겠습니다.

따로 버전 정보를 입력해주지 않으면 latest 버전을 다운로드합니다.

$ docker pull centos

이미지를 다운로드하고 아래의 명령어를 입력하면 다운로드한 docker 이미지를 모두 볼 수 있습니다.

 $ docker image ls
 REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
<none>                  <none>              4cea602afd18        About an hour ago   356MB
hongjun423/cheers2019   latest              ad8619efe4e1        About an hour ago   4.01MB
centos                  latest              470671670cac        2 weeks ago         237MB
ubuntu                  latest              ccc6e87d482b        3 weeks ago         64.2MB
golang                  1.11-alpine         e116d2efa2ab        5 months ago        312MB

컨테이너 실행

$ docker run -it --name centos_test centos
$ docker run -it --name ubuntu_test ubuntu  #이렇게 하면 우분투를 실행 합니다.

-it 옵션은 가장 많이 사용하게 될 옵션입니다.

각각은 아래와 같은 의미를 가집니다.

-i, --interactive      Keep STDIN open even if not attached ( STDIN을 부착하지 않아도 열린 상태로 유지합니다.)

-t, --tty                Allocate a pseudo-TTY (텍스트 기반의 터미널(TTY)을 애뮬 레이트 해줍니다.)

 

만약 정상적으로 실행됐다면 아래와 같은 정보를 확인할 수 있습니다.

#프롬프트(root)에서 hostname을 입력해 보세요

결괏값으로 나오는 문자열은 docker 컨테이너의 id값을 보여 줍니다.

[root@230b0ec3be53 /]# hostname
230b0ec3be53

이제 exit를 입력하면 컨테이너가 종료되고 빠져나오게 됩니다.

docker ps - a 명령어를 통해 모든 상태의(run, stop) 컨테이너 리스트를 확인해 보겠습니다.

위에서 hostname 명령어로 확인했던 id 값도 확인할 수 있습니다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
230b0ec3be53        centos              "/bin/bash"              5 minutes ago       Exited (0) 3 seconds ago                          centos_test
6489b3e784b2        ubuntu              "/bin/bash"              9 minutes ago       Exited (130) 9 minutes ago                        ubuntu_test
552aaf3065d0        ubuntu              "bash"                   25 minutes ago      Exited (130) 20 minutes ago                       nostalgic_nash
f07c6dc11805        centos              "C:/Users/chj/my_hom…"   31 minutes ago      Created                                           test1

 

방금 exit 명령어를 입력하고 컨테이너에서 빠져나왔는데 centos_test 컨테이너가 Exited 상태인 것을 확인할 수 있습니다.

Exited 상태라는 건 컨테이너가 종료되어 더 이상 동작하지 않는다는 의미입니다.


컨테이너 삭제

이번엔 exit를 입력하고 빠져나오더라도 컨테이너가 종료되지 않도록 데몬 상태로 실행되도록 해보겠습니다.

먼저 실행했던 centos_test  컨테이너를 삭제시켜보겠습니다.

docker rm centos_test


 



백그라운드 컨테이너

docker에는 -d 옵션을 이용하여 컨테이너를 백그라운드 모드로 실행시킬 수 있습니다.

-d, --detach   Run container in background and print container ID

$ docker run -d -it --name centos_test centos
b3c7958043e662ca990b1722493e6525a029d681a22c93250bbf14e9d5c4c195

-d 옵션을 이용하면 컨테이너를 백그라운드 모드로 실행하고 컨테이너의 id를 출력합니다.

실행 중인 컨테이너의 리스트를 확인해 보면 centos_test 컨테이너가 실행 중인 것을 확인할 수 있습니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b3c7958043e6        centos              "/bin/bash"         34 seconds ago      Up 33 seconds                           centos_test

이렇게 실행 중인 컨테이너에 접근할 때는 attach를 사용합니다.

-a, --attach list    Attach to STDIN, STDOUT or STDERR

$ docker attach centos_test
[root@b3c7958043e6 /]# 

하지만 또 다시 exit를 입력하고 빠져나오면 컨테이너는 종료 되게 됩니다.

왜 컨데이터가 종료되는걸까요?

우리는 -it 옵션을 이용해서 상호작용적이고(-i : interinteractive)인 tty(-t : Allocate a pseudo-TTY)를 백그라운드환경(-d : Run container in background)으로 컨테이너를 실행 하였습니다.

그리고 단순히 -a 옵션을 이용하여 인터렉티브 쉘과 stdin과 stdout을 연결해주었을 뿐입니다.

그리고 쉘에서 exit 입력하여 종료시켰으므로 쉘이 종료되고 컨테이너도 동작을 마치게 되는것입니다.


컨테이너 유지 시키기

이제 컨테이너가 종료 되지 않도록 해보겠습니다.

-c 옵션을 이용하여 명령어를 실행 하도록 지정 하였습니다.

10초마다 'is alive' 문자열을 출력하여 쉘을 빠져나오더라도 무한 루프되기 때문에 컨테이너가 종료 되지 않습니다.

실제로 웹서버와 같은 소프트웨어도 이런 구조로 동작하고 있습니다.

$ docker run -d --name centos_test centos /bin/bash -c "while true; do echo 'is alive'; sleep 10; done"
8151918f3307b7e855e295f73ee56c7e7fc98f6c0313fb69fd9864fa5b994996

이상태에서 attach로 컨테이너에 접근하게 되면 아무 작업도 진행할 수 없습니다.

attach는 단순히 stdin, stdout, stderr을 연결시키고 보여주는 역할만을 하기 때문입니다.

10초 마다 출력되는 'is alive' 문자열만 계속 보여지게 됩니다.

docker attach centos_test
is alive
is alive
... (생략)
is alive
is alive
is alive

이제 exec 옵션을 이용해 실제 동작 중인 컨테이너에 명령을 실행 시켜 보겠습니다.

/bin/bash 명령어를 실행시키도록 하여 컨테이너에 접근하고 명령을 입력할수 있게 하면 됩니다.

 

exec        Run a command in a running container

docker exec -it centos_test /bin/bash
[root@207ef18222cf /]#

이제 exit를 입력하고 빠져나오더라도 컨테이너가 계속 동작중인것을 확인할 수 있습니다.


docker 컨테이너를 이용하여 애플리케이션을 구축하면 애플리케이션이 무한 루프로 동작하고 있어야 컨테이너가 종료되지 않습니다.

nginx나 mysql 같은 소프트웨어들은 이미 모두 무한루프로 동작하도록 구현되어 있습니다.

docker 컨테이너에서 실행되는 어플리케이션은 모두 foreground 모드로 동작되도록 구현해야 합니다.

 


추가..

여기까지 따라왔으면 docker를 이용하여 centOS환경을 구성이 완료되었습니다.

여기부턴 제가 윈도우환경에서 실제 리눅스 서버처럼 사용하기 위한 명령어를 설명없이 요약하여 정리해 보았습니다.

참고로만 봐 주세요.

 

컨테이너 생성및 접근

docker run -d --privileged --name centos_test -p 9022:22 centos:7 init -c "while true; do echo 'is alive'; sleep 100; done"

docker exec -it centos_test /bin/bash

 

몇가지 yum

Another app is currently holding the yum lock 발생시 rm -rf /var/run/yum.pid로 해결

yum -y update
yum -y install openssh-server openssh-clients net-tools

 


참고

개발자가 처음 Docker 접할 때 오는 멘붕 몇 가지 

docker docs

 

 

 

 

반응형

댓글