요즘 Docker는 선택이 아닌 필수다. 경력 3년 4개월 차인 필자도 Docker를 배포 서버에 구축하거나 Dockerfile script를 짜 본 적이 있다. 하지만 공부를 해서 Docker Container를 구축했다기보다는 그냥 래퍼런스들을 참고하며 클론 코딩에 가까웠고, 왜 쓰는지는 대략적으로 알았지만 깊게 공부하지 않았다. 이 포스팅은 그런 반성의 차원에서 하나하나 공부하면서 Docker를 구축하고 Python 개발환경으로 이용하며 배포까지 해보는 시리즈가 되겠다.
이 포스팅은 요즘 IT에 기재되어 있는 넷마블 기술 블로그 '도커 데스크톱 없이 구축하는 WSL2와 도커 개발 환경'을 보고 작성하였습니다.
1. WSL란?
WSL2 를 설치하기에 앞서 WSL 이란 무엇인지 알고자 한다.
1.1 WSL 이란 무엇일까?
WSL은 리눅스용 윈도우 하위 시스템(Windows Subsystem for Linux)의 약자이다. 윈도우 10에서 네이티브로 리눅스 실행 파일(ELF)을 실행하기 위한 호환성 계층이다. 즉 윈도우에서 직접 리눅스를 사용할 수 있도록 제공해주는 것이다.(가상 환경을 만들 필요가 없다.)
1.2 WSL 과 WSL2의 비교
WSL2 에서는 WSL과 다른 VM 환경을 가지고 있습니다.
WSL 1에서 Linux의 System Call을 Windows API로 변환하는 구조였다고 하면, WSL 2에서는 윈도우즈에 리눅스 커널을 아얘 올려버렸다고 합니다. 이와 같은 방식 덕분에 Linux의 모든 API를 지원합니다.
Windows와 Linux 통합 | ✅ | ✅ |
빠른 부팅 시간 | ✅ | ✅ |
기존 Virtual Machines보다 작은 리소스 공간 | ✅ | ✅ |
현재 버전의 VMware 및 VirtualBox에서 실행 | ✅ | ✅ |
관리 VM | ❌ | ✅ |
전체 Linux 커널 | ❌ | ✅ |
전체 시스템 호출 호환성 | ❌ | ✅ |
OS 파일 시스템 간 성능 | ✅ | ❌ |
2. WSL2 설치하기
설치는 ms에서 지원하는 문서를 보고 따라하면 된다. WSL 설치 가이드
3. WSL2에 Docker 개발 환경 구축하기
WSL2를 설치하였다면 이제 Docker를 구축해보자.
우선 필자는 Ubuntu 22.04 버전에서 실습을 했다.
3.1 Docker 엔진 설치하기 전
Docker 엔진을 설치를 해보자. 참고하고 있는 사이트에서는 도커가 공식으로 제공하는 설치 스크립트로 설치하라고 한다. 사실 포스팅을 보기 전까지는 설치가 있는지도 몰랐다.
- 공식 문서를 조금 살펴보자
Docker provides a convenience script at https://get.docker.com/ to install Docker into development environments non-interactively. The convenience script isn’t recommended for production environments, but it’s useful for creating a provisioning script tailored to your needs.
개발환경에서 스크립트를 이용하여 Docker 를 설치한다. 이는 프로덕션 환경에서는 권장하지 않지만 프로비저닝 스크립트를 만드는 데 유용하다.
여기서 프로비저닝이란 어떠한 지식이나 자원 등을 미리 준비해놓고 요청이 들어왔을 때, 해당 요청에 맞게 공급하는 것을 의미한다고 한다. 즉 프로비저닝은 사용자 혹은 비지니스 요구사항에 맞게 할당, 배치, 배포하여 시스템을 사용 가능하도록 준비하는 절차를 뜻한다.
정리하자면 설치 스크립트는 개발환경에서 사용자의 요구사항에 맞게끔 설치를 도와준다고 정리할 수 있다.
- 주의 사항도 친절하게 적혀 있다.
- The script requires root or sudo privileges to run.
스크립트를 실행하려면 root또는 sudo권한이 필요합니다.
- The script attempts to detect your Linux distribution and version and configure your package management system for you.
스크립트는 Linux 배포 및 버전을 감지하고 패키지 관리 시스템을 구성하려고 시도합니다.
- The script doesn’t allow you to customize most installation parameters.
이 스크립트는 대부분의 설치 매개변수를 사용자 정의하도록 허용하지 않습니다.
- The script installs dependencies and recommendations without asking for confirmation. This may install a large number of packages, depending on the current configuration of your host machine.
스크립트는 확인을 요청하지 않고 종속성 및 권장 사항을 설치합니다. 이것은 호스트 시스템의 현재 구성에 따라 많은 수의 패키지를 설치할 수 있습니다.
- By default, the script installs the latest stable release of Docker, containerd, and runc. When using this script to provision a machine, this may result in unexpected major version upgrades of Docker. Always test upgrades in a test environment before deploying to your production systems.
기본적으로 스크립트는 Docker, containerd 및 runc의 최신 안정 릴리스를 설치합니다.
이 스크립트를 사용하여 시스템을 프로비저닝하면 예기치 않은 Docker의 주요 버전 업그레이드가 발생할 수 있습니다. 프로덕션 시스템에 배포하기 전에 항상 테스트 환경에서 업그레이드를 테스트하십시오.
- The script isn’t designed to upgrade an existing Docker installation. When using the script to update an existing installation, dependencies may not be updated to the expected version, resulting in outdated versions.
이 스크립트는 기존 Docker 설치를 업그레이드하도록 설계되지 않았습니다. 스크립트를 사용하여 기존 설치를 업데이트할 때 종속성이 예상 버전으로 업데이트되지 않아 오래된 버전이 될 수 있습니다.
3.2 설치 스크립트를 활용하여 Docker Engine 설치 하기
그렇다면 설치를 해보자!
$ curl -sSL get.docker.com | sh
위와 같은 명령을 내린다면 콘솔에 아래와 같이 표시된다.
# Executing docker install script, commit: 4f282167c425347a931ccfd95cc91fab041d414f
WSL DETECTED: We recommend using Docker Desktop for Windows.
Please get Docker Desktop from https://www.docker.com/products/docker-desktop
You may press Ctrl+C now to abort this script.
+ sleep 20
WSL 환경에서는 도커 데스크톱을 쓰기를 추천한다는 문구가 나오고 20초 기다린다면 도커 설치를 시작한다.
도커가 잘 설치됐는지 확인을 해보자. 아래와 같이 Docker 버전이 나온다면 설치가 완료됐다.
$ docker --version
Docker version 20.10.21, build baeda1f
3.3 편의를 위한 sudo 권한 설정
docker 명령어 실행 시 매번 sudo를 입력하지 않으려면 sudoer에서 sudo 권한 유저 유무를 확인해야 한다.
먼저 sudo 그룹에 사용자가 들어가 있는지 확인해보자.
$ grep -E 'sudo|wheel' /etc/group
sudo:x:27:jslee
만약 ‘sudo:x:27:[username]’과 비슷한 메시지가 출력되지 않는다면, sudoer 그룹에 사용자를 추가해야 한다.
$ usermod -aG sudo $USER
다음으로, sudo 명령어를 쓸 수 있는 조건에 그룹이 들어가 있는지 확인해야 한다.
$ sudo grep -E '%sudo|%wheel' /etc/sudoers
...
%sudo ALL=(ALL:ALL) ALL
예시처럼 ‘%sudo ALL=(ALL:ALL) ALL’과 비슷한 메시지가 나오는지 확인 후, 사용자를 docker 그룹에 추가한다.
$ sudo usermod -aG docker $USER
3.4 도커 컨텍스트 설정
도커 데스크톱이 자동으로 잡아주는 설정 중에는 도커 컨텍스트(Docker Context)도 있습니다. 도커 컨텍스트에는 도커 빌드나 배포 등 사용 과정에서 필요한 정보를 품고 있기 때문에, 환경 변수 설정을 해야 정상 동작한다.
‘.profile’이나 ‘.bashrc’에 도커 컨텍스트 환경 변수를 미리 넣어두면, WSL 콘솔에 로그인할 때 자동으로 환경 변수를 적용받는다. 아래는 ‘.profile’ 파일에 도커 컨텍스트 환경 변수를 추가하는 예시이다.
$ echo '' >> ~/.profile
$ echo '# set DOCKER_HOST for docker default context' >> ~/.profile
$ echo 'wsl_ip=$(ip addr show eth0 | grep -oP "(?<=inet\s)\d+(\.\d+){3}")' >> ~/.profile
$ echo 'export DOCKER_HOST=tcp://$wsl_ip:2375' >> ~/.profile
$ cat ~/.profile
...
# set DOCKER_HOST for docker default context
wsl_ip=$(ip addr show eth0 | grep -oP "(?<=inet\s)\d+(\.\d+){3}")
export DOCKER_HOST=tcp://$wsl_ip:2375
...
3.5 도커 데몬 실행 전 설정
- 도커 데몬을 실행하기에 앞서 도커 데몬은 무엇일까?
Docker 데몬(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수도 있습니다.
출처: https://docs.docker.com/get-started/overview/#the-docker-daemon
자세한 내용 정리는 다음 포스팅에서 해보자 개념만 간략하게 이해하자
현재 실습 환경이 Ubuntu 22.04 이므로 해당 버전에 맞게 도커 데몬을 실행해보자.
Ubuntu 22.04 버전보다 아래라면 그냥 넘어가도 좋다.
우선 ‘iptables’ 설정을 먼저 변경하고 나서 이후 과정을 따라가야 한다. 우분투 22.04 버전부터 ‘iptables-nft’가 기본 설정으로 잡혀있어서, WSL에서 도커를 사용할 때 호환성 이슈가 발생한다. ‘iptables-nft’ 대신 ‘iptables-legacy’를 사용해야 도커 데몬을 실행할 수 있다.
- issue에 대한 내용
Failure to install and run Docker in WSL Ubuntu 22.04 (works in 20.04): “Cannot connect to the Docker daemon”:https://github.com/docker/for-linux/issues/1406
$ sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
# iptables-legacy 가 있는 1번을 입력하자
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode
선택을 했다면 WSL을 재부팅 하자. 재부팅은 아래와 같다.
wsl -t <dist name> # ubuntu 종료
wsl -d <dist name> # ubuntu 재시작
3.6 도커 데몬 실행
포스팅에서는 도커 데몬 실행을 위해 bash script를 알려주는데 나는 왜 인지 작동이 잘 안 되는 거 같아서 WSL 실행 시 docker 데몬이 실행되도록 ~/. profile에 작성했다.
이때 주의해야 할 점은 'wsl.exe -d <Ubuntu dist name>' 부분에 Ubuntu 배포 이름을 적어줘야 한다.
$ echo ' wsl.exe -d <Ubuntu dist name> -u root -e dockerd -H tcp://$wsl_ip >/dev/null 2>&1 & disown' >> ~/.profile
$ echo '' >> ~/.profile
$ echo '# start docker daemon automatically when logging in wsl shell' >> ~/.profile
$ echo 'if [ -z "$(ps aux | grep dockerd | grep -v grep)" ] ; then' >> ~/.profile
$ echo ' wsl_ip=$(ip addr show eth0 | grep -oP "(?<=inet\s)\d+(\.\d+){3}")' >> ~/.profile
$ echo ' netsh.exe interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=$wsl_ip' >> ~/.profile
$ echo ' wsl.exe -d Ubuntu -u root -e dockerd -H tcp://$wsl_ip >/dev/null 2>&1 & disown' >> ~/.profile
$ echo 'fi' >> ~/.profile
$ cat ~/.profile
# start docker daemon automatically when logging in wsl shell
if [ -z "$(ps aux | grep dockerd | grep -v grep)" ] ; then
wsl_ip=$(ip addr show eth0 | grep -oP "(?<=inet\s)\d+(\.\d+){3}")
netsh.exe interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=$wsl_ip
# Ubuntu 배포명
wsl.exe -d Ubuntu-22.04 -u root -e dockerd -H tcp://$wsl_ip >/dev/null 2>&1 & disown
fi
3.7 도커 데몬 실행 확인
이제 마무리다 WSL2(Ubuntu 22.04)에 접속하여 아래의 명령어를 쳐보자
$ docker ps
# 아래외 같이 뜨면 실행 된 것
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
글을 읽어보고 오류가 있다면 댓글로 편하게 말씀해주시면 감사하겠습니다. 포스팅 봐주셔서 감사합니다!
참고
- https://brownbears.tistory.com/435https://velog.io/@weekbelt/%EB%8F%84%EC%BB%A4%EB%8D%B0%EB%AA%ACDocker-Daemon
'Docker' 카테고리의 다른 글
Docker Compose - 1 (0) | 2023.02.23 |
---|---|
Docker 명령어 정리 - 2 (0) | 2023.01.26 |
DockerFile 작성하기 - 구성과 명령어 정리 - 1 (0) | 2023.01.23 |
Docker에 대해 알아보자 - 정의, 작동 방식, 사용 이유 (0) | 2023.01.22 |
[완벽한 IT 인프라 구축을 위한 Docker] 1장 시스템과 인프라 기초지식 - 1 (0) | 2022.11.23 |