part1에서 작성했듯이 windows 컨테이너를 linux host에서 실행하거나, linux container를 windows host에서 실행하는 것은 불가능합니다.
따라서 windows 환경에서 linux container를 실행하고 또 linux 기반의 이미지를 생성해 linux host에서 컨테이너를 실행할 수 있는 방법에는 2가지가 있습니다.
그러나 이 방법을 사용하는 경우, linux vm 상에서 모든 것이 이뤄지기 때문에 windows가 실질적으로 관여하는 부분은 없습니다. 따라서 windows기반 docker 이미지를 생성하거나, windows 기반 docker 컨테이너를 실행할 수도 없습니다.
이 방법은 다소 오래된 방법으로, 당시에는 windows 환경에서 linux 기반 docker container 또는 imgage 관련 작업을 수행할 수 있는 유일한 방법이었습니다.
docker destktop은 virutalbox를 사용하지 않고 microsof Hyper-v라는 windows 내장 가상화 기술을 사용합니다.
windows용 docker를 설치할 때 자동으로 그 아래에 linux 시스템을 생성합니다.
기존의 방식을 따르면, windows 환경에 virtualBox와 같은 가상화 소프트웨어를 설치하고, 그 위해 linux vm을 생성하고, 그 위에 linux 환경을 기반으로 하는 docker를 설치할 수 있었습니다. (linux container, linux docker image만 가능)
그런데 docker desktop을 사용하므로써, 그 안에 내장된 hyper-v라는 내장 가상화 소프트웨어가 linux system을 생성할 수 있게 되었습니다.
hyper-v
Windows Server 2008 부터 기본적으로 제공되는 서버 가상화 솔루션으로,
가상화 기술을 사용하여 가상화 된 컴퓨팅 환경을 만들고 관리할 수 있는 인프라를 제공합니다.
즉, Hyper-V Manager 도구를 사용하여 가상 머신(리눅스, 윈도우 등)을 생성하고 관리할 수 있습니다.
** 추가적으로, windows Server 2016 부터는 windows 기반의 docker 이미지와 docker 컨테이너를 지원합니다. docker destktop을 설치할 때 linux 기반의 docker container를 사용하는 것을 기본 옵션으로 가지고 있습니다. 추후에 windows 기반 docker를 사용하고자 할 때, 이를 옵션을 통해 변경해줄 수 있습니다.
내장 hyper-v를 가지는 docker desktop은 windows 10 prefessional/Entreprise/Education edition 혹은 windows Server 2016 edition부터 제공합니다.
따라서 windows home 10/11 edition을 사용하는 경우 hyper-v를 포함한 docker desktop을 사용할 수 없습니다.
이를 대체하기 위해 WSL2를 사용할 수 있습니다. WSL2는 Windows Subsystem for Linux 2로 Windows 환경에서 Linux를 사용할 수 있도록 도와줍니다.
hyper-v를 사용하지 못하는 경우, WSL2를 먼저 설치하고,docker desktop을 설치할 수 있습니다.
위와 같이 configuration에서 hyper-v 대신 WSL2를 사용하도록 설정해줄 수 있습니다.
docker run
: 이미지로부터 컨테이너를 실행할 때 사용됩니다.
: docker host에 해당 이미지 인스턴스가 존재한다면, 해당 instance를 실행합니다.
: image가 host에 없다면 docker hub로 이동해 이미지를 pull합니다.
: sleep option과 함께 컨테이너 실행 시 컨테이너를 N초 동안 잠재울 수 있습니다.
: conatiner를 run하면, 터미널은 해당 docker container 내부로 연결됩니다.
: 예를들어 웹서버를 run하면,아래와 같이 웹 서버의 실행 환경 속에 들어오게 됩니다. 이 경우 CRTL+C를 하지 않거나, 웹서버가 자동으로 중단되지 않으면, docker의 명령 프롬프트로 돌아올 수 없게 됩니다. 이 때 -d 옵션을 사용하면, docker container를 백그라운드에서 실행시키고, 명령 prompt로 돌아올 수 있습니다.
: 즉, -d 옵션을 사용하면 컨테이너가 호스트 터미널에 연결되지 않고 실행됩니다. 컨테이너의 로그를 실시간으로 확인할 필요가 없을 때 유용합니다.
docker attach {container 이름 또는 id}
: -d 옵션(dettach)을 통해 실행된 도커 컨테이너를 다시 터미널에 연결할 때 사용합니다.
: 다시 도커 컨테이너 내부로 들어갈 수 있습니다.
docker ps
: 실행되는 컨테이너의 리스트와, 그 컨테이너의 기본 정보를 나열합니다.
: container id, image의 이름 등등
: -a 옵션을 사용하면 이미 멈췄거나 종료한 컨테이너까지 모두 출력합니다.
docker stop
: 컨테이너 id 혹은 컨테이너의 이름을 입력하여 해당 container를 종료시킬 수 있습니다.
: 정상적으로 종료되어 컨테이너가 종료된 경우, ps명령어로 조회를 했을 때 statust가 Exited(0)
으로 뜨지만, stop 명령어를 통해 종료됐을 경우 Exited(137)
로 뜨게 됩니다.
docker rm {docker container id/name}
: 컨테이너를 영구적으로 삭제합니다
: -a 옵션과 함께 ps 명령어를 실행해도 보이지 않습니다.
-docker images
: 현재 host에서 사용할 수 있는 도커 이미지의 목록이 나열됩니다.
docker container의 목적은 운영 체제 호스팅이 아니라, 특정 작업이나 프로세스를 처리하는 것입니다. 예를 들면 웹서버나 데이터베이스의 인스턴스를 실행할 수 있습니다. 따라서 특정 작업이나 프로세스가 끝나면 컨테이너는 자동으로 종료됩니다. 내부 프로세스가 실행되는 동안만 컨테이너가 존재하게 됩니다. 따라서 컨테이너 내부의 웹 서버가 실행 중에 멈추거나 충돌이 발생하면 컨테이너도 종료됩니다.
docker exec container1 cat /etc/host
와 같이 사용할 수 있습니다.