์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ์ ์ด๋ฆ์ Andrey์ด๊ณ Exness์ ๊ฐ๋ฐํ์์ DevOps ์์ง๋์ด๋ก ์ผํ๊ณ ์์ต๋๋ค. ๋์ ์ฃผ์ ํ๋์ Linux ์ด์ ์ฒด์ (์ดํ OS๋ผ๊ณ ํจ)์์ Docker๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถ, ๋ฐฐํฌ ๋ฐ ์ง์ํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ผ๋ง ์ ๊ฐ์ ํ๋์ ํ๋ ์์ ์ด ์์๋๋ฐ, ํ๋ก์ ํธ์ ๋์ OS๋ Windows Server์ C++ ํ๋ก์ ํธ ์ธํธ์์ต๋๋ค. ๋์๊ฒ ์ด๊ฒ์ Windows OS์ ๋์ปค ์ปจํ ์ด๋ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก C++ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ์ฒซ ๋ฒ์งธ ๊ธด๋ฐํ ์ํธ ์์ฉ์ด์์ต๋๋ค. ๋๋ถ์ ์ ๋ ํฅ๋ฏธ๋ก์ด ๊ฒฝํ์ ํ๊ณ Windows์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํํ๋ ๋ณต์กํ ๊ณผ์ ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค.
์ด ๊ธ์์๋ ์ ๊ฐ ๊ฒช์๋ ์ด๋ ค์๊ณผ ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ์ด ๋ด์ฉ์ด ํ์ฌ์ ๋ฏธ๋์ ๊ณผ์ ์ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฆ๊ฒ๊ฒ ์ฝ์ด๋ณด์ธ์!
์ ์ปจํ ์ด๋์ธ๊ฐ?
์ด ํ์ฌ๋ Hashicorp Nomad ์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ดํฐ ๋ฐ ๊ด๋ จ ๊ตฌ์ฑ์์(Consul ๋ฐ Vault)๋ฅผ ์ํ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ํดํค ์๋ฃจ์
์ ์ ๊ณตํ๊ธฐ ์ํ ํตํฉ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋ํ๊ฐ ์ ํ๋์์ต๋๋ค. ํ๋ก์ ํธ ์ธํ๋ผ์๋ Windows Server Core OS ๋ฒ์ 1803 ๋ฐ 1809๋ฅผ ์ฌ์ฉํ๋ Docker ํธ์คํธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก 1803 ๋ฐ 1809์ ๋ํ ๋ณ๋์ Docker ์ด๋ฏธ์ง ๋ฒ์ ์ ๋น๋ํด์ผ ํฉ๋๋ค. ๋ฒ์ 1803์์๋ ๋น๋ Docker ํธ์คํธ์ ๊ฐ์ ๋ฒํธ๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ธฐ๋ณธ Docker ์ด๋ฏธ์ง์ ๊ฐ์ ๋ฒํธ์ ์ด ์ด๋ฏธ์ง์ ์ปจํ
์ด๋๊ฐ ์์๋ ํธ์คํธ์ ์ผ์นํด์ผ ํฉ๋๋ค. ๋ฒ์ 1809์๋ ๊ทธ๋ฌํ ๋จ์ ์ด ์์ต๋๋ค. ๋ ์ฝ์ด๋ณด์ค ์ ์์ต๋๋ค
์ ๋ค๋จ๊ณ์ธ๊ฐ?
๊ฐ๋ฐ ํ ์์ง๋์ด๋ ๋น๋ ํธ์คํธ์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์๊ฑฐ๋ ๋งค์ฐ ์ ํ๋์ด ์์ผ๋ฏ๋ก ์ด๋ฌํ ํธ์คํธ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ธฐ ์ํ ๊ตฌ์ฑ ์์ ์งํฉ์ ์ ์ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(์: Visual Studio์ฉ ์ถ๊ฐ ๋๊ตฌ ์ธํธ ๋๋ ์ํฌ๋ก๋ ์ค์น). ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋น๋ Docker ์ด๋ฏธ์ง์ ์ค์นํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ ์ํ๊ฒ dockerfile๋ง ๋ณ๊ฒฝํ๊ณ ์ด ์ด๋ฏธ์ง ์์ฑ์ ์ํ ํ์ดํ๋ผ์ธ์ ์์ํ ์ ์์ต๋๋ค.
์ด๋ก ๋ถํฐ ์ค์ฒ๊น์ง
์ด์์ ์ธ Docker ๋ค๋จ๊ณ ์ด๋ฏธ์ง ๋น๋์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋๋ฅผ ์ํ ํ๊ฒฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด๊ฐ ๋น๋๋ ๋์ ๋์ผํ Dockerfile ์คํฌ๋ฆฝํธ๋ก ์ค๋น๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ค๊ฐ ๋งํฌ, ์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ ๋จ๊ณ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ Docker ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ข ์ ํญ๋ชฉ์ ์ค์น ์๊ฐ์ ์ค์ด๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์ํ๋์์ต๋๋ค.
์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํ dockerfile ์คํฌ๋ฆฝํธ์ ์ฃผ์ ์ฌํญ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์ํ OS ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ค๋ฉด ๋น๋ ์ค์ ๋ฒ์ ๋ฒํธ๊ฐ ์ ๋ฌ๋๋ dockerfile์ ์ธ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ ์ด๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ํ๊ทธ์ด๊ธฐ๋ ํฉ๋๋ค.
Microsoft Windows Server ์ด๋ฏธ์ง ํ๊ทธ์ ์ ์ฒด ๋ชฉ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
๊ธฐ๋ณธ์ ์ผ๋ก ์ง์นจ์ ๋ช
๋ น์ RUN
Windows OS์ dockerfile ๋ด์์๋ cmd.exe ์ฝ์์์ ์คํ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ์์ฑ์ ํธ์์ ์ฌ์ฉ๋๋ ๋ช
๋ น์ ๊ธฐ๋ฅ ํ์ฅ์ ์ํด ๋ค์ ๋ช
๋ น์ ํตํด Powershell์ ๋ช
๋ น ์คํ ์ฝ์์ ์ฌ์ ์ํ๊ฒ ์ต๋๋ค. SHELL
.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
๋ค์ ๋จ๊ณ๋ ์ด์ฝ๋ฆฟ ํจํค์ง ๊ด๋ฆฌ์์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ๋ ๊ฒ์ ๋๋ค.
COPY chocolatey.pkg.config .
RUN Set-ExecutionPolicy Bypass -Scope Process -Force ;
[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.ServicePointManager]::SecurityProtocol -bor 3072 ;
$env:chocolateyUseWindowsCompression = 'true' ;
iex ((New-Object System.Net.WebClient).DownloadString(
'https://chocolatey.org/install.ps1')) ;
choco install chocolatey.pkg.config -y --ignore-detected-reboot ;
if ( @(0, 1605, 1614, 1641, 3010) -contains $LASTEXITCODE ) {
refreshenv; } else { exit $LASTEXITCODE; } ;
Remove-Item 'chocolatey.pkg.config'
Chocolatey๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ์ค์นํ๋ ค๋ฉด ํจํค์ง๋ฅผ ๋ชฉ๋ก์ผ๋ก ์ ๋ฌํ๊ฑฐ๋ ๊ฐ ํจํค์ง์ ๊ณ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ํ ๋ฒ์ ํ๋์ฉ ์ค์นํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ ์ํฉ์์๋ ํ์ ํจํค์ง์ ํด๋น ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ด ํฌํจ๋ XML ํ์์ ๋งค๋ํ์คํธ ํ์ผ์ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="python" version="3.8.2"/>
<package id="nuget.commandline" version="5.5.1"/>
<package id="git" version="2.26.2"/>
</packages>
๋ค์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
๋น๋ ํ๊ฒฝ, ์ฆ MS Build Tools 2019๋ฅผ ์ค์นํฉ๋๋ค. ์ด๋ Visual Studio 2019์ ๊ฒฝ๋ ๋ฒ์ ์ผ๋ก, ์ฝ๋ ์ปดํ์ผ์ ํ์ํ ์ต์ ๊ตฌ์ฑ ์์ ์งํฉ์ด ํฌํจ๋์ด ์์ต๋๋ค.
C++ ํ๋ก์ ํธ๋ฅผ ์๋ฒฝํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ํ์ํฉ๋๋ค.
- ์ํฌ๋ก๋ C++ ๋๊ตฌ
- ํด์ v141
- ์๋์ฐ 10 SDK(10.0.17134.0)
JSON ํ์์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ์ฌ ํ์ฅ๋ ๋๊ตฌ ์ธํธ๋ฅผ ์๋์ผ๋ก ์ค์นํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ํ์ผ ๋ด์ฉ:
์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์์ ์ ์ฒด ๋ชฉ๋ก์ ์ค๋ช ์ ์ฌ์ดํธ์์ ์ฐพ์ ์ ์์ต๋๋ค.
Microsoft Visual Studio .
{
"version": "1.0",
"components": [
"Microsoft.Component.MSBuild",
"Microsoft.VisualStudio.Workload.VCTools;includeRecommended",
"Microsoft.VisualStudio.Component.VC.v141.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
]
}
dockerfile์ ์ค์น ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ ํธ์๋ฅผ ์ํด ๋น๋ ๋๊ตฌ ์คํ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ํ๊ฒฝ ๋ณ์์ ์ถ๊ฐํฉ๋๋ค. PATH
. ๋ํ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ถํ์ํ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
COPY buildtools.config.json .
RUN Invoke-WebRequest 'https://aka.ms/vs/16/release/vs_BuildTools.exe'
-OutFile '.vs_buildtools.exe' -UseBasicParsing ;
Start-Process -FilePath '.vs_buildtools.exe' -Wait -ArgumentList
'--quiet --norestart --nocache --config C:buildtools.config.json' ;
Remove-Item '.vs_buildtools.exe' ;
Remove-Item '.buildtools.config.json' ;
Remove-Item -Force -Recurse
'C:Program Files (x86)Microsoft Visual StudioInstaller' ;
$env:PATH = 'C:Program Files (x86)Microsoft Visual Studio2019BuildToolsMSBuildCurrentBin;' + $env:PATH;
[Environment]::SetEnvironmentVariable('PATH', $env:PATH,
[EnvironmentVariableTarget]::Machine)
์ด ๋จ๊ณ์์๋ C++ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํ์ผ์ ์ํ ์ด๋ฏธ์ง๊ฐ ์ค๋น๋์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ๋ค๋จ๊ณ ๋น๋ ์์ฑ์ ์ง์ ์งํํ ์ ์์ต๋๋ค.
๋ค๋จ๊ณ ์๋
๋ด์ฅ๋ ๋ชจ๋ ๋๊ตฌ์ ํจ๊ป ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ ์ด๋ฏธ์ง๋ก ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ์ด์ dockerfile ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋ ์ฌ์ฌ์ฉ์ด ์ฝ๋๋ก ๋ฒ์ ๋ฒํธ/์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ๋์ ์ผ๋ก ์ง์ ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์
๋๋ค. ๋ผ๋ฒจ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. as builder
์ง์นจ์ ์กฐ๋ฆฝ ์ด๋ฏธ์ง์ FROM
.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์ฐจ๋ก์ ๋๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์ค ์ฝ๋์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ๋ณต์ฌํ๊ณ ์ปดํ์ผ ํ๋ก์ธ์ค๋ฅผ ์์ํฉ๋๋ค.
COPY myapp .
RUN nuget restore myapp.sln ;
msbuild myapp.sln /t:myapp /p:Configuration=Release
์ต์ข
์ด๋ฏธ์ง ์์ฑ์ ๋ง์ง๋ง ๋จ๊ณ๋ ๋ชจ๋ ์ปดํ์ผ ์ํฐํฉํธ์ ๊ตฌ์ฑ ํ์ผ์ด ์์นํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ์ค๊ฐ ์ด์
๋ธ๋ฆฌ ์ด๋ฏธ์ง์์ ์ปดํ์ผ๋ ํ์ผ์ ๋ณต์ฌํ๋ ค๋ฉด ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. --from=builder
์ง์นจ์ COPY
.
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./
์ด์ ๋จ์ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ํ๋ ๋ฐ ํ์ํ ์ข
์์ฑ์ ์ถ๊ฐํ๊ณ ์ง์นจ์ ํตํด ์์ ๋ช
๋ น์ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ENTRYPOINT
๋๋ CMD
.
๊ฒฐ๋ก
์ด ๊ธฐ์ฌ์์๋ Windows์ ์ปจํ ์ด๋ ๋ด๋ถ์์ C++ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ณธ๊ฒฉ์ ์ธ ์ปดํ์ผ ํ๊ฒฝ์ ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ docker ๋ค๋จ๊ณ ๋น๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณธ๊ฒฉ์ ์ธ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ์ต๋๋ค.
์ถ์ฒ : habr.com