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