윈도우 서브 리눅스에서 도커화 된 앱 개발하기

watch_later 월요일, 12월 18, 2017

서론

enter image description here

윈도우 10에서 개발을 하려고 하다가 툴이 지원을 하지 않아서 듀얼 설치된 우분투로 들어간 경험이 있다.

그리고 어제, 그 우분투 설치 된 저장소 용량이 없어서 다시 파티션 조정을 하고 재설치를 하려고 용을 쓰다가 지쳐버렸다.

리눅스(혹은 해킨토시)를 듀얼구성하는 이유는 다음과 같은데,

  • 윈도우 고장나면 복구용으로
  • 개발환경이 더 잘 지원되어서

윈도우 8 부터인가? 내부 설계가 변경되어서 굉장히 안정성이 높아졌고, 이제는 wsl 이 지원 되니. 구지 우분투로 부팅을 해서 작업을 해야만 할 필요가 줄었다.

그래서, 해오던 것 처럼 삽질을 하려다가 다음과 같은 생각이 떠올랐다.

wsl 을 이용해서 좀 더 쉽게 윈도우즈에서 개발할 수 있을까?

wsl : 리눅스를 위한 윈도우 하위 시스템으로 bash 를 윈도우에서 사용할 수 있게 이식한 기능이다.

wsl 이용해 쉘 명령어 실행하기

wsl 바로가기 만들기(옵션)

wsl 설치 하고 윈도우 바로가기를 다음처럼 만들어 준다.

위치 : C:\Users\사용자이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools

enter image description here

추가 : 실제로는 wsl.exe 를 먼저 호출하고, chsh 로 설정된 bash 쉘을 호출하는 것.

그럼 이제 윈도우키를 눌러 bash 검색하면 바로 나온다.

enter image description here

zsh 설치(옵션)

설치후 다음처럼 기본 쉘을변경.

bash 에서 기본 쉘 변경

chsh -s $(which zsh)

기본 쉘을 변경했으니 wsl 을 호출하면 wsl 이 그 설정에 따라 zsh 쉘을 호출한다.

바로가기를 다음처럼 생성

enter image description here

윈도우 개발 시 bash 커맨드 사용

특정 명령을 내리는 바로가기는 다음 처럼 만든다.

enter image description here

도커를 wsl 에서 사용하기

네이티브로 도커 설치

도커 포 윈도우즈가 아닌 wsl 에 네이티브 도커를 설치하자.

패키지 최신 업데이트.

$ sudo apt-get update

https 를 통해 저장소를 접근할 준비.

$ sudo apt-get install \
 apt-transport-https \
 ca-certificates \
 curl \
 software-properties-common

도커 GPG 키 받기;

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add 

한 줄로

apt-get install curl && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

키 확인

$ sudo apt-key fingerprint 0EBFCD88

저장소 사용하게 하기.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

새 저장소 추가됐으니 인덱스 업뎃.

sudo apt-get update

도커 설치

sudo apt-get install docker-ce

NVIDIA(GPU 사용) 도커 설치(옵션)

nvidia gpu 를 사용해서 docker 를 돌리도록 해주는 패키지.

보통 인공지능 tensoflow 도커를 사용할 때 좀 더 연산에 많은 도움을 받고자 사용한다.

링크 1
링크 2

라데온(GPU 사용) 도커도 있다(옵션)

https://github.com/RadeonOpenCompute/ROCm-docker

호스트 데몬과 wsl 도커 클라이언트 연결

도커 클라이언트 버전 확인은 되는데.

$ docker -v
Docker version 17.09.1-ce, build 19e2cf6

도커 프로세스는 접근할 수가 없다.

$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

왜냐면.. 도커 데몬이 돌아가는 호스트는 윈도우인데 도커는 기본적으로 유닉스 소켓통해 유닉스 시스템 프로세스에 접근하려고 하기 때문이다.

먼저, 도커 포 윈도우즈에서.. 현재 윈도우에서 돌아가는 도커 데몬 프로세스를 tcp 주소로 노출을 시켜줘야 한다.

일단 설치하고 다음처럼 데몬 주소를 expose 해준다.

enter image description here

기능들이 꽤 많네.

이제는, tcp 포트를 통해서 윈도우즈 도커 프로세스에 접근을 해줘야 한다.

$ docker -H localhost:2375 images

export 를 통해서 unix 소켓으로 향한 연결을 tcp 연결로 바꿔주면, 도커 명령어만 쳐도 작동을 한다.

$ export DOCKER_HOST=localhost:2375
$ docker info

근데 매번 export 할 수 없으니 bash 쉘 시작시 자동 시작되는 스크립트에 해당 내용을 넣어주도록 하자.

우분투는 bash_profile 이지만, wsl 에서는 ~/.bashrc 고.. wls 밖인 윈도우즈 에서는 C:\Users\<username>\AppData\Local\Lxss\rootfs\home\username 이다.

절대로! 윈도우에서 AppData 내부로 들어가 직접 수정하면 안 됩니다! 그러면 다시 재설치해야함!! 쉘에서 쉘 경로로 접근하고 수정!!

sudo nano ~/.bashrc

그리고 가장 마지막 줄에 다음을 넣어준다.

export DOCKER_HOST=localhost:2375
echoexport DOCKER_HOST=localhost:2375

bash 를 재시작 도커가 잘 동작하게 된다.

볼륨 마운트 포인트 제대로 작동하게 하려면

윈도우는 볼륨 경로로 /c/.../.../ 를 기대하는데 도커는 /mnt/c/.../... 를 기대한다.

먼저 도커 포 윈도우에서 다음처럼 공유 설정을 걸어준다.

enter image description here

먼저 마운트 될 폴더를 생성한 후에..

sudo /
sudo mkdir c

.bashrc 를 또 열고 아래 내용을 추가해준다.

# for sure, docker's volume mounted works ok.
sudo mount --bind /mnt/c /c
echo "sudo mount --bind /mnt/c /c"

재부팅을 하면 루트 암호를 넣고, 이후에는 볼륨 경로 설정할 때 /c/경로/ 식으로 넣을 수 있다.

mount 시 sudo 암호 넣지 않게 하기

sudo 관련 설정을 열고

$sudo visudo

마지막에 mount 명령은 루트 암호 없이 실행되게 설정해준다.


# use mount command withour sudo
nick ALL=(root) NOPASSWD: /bin/mount

추가

pro 가 아닌 home 버전이라도 wls 에서 위처럼 할 수 있다.

단, 똑같이가 아니라 hyper-v 가 아닌 virtualbox vm 환경에서 말이다.

하고 나니까. cmd 에서 도커 쓰면 될 걸 구지 이렇게 까지 해야했나? 싶다.

… 이게 뭐냐면.. 누군가가 이렇게 삽질 할 것을 줄여주려고 품을 들였는데 나는 그걸 걷어차 버린 꼴 같다.



sentiment_satisfied Emoticon