목표 : 데스크탑 도커를 외부에서도 사용가능하게 하자.
추가 목표 : 왠만하면 보안도 신경쓰고 lte 환경처럼 외부에서도 접속 가능하게 하자.
- Docker Desktop (Windows) 설치
- Docker Desktop 설정
- WSL2 설정
- tls expoese 설정
- (옵션-심화) 외부 사용을 위한 설정 준비
- WSL의 네트워크 방식의 이해
- 재부팅시 항상 새로운 네트워크 주소가 할당됨
- 윈도우 와의 네트워크 설정
- 가상 랜어뎁터로 WSL(IP) -> WIN(IP) 로 바라보게 되어있음.
- 필요한것은 WIN(IP) -> WSL(IP)로 접속하는것
- 추후 부팅시 작업 스케줄러를 활용해서 세팅
- 두가지 구현 방식
- http 사용 - 가장 쉽고 빠른 방식 그러나 안될수도 있다.
- General에서 Expose daemon on http://localhost:2375 without TLS 옵션을 킴
- 그리고 내부망(같은 공유기 대역, 다른 기계) 에서 docker -H http://192.168.0.IP:2375 info 명령어로 확인
- 2번이 될 경우 내부망에서만 쓰거나 공유기 포트포워딩으로 사용하는것을 추천
- 2번이 안될 경우 3.2 방법이 필요함. (준비 시간이 배로들고 어렵다.)
- ssh 사용 - docker context를 사용한 방식.
- WSL은 기본적으로 우분투 이므로 WSL에 ssh로 접속해서 내부 도커를 외부 도커와 연결하는 작업
- ssh는 기본적으로 보안 지원이 좋아서 3.1보다 안전함.
- WSL 내부에 ssh-server를 설치하고 외부 기계는 인증을 받아 ssh로 접속하여 도커에 원격 명령을 날리는 방식
- http 사용 - 가장 쉽고 빠른 방식 그러나 안될수도 있다.
- WSL에 openssh 설치 (3.2번 케이스)
- open ssh 설치
- sudo apt update
- sudo apt install openssh-server
- systemctl 이 wsl에서 작동하지 않음
- 윈도우 쪽에서 부팅시 실행해줄 예정
- \\wsl\{이미지}\home\{유저}\.ssh 폴더 생성 -탐색기에서 확인 가능
- \\wsl\{이미지}\home\{유저}\.ssh\authorized_keys 파일생성
- 외부 기기의 ssh key 생성.
- 외부 기기(ex 노트북)의 /home/{유저}/.ssh/id_rsa.pub 키 복사
- \\wsl\{이미지}\home\{유저}\.ssh\authorized_keys 파일에 입력
- 외부 기기/home/{유저}/.ssh/config 파일 생성
- vi config 명령어 후 하위 탭 처럼 입력
- Host wsl
- User 유저
- HostName 192.168.0.IP(윈도우 IP)
- Port 22
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/id_rsa
- 이후 윈도우 방화벽 열어주는 작업 필요.
- open ssh 설치
- Window 에서 필요한 작업 - 글 하단에 스크립트 파일 있음.
- ssh 접속을 위한 WIN방화벽 해제
- 아웃바운드(나가는 흐름) 명령어 New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 포트 -Action Allow-Protocol TCP
- 인바운드(들어오는 흐름) 명령어New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 포트 -Action Allow-Protocol TCP
- ssh 접속을 위한 WIN(IP) -> WSL(IP)로의 흐름을 연결을 이어주는 작업(프록시)
- netsh interface portproxy add v4tov4 listenport=외부포트 listenaddress=허용되는 외부 아이피 connectport=내부WSL포드 connectaddress=내부WSL주소
- 부팅시 새로운 WSL(IP)를 위한 스크립트 자동화
- C:\Users\윈도우유저폴더\wsl-connect-external.ps1 파일생성 (글 하단 참조)
- 작업 표시줄 검색 - 작업 스케줄러 - 기본작업만들기(우측) -이름 wsl-start -다음
- 작업 -로그온할때 -다음
- 매일 -건들지 말고 -다음
- 프로그램시작 -다음
- 프로그램 스크립트
- C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- 인수 -noprofile -executionpolicy bypass -file C:\Users\유저\wsl-connect-external.ps1
- [마침]을 클릭할 때 이작업의 속성 대화 상자 열기 체크
- 속성창
- 사용자 또는 그룹 변경, 고급 -지금찾기, 결과(U)창에서 Administrators 선택
- 하단 가장 높은 수준의 권한으로 실행 체크
- 구성대상 window 10 선택
- 상단 조건탭 -전원 관련 2개 체크 해제
- 상단 설정탭 -다음 시간 이상 작업이 실행되면 중지 체크 해제
- 확인
- 이름이 wsl-start 인 작업 스케줄러 선택후
- 우측 실행 버튼 눌러서 스크립트 실행
- 스크립트 실행확인
- not found ipconfig
- wsl 에서 sudo apt-get install net-tools
- 외부 기기에서 ssh 접속 확인
- ssh wsl 명령어 입력후 터미널에서 접속 확인
- 안될시 체크
- window 에서 파워쉘 스크립트 실행확인
- wsl 내부에서 service start ssh 확인
- 빨간 글씨 오류나도 한번더 실행
- 안될시 체크
- 접속후 docker info 및 docker ps 로 docker 확인
- 이후 ssh 종료
- ssh wsl 명령어 입력후 터미널에서 접속 확인
- 외부 기기에서 docker context 설정
- docker context create wsl --docker host=ssh://유저@윈도우IP 입력
- docker context use wsl
- 위 ssh config 처럼 sshkey를 등록해야됨
- ssh-add ~/.ssh/id_rsa 등록
- ssh-add -l 등록된 키 확인
- 외부 기기에서 docker 명령어 확인
- 마지막으로 docker info 혹은 docker ps로 도커 접속 확인
- 끝
- (번외)
- 외부 접속을 위한 공유기에서 포트포워딩
- 외부 접속시 IP재할당을 대비한 DDNS 주소 등록
- 이를 모두 고려해서 docker context 다시 생성 및 적용
- (개인의견)최신 윈도우 도커에서는 expose 시 포트를 알아서 열어주는걸로 알고 있음. 만약 도커 포트들도 열고 싶다면 $ports=(22, 여기) 에 넣으면 함께 포트가 열리고 연결됨. 하지만 도커데스크탑에서 열어줄 경우 딱히 필요 없음.
- ssh 접속을 위한 WIN방화벽 해제
- WSL의 네트워크 방식의 이해
wsl-connect-external.ps1
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(22,2375);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
- 출처
'교육 > 그외' 카테고리의 다른 글
[소프트웨어 버전] 버전 지원 날짜 정리 (lts, stable version) (0) | 2022.07.22 |
---|---|
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part2: 게임 수학과 DirectX12 (0) | 2022.05.03 |