본문 바로가기
Docker

Windows에서 Docker Desktop 없이 도커 개발 환경 구축하기

by 하이방가루 2023. 2. 23.
728x90
반응형

1. 도커와의 호환을 위해 wsl2로 리눅스 설치

다음 명령어로 새 Linux 배포판이 설치될 때 기본 버전을 WSL 2로 설정

wsl --set-default-version 2

리눅스 설치는 wsl2 ) wsl 설치, 실행, 종료, 배포판 삭제 (tistory.com) 참조

 

2. WSL2에 도커 엔진 설치

2가지 방법이 있다.

첫 번째는 curl를 통한 쉘 스크립트로 설치하는 것이다.

$ curl -sSL get.docker.com | sh

아래와 같은 내용이 출력된 후 20초 후에 sudo 명령이 실행되는데 wsl 접속 후 한 번도 sudo명령을 실행하지 않았으며 비밀번호를 물어볼 것이다.

# 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

 

두 번째는 repository를 이용하여 설치하는 방법인데, 먼저 repository를 설정해야 한다.

일단 apt 패키지 색인을 업데이트하고 apt가 HTTPS를 통해 repository를 사용할 수 있도록 패키지를 설치한다.

$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

그리고 Docker의 GPG key를 추가한다.

$ sudo mkdir -m 0755 -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

마지막으로 다음 명령을 사용하여 repository를 설정한다.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

이제 repository를 이용하여 Docker를 설치한다.

# ubuntu
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

도커가 잘 설치됐는지 확인하려면

$ docker --version

 

3. 도커 그룹에 사용자 추가

sudo usermod -aG docker {유저명}

 

4. Windows에 도커 클라이언트 설치

https://download.docker.com/win/static/stable/x86_64/

위 주소에서 wsl에 설치된 도커 엔진과 같은 버전의 도커 클라이언트를 다운로드한다.

압축을 해체하고 환경변수 설정 창에서 PATH 환경 변수에 docker.exe 파일이 있는 경로를 추가하고,

새로 만들기로 DOCKER_HOST라는 변수 이름으로 변수 값 tcp://localhost:2375를 추가한다.

 

cmd 또는 powershell에서 다음 명령어를 통해 환경변수가 적용되었는지 확인가능하다.

> docker
> echo %DOCKER_HOST%

환경변수가 적용이 안 되었다면 프롬프트를 재시작하거나 choco가 설치되어 있는 경우 refreshenv 명령을 사용하거나 컴퓨터를 재시작하여야 한다.

 

5. Windows 도커 클라이언트와 WSL2 도커 데몬 연결

> wsl hostname -I

# 도커 데몬이 설치된 wsl이 기본값이 아닐 경우
> wsl -d <배포명> hostname -I

위의 명령어로 wsl의 ip를 확인한다.

 

Netsh 인터페이스 포트 프락시 설정을 하기 위해서 관리자 권한으로 cmd 또는 powershell를 열고 다음 명령을 실행한다.

> netsh interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress={wsl의 ip}

잘 설정되었는지 확인하려면 다음 명령을 실행한다.

> netsh interface portproxy show all

 

다음 명령어를 사용하여 wsl에 도커 데몬을 백그라운드로 실행한다.

> wsl sudo nohup dockerd -H tcp://{wsl_ip}

도커 데몬이 프로세스로 돌기 위한 웜업 시간이 10~30초가량 필요하다.

웜업 시간 대기 후에 다음 명령어를 실행하여 잘 연결되었는지 확인 가능하다.

> docker ps

 

P.S-1. docker-compose 설치

PowerShell에서 다음 명령어를 실행한다.

# GitHub에는 TLS1.2가 필요합니다.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Start-BitsTransfer -Source "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-Windows-x86_64.exe" -Destination {docker.exe 파일이 있는 경로}\docker-compose.exe

다른 버전의 compose를 설치하려면 v2.16.0 대신에 사용하려는 compose 버전으로 대체하면 된다.

다음 명령어로 설치된 것을 확인할 수 있다.

> docker-compose --version

 

P.S-2. 간편 설정

1. Windows 시작 시 자동으로 도커 데몬 연결하게 만들기 위한 스크립트 작성 및 작업 스케줄러 설정

  • 스크립트 작성
for /f "tokens=1" %%a in ('wsl sh -c "hostname -I"') do set wsl_ip=%%a

netsh interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=%wsl_ip%

wsl -d Ubuntu -u root -e nohup sh -c "dockerd -H tcp://%wsl_ip% &" < nul > nul 2>&1

위의 3줄이 스크립트 내용 전부이다. 메모장 등을 이용하여 적당한 파일명으로 확장자 bat 파일을 생성한다.

 

  • 작업 스케줄러 설정

스케줄러 관리를 편하게 하기 위해 작업 > 새 폴더를 사용하여 폴더를 생성하여 작업을 만드는 것을 추천한다.

설정은 링크를 참조

 

2. wsl에서 docker 편하게 쓰기 (DOCKER_HOST 환경변수 설정)

이 설정을 하지 않을 경우 wsl에서 docker deamon을 쓰기 위해서는 매번 -H tcp://{wsl의 ip}를 옵션을 주어야 한다. 따라서 wsl의 .profile에 다음 내용을 추가하여 wsl 접속 시 자동으로 DOCKER_HOST를 변수에 넣게 한다.

$ vi ~/.profile

## .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

재접속하지 않고 쉘에 적용하려면 다음 명령어를 실행한다.

$ . ~/.profile

 

이제 도커를 학습하러 가보자. 도커 가이드로 Go~

 

Windows 도커 클라이언트 문제점...

bind mount 시 docker deamon에 경로가 제대로 전달되지 않음. (powershell "$(pwd)"로 연결하거나 docker-compose.yml에 상대경로 사용 시 경로를 찾지 못함.)

=> wsl 쉘에서 직접 명령어 실행해야 함.

 

참고 : https://netmarble.engineering/docker-on-wsl2-without-docker-desktop/

728x90
반응형

'Docker' 카테고리의 다른 글

wsl2 ) Vmmen 메모리 과다 사용 문제  (0) 2022.05.16
wsl2 ) wsl 설치, 실행, 종료, 배포판 삭제  (0) 2022.05.16

댓글