이 비디오에서 간략하게 다룰 내용은 컨테이너란 무엇인지, Windows Server 시스템에서 컨테이너를 어떻게 실행하는지, 컨테이너를 무슨 용도로 사용하는지입니다. 컨테이너는 애플리케이션을 실행할 수 있는 격리된 환경입니다.
컨테이너, 애플리케이션 및 모든 종속성은 커널 운영 체제, CPU 및 메모리와 같은 호스트 리소스의 조각으로 구성됩니다. 또한 다른 컨테이너 및 호스트와 논리적으로 분리되어 있습니다.
이 다이어그램은 빨간색 컨테이너와 노란색 컨테이너가 동일한 하드웨어 리소스와 커널 운영 체제를 사용하여 동일한 호스트 내에서 공존하지만 개별 공간 내에 포함되어 있어 외부 간섭 없이 애플리케이션을 실행할 수 있는 방법을 보여줍니다.
동일한 하드웨어와 해당 하드웨어에 설치된 운영 체제는 각 컨테이너에서 발생하는 작업과 독립적으로 자체 애플리케이션 및 서비스를 실행할 수 있습니다.
기본적으로 이 컨테이너는 일회용입니다. 컨테이너가 중지되면 컨테이너에 포함된 모든 소프트웨어와 파일이 삭제됩니다. 호스트가 재부팅되는 경우에도 마찬가지입니다.
컨테이너는 호스트 컴퓨터의 방화벽도 활용합니다. 이 모든 것을 가상 머신과 비교해 보겠습니다. 우선, 가상 머신에서 컨테이너를 실행할 수 있지만 컨테이너에서 가상 머신을 실행할 수는 없습니다.
가상 머신은 전체 컴퓨터를 시뮬레이션합니다. 따라서 자체 운영 체제를 실행해야 하므로 보다 강력한 보안을 구현할 수 있지만 더 많은 구성과 유지 보수가 필요하여 유휴 리소스가 생기는 경우가 많습니다.
컨테이너로 작업하는 방법에는 여러 가지가 있습니다. Visual Studio, Azure, Kubernetes, Windows를 포함해서요. 하지만 이 비디오에서는 Docker에 대해 이야기하겠습니다.
Docker는 Platform as-a-Service 제품으로, 애플리케이션, 모든 종속성 및 구성 정보를 컨테이너라는 단일 패키지로 결합하는 작업을 수행합니다.
그런 다음 Docker를 사용하여 해당 컨테이너를 전송, 실행 또는 삭제할 수 있습니다. 잠시 후 이 다이어그램으로 돌아올 겁니다. 실제 예시를 보며 자세한 내용을 살펴보겠습니다. 여기서는 Windows Server 2022를 새로 설치했습니다.
"Server Manager" 마법사를 시작하여 "Roles"와 "Features"를 추가하겠습니다. 보시는 대로 이 마법사를 사용하여 "Containers" 기능을 추가할 수 있습니다. 그러나 이것으로 Docker가 설치되지는 않습니다.
별도로 작업을 수행해야 합니다. 따라서 이 마법사를 취소한 후 "PowerShell"을 열고 다음 명령줄을 실행하여 먼저 필요한 공급자를 설치하겠습니다.
Install-Module, "DockerMsftProvider" 그리고 "PSGallery"를 소스로 사용하고 있습니다. 키를 누릅니다. 이 프롬프트에서 "y"를 입력하여 NuGet을 설치하고 완료될 때까지 기다립니다.
이제 두 번째 명령줄을 실행하여 Docker를 설치하겠습니다. Install-Package, "docker"를 입력한 다음 이전에 설치한 "DockerMsftProvider"를 지정합니다. 키를 누릅니다. 잠시 후 표시되는 프롬프트에서 "y"를 입력하여 계속 진행합니다.
컴퓨터를 재시작하라는 메시지가 표시됩니다. "Restart-Computer"를 입력하여 재시작합니다. 컴퓨터를 백업한 후 "Server Manager"에서 "Add Roles and Features Wizard"를 다시 엽니다.
"Containers" 기능이 이미 설치되어 있는 것을 볼 수 있습니다. 앞에서 두 PowerShell 명령줄을 실행하여 이 작업을 수행했죠. "PowerShell"에서 "docker"와 같은 명령을 실행하면 할 수 있는 모든 것을 파악할 수 있습니다.
예를 들어 Docker 버전은 엔진 버전 20.10.9로 실행 중임을 알려줍니다. 또 다른 명령인 "docker info"를 실행하면 아직 첫 번째 컨테이너를 생성하지 않았음을 확인할 수 있습니다.
또한 이 상자에는 컨테이너에 사용할 수 있는 CPU 및 RAM 크기, 생성된 "기본 격리 방법" 및 생성된 "네트워크" 유형과 같은 세부 정보가 제공되는데, 지금은 이에 대해 설명하지 않겠습니다.
첫 번째 컨테이너를 빌드하고 실행하는 단계를 실행하겠습니다. 방금 Docker를 설치한 이 Windows 시스템에서요. 이 다이어그램으로 돌아와서 Docker는 여러 항목을 컨테이너에 패키징하기 위한 툴이라고 했죠. 예를 들어 웹 애플리케이션을 컨테이너화하려면 해당 컨테이너 안에 여러 항목을 넣어야 합니다.
먼저 "Dockerfile"이 필요합니다. 이 파일에는 새 컨테이너를 만드는 데 필요한 구성 정보와 지침이 있습니다. Dockerfile은 다음과 같습니다. 매우 복잡하거나 매우 간단할 수 있습니다.
잠시 후에 하나 만들어 보겠습니다. 또한 컨테이너 이미지도 필요합니다. 이미지는 읽기 전용 템플릿과 같습니다. 예를 들어 "Windows Server Core" 템플릿 또는 "Nano Server" 템플릿을 사용하여 컨테이너를 빌드할 수 있습니다.
이 이미지 또는 템플릿은 웹 애플리케이션에 필요한 일부 종속성도 제공합니다. 예를 들어 "IIS" 서비스 및 개발 프레임워크요. 아울러 웹 애플리케이션이 필요합니다.
Docker를 사용하면 이 모든 것을 결합하여 컨테이너를 만들 수 있습니다. 실제 예를 살펴보겠습니다. 방금 전 PowerShell에서 Docker를 설치한 컴퓨터로 돌아가서 C 드라이브의 루트로 전환하고 "containers"라는 새 디렉터리를 만듭니다.
이 새로운 "containers" 디렉토리로 전환합니다. 첫 번째 컨테이너를 생성하려면 앞에서 설명한 Dockerfile이 필요합니다. 컨테이너에 대한 일련의 지침이 포함된 텍스트 파일이죠.
"New-Item"을 입력하고 "dockerfile"이라는 이름을 지정합니다. 보시는 대로 이 Dockerfile에는 확장명이 없습니다. Windows 탐색기에서 이 파일이 생성된 것을 확인할 수 있습니다. Notepad로 엽니다.
이 첫 번째 컨테이너를 단순하게 유지하기 위해 Dockerfile에 세 줄만 추가합니다. 하나씩 설명하겠습니다. 먼저 "From" 지침은 Docker에 컨테이너를 생성하는 데 사용할 컨테이너 이미지를 알려줍니다.
아까 말한 대로 이미지는 템플릿과 같습니다. 이 경우 Docker에 Microsoft 컨테이너 레지스트리의 이미지를 사용하도록 지시합니다. Windows Server Core를 기반으로 하고 "IIS" 역할도 설치된 레지스트리죠.
두 번째 줄은 실행 중인 새 컨테이너 이미지에서 실행할 명령을 지정합니다. 소프트웨어를 설치하거나 파일 및 디렉토리를 생성하기 위한 명령을 포함할 수 있습니다.
하지만 여기서는 Docker에 컨테이너가 실행되면 컨테이너에서 PowerShell을 실행하도록 지시합니다. 마지막으로, "Copy" 지침은 파일 또는 디렉토리를 호스트 컴퓨터에서 컨테이너의 파일 시스템으로 복사합니다.
이 경우 Docker에 잠시 후에 생성되고 샘플 웹 애플리케이션 역할을 하는 파일 이름 "index.html"를 호스트 컴퓨터에서 IIS의 기본 가상 디렉터리 경로인 컨테이너의 이 폴더로 복사하도록 지시합니다.
이게 전부입니다. 이 Dockerfile을 저장합니다. 이제 PowerShell로 돌아가 해당 컨테이너에서 실행할 웹 페이지를 만듭니다. 이를 위해 "New-Item" commandlet을 다시 사용하고 파일 이름으로 "index.html"을 지정합니다.
Windows 탐색기에서 Notepad로 이 파일을 엽니다. 이를 단순하게 유지하기 위해 세 줄만 이 샘플 HTML 애플리케이션에 추가합니다. 기본적인 "Hello World" 웹 페이지입니다.
저장하겠습니다. 이제 컨테이너를 생성하는 데 필요한 모든 구성 요소를 갖추었습니다. 이 Windows Server 시스템에 Docker가 설치되어 있고요.
Dockerfile이 있습니다. 앞에서 IIS가 있는 Microsoft 레지스트리의 서버 코어 이미지를 사용하는 지침으로 만들었죠.
또한 해당 Dockerfile의 지침에 HTML 웹 페이지를 빌드한 후 새 컨테이너에 복사하라는 내용이 포함되어 있습니다. 그러나 현재는 일련의 지침이 있을 뿐이며 아직 아무것도 실행 중이지 않습니다.
PowerShell로 돌아가서 이러한 지침에 따라 실제로 이미지를 생성합니다. "docker", "build"를 입력하고 이름, 즉 태그로 webserver를 할당합니다.
끝에 있는 이 후행 점은 이 컨테이너 디렉토리에서 작업한다는 것을 나타냅니다. 여기에 Dockerfile과 "index.html" 웹 페이지가 있습니다. 키를 누릅니다.
이 줄은 해당 Dockerfile에 지정된 지침을 사용하여 컨테이너를 생성할 기본 이미지를 만듭니다. 이 서버에서 이 이미지를 처음 호출하는 것이므로 Microsoft 컨테이너 레지스트리에서 다운로드해야 합니다.
이 모든 작업이 완료된 후 docker images와 같은 명령을 실행하면 최근에 다운로드한 이미지가 할당한 이름 또는 태그와 함께 표시됩니다. 이제 템플릿과 같은 컨테이너 이미지가 있습니다. 그러나 아직 실행 중인 컨테이너가 없습니다.
샘플 웹 애플리케이션에 아직 액세스할 수 없다는 것을 보여주기 위해 웹 브라우저를 열고 "localhost"를 입력하겠습니다. 이 작업은 실패합니다. 호스트에 IIS가 없고 웹 페이지를 호스팅할 수 없기 때문에 예상된 일입니다.
마지막으로 다운로드한 이미지 템플릿을 사용하여 컨테이너를 실행하려면 PowerShell로 돌아가서 "docker run"을 입력한 다음 해당 컨테이너의 이름을 지정합니다.
"container1"이라는 이름을 사용하겠습니다. 이 스위치를 사용하여 컨테이너가 백그라운드에서 실행되도록 지정합니다. 그리고 다른 하나는 컨테이너의 "포트 80"이 호스트의 "포트 80"에 매핑되도록 지정합니다. 그리고 이 컨테이너를 실행하도록 지정합니다. 앞에서 다운로드하여 빌드한 웹 서버 이미지를 사용해서요.
키를 누릅니다. 이것으로 마치겠습니다. "container1"이라는 컨테이너가 생성되어 실행됩니다. 방금 준비한 웹 서버 이미지를 기반으로요.
이 컨테이너에 메모리를 할당할 필요가 없었고 CPU나 가상 하드 디스크도 할당할 필요가 없었습니다. 가상 머신의 경우와 마찬가지로요.
이러한 리소스를 컨테이너에 할당할 필요가 없으며 컨테이너는 필요한 리소스만 사용하기 때문입니다. 브라우저로 돌아가서 "localhost"를 다시 입력해 봅니다.
샘플 웹 애플리케이션이 작동 중임을 볼 수 있습니다. 호스트에서 작동 중인 것은 아닙니다. 대신 호스트는 컨테이너에 포트 80을 전달합니다. 컨테이너는 웹 서버 이미지에 지정한 설정을 사용하여 생성되었으며 Dockerfile의 지침에 따라 HTML 웹 페이지가 컨테이너에 복사되었습니다.
명령줄을 통해 새로 생성된 이 컨테이너와 상호 작용할 수 있습니다. 예를 들어 새 PowerShell 창을 열고 "docker exec -ti" 명령을 입력하여 이 컨테이너에 대화형으로 연결하도록 지정하겠습니다.
컨테이너 이름 "container1" 그리고 "powershell"이요. 이 Docker 명령은 방금 만든 container1에서 PowerShell을 열고 프롬프트를 표시합니다.
이 경우 예를 들어 "hostname"을 입력하면 이 컨테이너에 컴퓨터 이름이 할당된 것을 볼 수 있습니다. "ipconfig"와 같은 명령을 입력하면 이 컨테이너에 네트워크 주소 변환을 사용하여 호스트 이상과 통신하는 IP 주소가 할당되었음을 알 수 있습니다.
앞에서 만든 HTML 웹 페이지를 약간 변경하겠습니다. Notepad에서 편집하고 여기에서 이 제목을 "container #1" 대신 "container #2"로 변경합니다. 이 파일을 저장합니다. 그리고 PowerShell로 돌아가서 앞에서 사용한 것과 동일한 두 줄을 사용하여 첫 번째 컨테이너를 빌드하고 실행할 것입니다.
우선, "docker build" 줄은 변경 없이 유지됩니다. 키를 누르면 거의 즉시 실행됩니다. IIS 역할이 설치된 서버 코어 이미지를 Microsoft 컨테이너 레지스트리에서 이미 다운로드했기 때문입니다.
두 번째 줄인 "docker run" 줄을 편집하여 "container2"라는 새 컨테이너를 만들고 이 컨테이너가 "container1"에 할당한 "포트 80" 대신 "포트 8080"에서 수신 대기하도록 지정합니다.
키를 누르고 이 작업이 완료되면 다시 브라우저에서 "localhost"로 돌아가지만 이번에는 "port 8080"을 지정합니다. 포트 8080에서 수신 대기하는 웹 페이지가 방금 생성한 "container #2"에서 호스팅되는 것을 볼 수 있습니다. 반면 HTTP의 기본값인 포트 80에서 수신 대기하는 포트는 "container #1"에서 호스팅됩니다.
PowerShell에서 "docker ps"를 실행해도 동일한 것을 볼 수 있습니다. 컨테이너 #1은 포트 80에서 수신 대기하는 반면 "컨테이너 #2"는 포트 8080에서 수신 대기합니다. 컨테이너 #1 및 "컨테이너 #2"에는 고유한 호스트 이름, IP 주소가 있으며 자체 웹 사이트를 호스팅합니다.
"container #1"에서 발생하는 모든 변경 사항은 "container #2"에 영향을 미치지 않습니다. "IIS" 역할이나 "hyper v" 역할을 호스트 서버에 설치하지 않고도 이 모든 작업을 수행할 수 있었습니다.
RAM, CPU 또는 가상 하드 디스크와 같은 리소스를 할당하거나 네트워킹을 구성할 필요도 없었습니다. 기본 템플릿 이미지가 로컬이면 컨테이너를 만드는 데 2-3초가 걸렸습니다.
마지막으로 컨테이너에서 실행할 수 있는 작업에 대해 간략히 이야기하겠습니다. 우선, Windows의 컨테이너는 Windows Server 2016 및 Windows 10에서 처음 지원되었습니다. 따라서 호스팅되는 응용 프로그램은 이러한 운영 체제 이상과 호환되는 것이 좋습니다.
애플리케이션에 그래픽 사용자 인터페이스 또는 드라이버가 필요한 경우 컨테이너에 배포하기에 적합하지 않습니다. 그러나 컨테이너를 사용하여 "Asp.net" 또는 "Apache"와 같은 애플리케이션 프레임워크, "Python"과 같은 프로그래밍 언어, 심지어 sqlserver-express, "mongodb" 또는 "mysql"과 같은 서비스 형태의 데이터베이스를 호스팅할 수 있습니다.
현재 컨테이너에서 "도메인 컨트롤러", "DNS" 또는 "DHCP"와 같은 Windows 인프라스트럭처 역할을 호스팅하는 것은 지원되지 않지만 향후에는 어떻게 될지 모릅니다.
지금까지 간략히 살펴본 내용은 컨테이너란 무엇이며, Windows Server 시스템에서 컨테이너를 어떻게 실행하고, 컨테이너를 어떤 용도로 사용할 수 있는지입니다. 이 정보가 도움이 되기를 바라며 시청해 주셔서 대단히 감사합니다.