본문 바로가기

Linux/Docker

Docker 를 이용해 가장 간단하게 다양한 가상환경에서 작업하기

Intro

Docker 가 보통은 Image를 이용해 소프트웨어를 배포할 때 많이 쓰이는 것 같긴 하지만, 본연 그대로를 다시 생각해보면 Docker 는 OS 를 가상화시켜주는 소프트웨어이기 때문에, 어떤 독립적인 작업공간이 필요할 때 Docker를 이용하는 것도 의외로 간편하고 재미있어요.

예를 들어 내가 단순히 Python 프로그램을 새로운 방식으로 시도하고 있다면 그냥 한 프로젝트 디렉토리를 만들어서 이용하거나 Virtual Environment를 이용하면 되겠지만, NginxApache, Vim 설정 등 얕은 깊이에서 노는 것이 아니라, 사용자나 OS와 관련된 작업을 한다면. 내 원래의 환경에서 작업하기 조금 부담스럽죠.

혹은 강의 영상을 찍거나 블로그에 글을 올리기 위한 Demo 를 위해서도 초기환경부터 시작하는 모습을 보여주기 위해 Docker로 간단하게 초기와 같은 환경을 구축할 수 있어요.

Super Simple Dockerfile

우선은 Dockerfile 을 대충은 어떻게 쓰는 지 알아야합니다. 모른다면 찾아보고 오시거나 그냥 '아 그렇구나' 정도로만 보시면 될 듯 합니다.

FROM ubuntu:18.04
ENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]
# ENTRYPOINT "/bin/bash"

ENTRYPOINT 두 줄 중 아무거나 사용하셔도 되고, 위의 단 두 줄을 이용해, ubuntu:18.04의 작업환경을 만들어 줄 수 있는 Image를 build 할 수 있습니다.

How to Use and Commands

docker build . -t myubuntu Image를 빌드합니다.

docker run -it --name=ubuntu_container myubuntu build된 Image를 이용해 Container를 만들고 Run 합니다. 컨테이너의 이름은 ubuntu_container로 하겠습니다.

docker ps 새로운 터미널 창을 켜서 입력해보면, 해당하는 컨테이너가 목록에 존재합니다.

docker ps -a 만약 작업 중이면 컨테이너의 bash창을 나가면 컨테이너는 종료됩니다. 그럼 docker ps -a에서 종료된 컨테이너를 포함한 리스트를 볼 수 있습니다.

docker start -i {{container_name}} 컨테이너 이름을 인자로 주어 종료된 컨테이너를 다시 시작할 수 있습니다. Interactive하게 컨테이너와 Input Ouput을 공유하므로 -i 인자를 줍니다.

Examples #1 Ubuntu

제 환경이 ubuntu 환경이긴하지만 ubuntu Image로 한 번 작업을 해보겠습니다.

위에 적었던대로 Dockerfile 작성
my_ubuntu라는 Image Name으로 Build
my_ubuntu 이미지를 바탕으로 ubuntu_container라는 컨테이너 run

가상환경이 잘 구축되었고, 그 곳의 Bash Shell을 사진처럼 이용할 수 있습니다.

실행중인 컨테이너의 terminal 창이 아닌, 새로운 terminal 창에서 docker ps 를 쳐보면, 아까 그 container가 run 중임을 알 수 있습니다.

컨테이너가 종료되었다면 다시 start 를 통해 running status로 만들 수 있고, 컨테이너의 terminal 창을 이용할 거니까 -i 인자를 줬습니다.

Examples #2 CentOS

이미지를 centos:7로 바꿔보겠습니다.
똑같이 build 해주시고, 이번엔 이미지 이름이 my_centos
run 한 뒤 CentOS 안에 있는 것 처럼 작업 가능

방금 Build 한 Image를 이용해 Run 하여 Bash shell 창에 들어와 보면 CentOS 로 작업 중인 것처럼 작업할 수 있습니다.

Outro

Docker 를 이용해 아주 간단하게 독립 가상 공간을 구축하는 것을 알아보았습니다.
저 같은 경우는 Nginx를 처음 배울 때 몇 번 사용해보기도 했고, Python 개발환경을 구축할 때에도 자주 써봤던 것 같아요.
원래 Docker는 Container가 전달받은 하나의 작업을 하고 바로 종료되어버리는데, ENTRYPOINTbash를 줌으로써 터미널 자체를 이용하는 식으로 하면 터미널창을 나가지 않는 이상 계속해서 Container를 살려둘 수 있어서 좋은 것 같아요