DockerFile To Image To Container 1편
DockerFile to Image
지난 편에서 우리는 VHD에서 DockerFile을 추출할 수 있었다.
Vhd to dockerfile
이제 추출된 DockerFile을 이용해 Image를 생성해보겠다.
IIS Artifact를 통해 추출해놓았던 경로로 이동한다.
#IIS Artifact를 통해 추출해놓았던 경로로 이동한다.
cd D:\dockerfile_from_VHD\IIS
#DockerFile로부터 이미지 만들기
#docker build -t '생성할이미지명' --tag '이미지에붙일태그' .
#마지막에 지정된 . 은 DockerFile 존재하고 있는 폴더 즉 D:\dockerfile_from_VHD\IIS 이다.
docker build -t shw-aspnet-website --tag shw-aspnet-website:0.1 .
shw-aspnet-website 이미지가 생성되었는지 확인해 보자.
docker images
shw-aspnet-website:0.1 이 제일 위에 생성되어 있음을 확인할 수 있다.
Image To Container
이제 shw-aspnet-website 이미지를 컨테이너화 시켜보자.
#docker run [옵션] --rm --name '컨테이너명' '이미지명'
docker run -it --rm --name shw-aspnet-website-container shw-aspnet-website
컨테이너가 시작되고 서비스가 올라왔다.
Powershell을 관리자권한으로 하나를 새롭게 열고 실행중인 컨테이너를 확인해보자.
docker ps
shw-aspnet-website 이미지로부터 생성된 shw-aspnet-website-container를 확인할 수 있고 80포트를 사용하고 있음을 확인할 수 있다.
컨테이너를 중지 시켜본다.
#docker stop '컨테이너명'
docker stop shw-aspnet-website-container
이번엔 모든컨테이너를 확인해보자
docker ps -a
뭔가 이상하다.. 분명 shw-aspnet-website-container 이 컨테이너를 remove 한 것이 아니고 stop만 시켰는데..
remove 되어서 보이지 않는다..
그 이유는 우리가 처음 shw-aspnet-websit-container 를 만들 때 주었던 –rm 옵션 때문이다.
아래 명령으로 run 의 도움말을 찾을 수 있다. 자동으로 remove 되는 옵션이라고 나와있다.
docker run --help
그래서 우리는 --rm 옵션을 제외하고 컨테이너를 만들 것이다. 다음과 같이.
docker run -it --name shw-aspnet-website-container shw-aspnet-website
Container 테스트해보기
Container에 할당 되어있는 IP를 알아내보자
#컨테이너내부에서 뭔가 명령어를 날리고 싶으면 docker exec 를 이용하면 된다.
#docker exec '컨테이너명' ipconfig
docker exec shw-aspnet-website-container ipconfig
ip가 172.27.18.167 이다. ping 한번 때려볼까?
Default Web Site에 있는 WebPage에 접근해보자. 정적인 html 은 잘 뜬다.
Container 내부에 dll 과 aspx파일을 복사(웹응용프로그램 배포)해보자
실행되고 있는 컨테이너 목록 보기
docker ps
shw-aspnet-website-container 선택해 파워셀로 진입
docker exec -i -t shw-aspnet-website-container powershell
컨테이너의 내부에서 dir 명령을 치면 컨테이너 내부의 파일구조를 알 수 있다.
exit 명령을 입력하여 컨테이너에서 빠져나온다.
여기에서 우리는 간단한 웹응용프로그램을 만들어 컨테이너 내부에 복사해볼것이다.
화면에 “안녕? 여러분?”을 출력하는 웹응용프로그램이다.
target framework는 4.6.1로 지정되어 있다.
빌드를 하면 Hello.aspx 파일과 bin\WebApplicaton1.dll 이 생성된다.
우리는 이 두개 파일을 컨테이너 내부의 C:\intepub\wwwroot 에 파일을 복사할 것이다.
docker cp 명령어를 실행해 본다.
#docker cp '복사할 대상이 되는 파일 경로' 컨테이너이름:'컨테이너내부의경로'
#Hello.aspx , bin 폴더 복사
docker cp D:\test\WebApplication1\Hello.aspx shw-aspnet-website-container:C:\inetpub\wwwroot\Hello.aspx
docker cp D:\test\WebApplication1\bin shw-aspnet-website-container:C:\inetpub\wwwroot
Error response from daemon: filesystem operations against a running Hyper-V container are not supported 에러가 발생한다.
그냥 copy를 하면 안되고 컨테이너를 stop 한 뒤 copy , 그리고 컨테이너 start 이런식으로 해줘야 한다.
Windows Server 2016에서는 그냥 해도 되지만 Win10에서는 Hyper-V 때문에 stop ,cp , start 과정을 거쳐야 한다.
#컨테이너 중지
#docker stop 컨테이너명
docker stop shw-aspnet-website-container
#docker cp '복사할 대상이 되는 파일 경로' 컨테이너아이디:'컨테이너내부의경로'
#Hello.aspx , bin 폴더 복사
docker cp D:\test\WebApplication1\Hello.aspx shw-aspnet-website-container:C:\inetpub\wwwroot\Hello.aspx
docker cp D:\test\WebApplication1\bin shw-aspnet-website-container:C:\inetpub\wwwroot
#컨테이너 시작
#docker start 컨테이너아이디
docker start shw-aspnet-website-container
컨테이너 내부의 파일을 살펴보면 정상적으로 복사가 된 것을 확인할 수 있다.
그상태에서 컨테이너의 ip 확인
ip : 172.27.186.167
http://172.27.18.167/hello.aspx 접속해 본다.
어라? 당연히 “안녕? 여러분?” 문자가 찍혀있는 웹브라우저를 생각했는데…
에러가 떡하니 나온다..
왜 그럴까 ? 일단 Web.config 를 수정해 에러의 내용을 봐야겠다.
컨테이너 내부로 들어가 웹응용프로그램 경로로 이동한다.
그리고 에러의 상세내용을 볼 수 있게 수정한 web.config를 추가해준다.
#web.config가 존재한다면 먼저 삭제한다.
Remove-Item C:\inetpub\wwwroot\Web.config
#web.config 생성
New-Item -Path C:\inetpub\wwwroot -Name Web.config -ItemType file -Value "<?xml version=`"1.0`" encoding=`"utf-8`"?><configuration><system.web><customErrors mode=`"Off`" /></system.web><system.webServer><httpErrors errorMode=`"Detailed`" existingResponse=`"PassThrough`"><remove statusCode=`"500`" /></httpErrors></system.webServer></configuration>"
http://172.27.18.167/hello.aspx 접속 하니 다음과 같은 상세 에러가 보인다.
아무래도 target framework 이 4.6.1로 되어 있는 assembly를 로딩하지 못하는 에러인것 같다.
다음편 DockerFile to Image to Container 2편 에서는 현재 발생한 이 에러를 해결해 보겠다.
다음편에서 계속….
그런데 여기서 드는 의문점
실질적으로 웹서비스를 제공한다고 하면 사용자들은 docker 컨테이너 아이피가 아닌 호스트의 아이피로 접근을 할텐데.. 과연 호스트 아이피로 docker 컨테이너 내부로의 접근이 가능할까?
docker가 올라와있는 물리적서버 아이피 : 192.169.219.151
역시 예상했던대로 사이트에 연결할 수 없다.
이 문제도 다음편 DockerFile to Image to Container 2편 해결해 보겠다.
참고 URL
https://github.com/docker/communitytools-image2docker-win
https://www.powershellgallery.com/packages/Image2Docker/1.8.5
https://stackoverflow.com/questions/45654570/unable-to-copy-to-windows-container-docker-cp-on-windows-10
http://get-cmd.com/?p=4980
댓글남기기