Tips

[도커] 윈도우 유저가 리눅스를 필요로 할 때

dextto™ 2022. 7. 25. 20:56

윈도우 유저는 자연스럽게 개발 환경을 윈도우 기반으로 구축한다. 하지만 만약 여러분이 백엔드 개발자가 되고자 한다면, 아니 꼭 백엔드가 아니라고 해도 리눅스를 어느 정도 다룰 줄 알아야 한다. 개발 서적을 보다 보면 예제가 리눅스 기반으로 작성되어 있는 경우도 많다. 물론 윈도우 서버 제품군도 성능이 우수하며 계속 발전하고 있다. 하지만 현업에서는 여러 가지의 이유로 대부분 리눅스 기반의 OS를 서버의 운영 체제로 선택한다. 심지에 최근에는 윈도우를 만든 마이크로소프트조차 리눅스 생태계로 들어왔다.

Microsoft Loves Linux


 

당장 리눅스가 필요할 때 어떻게 해야 할까?

  1. 컴퓨터를 새로 하나 장만해서 리눅스를 설치한다.
  2. 윈도우가 설치된 컴퓨터에 멀티 부팅이 가능하도록 리눅스를 설치한다.
  3. 버추얼박스(VirtualBox) 같은 가상화 앱을 이용해서 윈도우 내에서 리눅스를 창(window)으로 구동시킨다.
  4. 도커로 리눅스 컨테이너를 구동시킨다.

이 글은 4번 방법에 대해 설명하고자 한다. 나머지 방법은 모두 많은 자원(돈, 메모리, 디스크)을 필요로 한다.

가상화에 대한 간략한 이해

가상화 기술은 크게 2가지로 분류할 수 있다. 그림의 왼쪽에 있는 방법이 위에서 3번 방식에 해당한다. 호스트 운영체제 위에 가상화를 가능하게 해 주는 엔진(하이퍼바이저)를 설치하고 그 위에 또 다른 운영체제를 설치하는 방식이다. 이 방식은 설치된 게스트 OS는 완전히 독립된 환경을 가지기 때문에 별도의 메모리, 디스크 등의 자원을 할당해 주어야 한다. 그리고 그 위에서 실행되는 App은 게스트 OS에 할당된 자원을 사용한다.

 

두번째 방식은 오른쪽 그림과 같이 여러 컨테이너(그림에서 App)가 가상화 엔진(그림에서 도커 엔진)위에서 구동하는 방식이다. 이렇게만 보면 첫 번째 방식과 차이가 없어 보이지만, 컨테이너는 마치 하나의 프로세스와 같이 동작하게 된다. 즉, 별도의 OS를 다시 설치할 필요가 없고 필요한 자원은 호스트 OS의 자원을 직접 사용한다. 물론 도커 엔진에 할당되는 자원의 크기는 정해져 있고 변경할 수 있다. 컨테이너는 그 크기가 매우 가볍고 구동 시간이 훨씬 빠르다. OS를 설치해서 실행하지 않아도 되기 때문에 당연한 일이다. 단점이라고 하면 뒤에서 보겠지만, 만약 리눅스를 컨테이너로 실행한다고 했을 때, 리눅스 전체를 설치하지 않기 때문에 개발에 필요한 툴이 기본으로 설치되어 있지 않다는 것인데 필요한 툴만 설치해서 사용하면 된다.

그 외 도커와 관련하여 자세한 설명은 다른 자료를 참고하자.

출처:  https://medium.com/@darkrasid/docker와-vm-d95d60e56fdd

이제 윈도우에서 리눅스를 실행해 보도록 하자. 먼저 도커를 설치해야 한다.

도커 다운로드 페이지에서 윈도우 엔진을 내려받아 설치하자.

커맨드 창에서 도커가 잘 설치되었는지 버전을 확인하는 cli 명령을 수행해 보자.

d:\> docker --version
Docker version 20.10.17, build 100c701

이제 리눅스 배포판 중 인기있는 우분투를 실행해 보자. docker run 명령어를 처음 실행하면 로컬 컴퓨터에 우분투 이미지가 없기 때문에 도커 허브에서 이미지를 다운로드 받는다. 버전을 지정하지 않았기 때문에 latest 버전이 다운로드된다. -it 옵션은 키보드 입력을 컨테이너의 표준 입력(STDIN)에 연결해서 터미널로 조작이 가능하도록 하는 옵션이고, -d 는 백그라운드로 수행하게 하는 옵션이다.

d:\> docker run -it -d ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
405f018f9d1d: Downloading [===================>                               ]  11.58MB/30.42MB

윈도우에서 우분투 리눅스가 실행되었다!! docker ps 명령어로 실행중인 도커 컨테이너를 확인할 수 있다.

d:\> docker run -it -d ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
394d5ad1d14654cebfdc9d38148c4e8db631c667b84e493d0608ba8ad27f5635
d:\> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
2ebd0199ed5e   ubuntu    "bash"    17 minutes ago   Up 17 minutes             frosty_robinson

그리고 docker images 명령어로 도커 허브에서 내려받은 이미지도 확인할 수 있다.

d:\> docker images
REPOSITORY       TAG      IMAGE ID       CREATED         SIZE
ubuntu           latest   2ebd0199ed5e   6 weeks ago     77.8MB

docker exec 명령어로 구동중인 도커 컨테이너로 접속을 해 보자. 참고로 위에서 도커를 실행할때 docker run -it ubuntu bash로 실행하면, 바로 컨테이너에 접속된 상태가 된다.

d:\> docker exec -it 2ebd0199ed5e bash
root@2ebd0199ed5e:/#

이 상태에서 리눅스에서 사용하는 유틸리티 명령어를 넣어보면 동작하는게 별로 없다. 정말 거의 깡통 수준인 우분투 배포판이 구동되고 있다.

root@2ebd0199ed5e:/# vim
bash: vim: command not found
root@2ebd0199ed5e:/#

필요한 프로그램을 설치하자. 지금은 vim을 설치해 본다. 우분투의 패키지 매니저인 apt-get을 사용한다.

root@2ebd0199ed5e:/# apt-get update && apt-get install vim
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
....
After this operation, 61.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...

이제 vim 명령어를 수행해 보면 잘 동작한다. 이 상태에서 실행중인 컨테이너를 백그라운드 까지 모두 중지시키고, 다시 컨테이너를 실행해서 vim 명령어를 수행해 보면 또 에러가 난다.

root@d4143dd5078c:/# exit
exit
d:\> docker stop 2ebd0199ed5e
2ebd0199ed5e
d:\> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
d:\> docker run -it ubuntu bash
root@b9f6090ce821:/# vim
bash: vim: command not found
root@b9f6090ce821:/#

이건 왜 이럴까? 도커 컨테이너를 수행할 때 다운로드 받은 이미지를 기준으로 실행하기 때문이다. 즉, 컨테이너는 이미지를 프로세스로 만든 인스턴스이다! 그렇다면 우리는 매번 리눅스를 실행할 때 마다 필요한 패키지를 다운로드 해서 써야 하는 것일까? 물론 그렇지 않다. 내가 현재 사용하고 있는 컨테이너를 이미지로 만드는 방법이 있다. 다시 vim을 설치하고 나서 다음 명령어를 수행해 보자.

d:\> docker commit b9f6090ce821 my-ubuntu:v0.1-add-vim
sha256:968c3b879d8fffbafc21937b0c621cc20a45df63f8ede144dce75d7ec8ba2af4
d:\> docker images
REPOSITORY     TAG             IMAGE ID       CREATED         SIZE
my-ubuntu      v0.1-add-vim    968c3b879d8f   5 seconds ago   77.8MB

docker commit 명령어로 실행중인 컨테이너에 TAG를 부여하여 새로운 이미지로 만들었다.

이제 기존 도커 컨테이너는 다시 중지시키고, 이 이미지를 바탕으로 다시 도커를 실행해 보자.

d:\> docker run -it my-ubuntu:v0.1-add-vim bash
root@960bc0d4a860:/#

그리고 vim을 실행해 보면 vim이 잘 설치되어 있는 것을 확인할 수 있다.

여기서 주의할 점은 당연히 새로 만든 이미지를 삭제하면 이전에 작업한 내용은 사라진다는 것이다. 하지만 태그를 잘 지정해 두면 더 편리하게 사용할 수도 있을 것이다.


윈도우에 번거로운 리눅스 설치 과정없이 리눅스를 도커로 띄워서 실행할 수 있는 방법을 살펴 보았다. 필요한 패키지를 받고, 이미지를 새로 만드는 작업이 번거롭다고 느껴질 수도 있겠지만 익숙해진다면 그렇게 시간이 오래 걸리는 작업이 아니기 때문에 훨씬 편하게 사용할 수 있을 것이다.

 

반응형