docker 배우기 - slog

올해는 컨테이너 및 마이크로서비스를 적극적으로 업무에 사용하기 위해 숙달하려고 합니다.

docker는 프로세스 격리 기술을 이용합니다. 위키백과에 도커 웹 페이지의 기능은 다음 같습니다.

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

결국에 이러한 이점을 이용해서 개발 시점에서 테스트 하는 환경과 실제 운영 환경을 동일하게 구성할 수 있습니다.

1개의 좋아요

윈도에서 docker(앞으로 도커) 환경을 구성하려면 Docker Desktop을 설치하면 됩니다. 하지만 라이센스의 변화로 걸리는 점이 있습니다. 이 부분은 포럼에서도 언급이 되었었는데요,

정현님이 아주 자세하게 WSL2에 도커를 직접 설치해서 활용하는 글을 작성해주셨습니다. 이글을 통해 학습을 진행합니다.

2개의 좋아요

가이드에 따라 도커를 설치하고 링크된 문서를 통해 도커 그룹에 사용자를 포함해서 설정하는것까지 진행합니다.

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

그리고 잘 동작하는지를 확인하기 위해 docker run hello-world를 실행해봅니다. (이 때 데몬이 동작중이여야 합니다)

정현님의 문서대로 테스트를 해도 됩니다.

$ sudo service docker start
$ docker run -i --rm hello-world
1개의 좋아요

WSL 자동으로 서비스가 실행되지 않습니다. 하지만 윈도우 11의 WSL 2에는 해당 기능이 들어 있고 정현님을 글을 따라 관련 설정을 해봅니다.

$ sudo nano /etc/wsl.conf

command 속성은 한번만 사용할 수 있으므로 별도의 셸 스크립트로 만듭니다.

/etc/wsl.conf

[boot]
command=/etc/autorun.sh
$ sudo nano /etc/autorun.sh

/etc/autorun.sh

#!/bin/sh
sudo service docker start
$ sudo chmod +x /etc/autorun.sh

이후 WSL에서 나온 뒤 wsl --shutdown이후 다시 WSL로 진입해서, docker ps 명령이 동작하면 도커 서비스가 정상적으로 동작하는 것입니다.

1개의 좋아요

다음으로 호스트 컴퓨터에서 WSL2의 도커 데몬 포트에 접근하기 위해, 다음처럼 도커 데몬 설정을 변경합니다.

$ sudo naneo /etc/docker/daemon.json

/etc/docker/daemon.json

{"features": { "buildkit": true }, "hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]}

이후 도커 데몬을 재시작한후,

$ sudo service docker restart

잘 실행되는지를 확인하기 위해 docker ps및 호스트 컴퓨터에서 `telnet 127.0.0.1 2375’가 잘 접속되는지를 확인합니다.

상세한 내용은 정현님의 글을 꼭 참조하세요!

1개의 좋아요

정현님의 글을 따가 최종적으로 python에서 Flask를 이용해 Hello World를 출력하는 서비스를 도커를 통해 확인해 볼 수 있었습니다.

PS> docker build -t pythonapp:latest .
PS> docker.exe run -d --rm -p 5000:5000 pythonapp:latest
PS> curl.exe http://localhost:5000
Hello, Docker!
1개의 좋아요

Visual Studio 2022에서 Blazor Server 프로젝트 템플릿을 이용해 Docker 사용을 선택하고 실행했는데,
도커 빌드는 잘되는데 실행이 되지 않습니다.

1>docker run -dt -v "C:\Users\dimohy\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Users\dimohy\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" -v "C:\Users\dimohy\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro" -v "W:\Enjoy\BlazorApp7\BlazorApp7:/app" -v "W:\Enjoy\BlazorApp7:/src/" -v "C:\Users\dimohy\.nuget\packages\:/root/.nuget/fallbackpackages" -v "p:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages:/root/.nuget/fallbackpackages2" -e "ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true" -e "ASPNETCORE_ENVIRONMENT=Development" -e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "NUGET_PACKAGES=/root/.nuget/fallbackpackages" -e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages;/root/.nuget/fallbackpackages2" -P --name BlazorApp7 --entrypoint tail blazorapp7:dev -f /dev/null
1>docker: Error response from daemon: invalid volume specification: 'C:\Users\dimohy\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro'.

도커는 결국에 WSL2에서 실행될 것이므로 저 경로가 올바르지 않을 것입니다.

Visual Studio 2022에서 도커에서 디버깅 하는 환경은 좀 더 조사해봐야 겠습니다.

1개의 좋아요

WSL2에 도커 데몬이 잘 동작하고 있고 WSL에서는 도커가 잘 실행되는데 갑자기 호스트에서 도커가 안됩니다. 혹시나 해서 telnet 127.0.0.1 2375로 연결확인을 해봤는데 연결이 안되네요… WSL2의 네트워크 오동작으로 보입니다.

1개의 좋아요

일단 Visual Studio에서 도커 환경에서 디버깅을 하는 것은 현재로서는 뾰족한 수는 없는 것 같습니다.
아쉽지만 WSL 디버그 환경을 이용하는게 최선인 것 같고요,

이와는 별개로 게시를 했을 때 도커 이미지를 만들어주는 방법은

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=11708

Visual Studio Code에는 커맨드 수준으로 설정이 가능하기 때문에 도커 생성 및 도커 디버그 환경으로 실행이 가능합니다. 관련 학습을 할 때 좀 더 자세히 전개해보겠습니다.

1개의 좋아요