DockerFile To Image To Container 1편

3 분 소요

DockerFile to Image

지난 편에서 우리는 VHD에서 DockerFile을 추출할 수 있었다.

Vhd to dockerfile

이제 추출된 DockerFile을 이용해 Image를 생성해보겠다.

IIS Artifact를 통해 추출해놓았던 경로로 이동한다.

image-20191115222028638

#IIS Artifact를 통해 추출해놓았던 경로로 이동한다.
cd D:\dockerfile_from_VHD\IIS

image-20191116115451829

#DockerFile로부터 이미지 만들기
#docker build -t '생성할이미지명' --tag '이미지에붙일태그' .
#마지막에 지정된 . 은 DockerFile 존재하고 있는 폴더 즉  D:\dockerfile_from_VHD\IIS 이다.
docker build -t shw-aspnet-website --tag shw-aspnet-website:0.1 .

image-20191116115624446

image-20191116115655559

image-20191116115757869

shw-aspnet-website 이미지가 생성되었는지 확인해 보자.

docker images

image-20191116120505775

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

image-20191117164821102

컨테이너가 시작되고 서비스가 올라왔다.

Powershell을 관리자권한으로 하나를 새롭게 열고 실행중인 컨테이너를 확인해보자.

docker ps

image-20191117164906293

shw-aspnet-website 이미지로부터 생성된 shw-aspnet-website-container를 확인할 수 있고 80포트를 사용하고 있음을 확인할 수 있다.

컨테이너를 중지 시켜본다.

#docker stop '컨테이너명'
docker stop shw-aspnet-website-container

image-20191117165219645

이번엔 모든컨테이너를 확인해보자

docker ps -a

image-20191117165445383

뭔가 이상하다.. 분명 shw-aspnet-website-container 이 컨테이너를 remove 한 것이 아니고 stop만 시켰는데..

remove 되어서 보이지 않는다..

그 이유는 우리가 처음 shw-aspnet-websit-container 를 만들 때 주었던 –rm 옵션 때문이다.

아래 명령으로 run 의 도움말을 찾을 수 있다. 자동으로 remove 되는 옵션이라고 나와있다.

docker run --help

image-20191117165942416

그래서 우리는 --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

image-20191117184444876

ip가 172.27.18.167 이다. ping 한번 때려볼까?

image-20191117184604741

Default Web Site에 있는 WebPage에 접근해보자. 정적인 html 은 잘 뜬다.

image-20191117184325947

Container 내부에 dll 과 aspx파일을 복사(웹응용프로그램 배포)해보자

실행되고 있는 컨테이너 목록 보기

docker ps

image-20191117170603971

shw-aspnet-website-container 선택해 파워셀로 진입

docker exec -i -t shw-aspnet-website-container powershell

image-20191117170919278

컨테이너의 내부에서 dir 명령을 치면 컨테이너 내부의 파일구조를 알 수 있다.

exit 명령을 입력하여 컨테이너에서 빠져나온다.

여기에서 우리는 간단한 웹응용프로그램을 만들어 컨테이너 내부에 복사해볼것이다.

화면에 “안녕? 여러분?”을 출력하는 웹응용프로그램이다.

image-20191117145950864

target framework는 4.6.1로 지정되어 있다.

image-20191119222943412

image-20191117150412526

image-20191117150428167

빌드를 하면 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

image-20191117171041950

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

image-20191117183224983

image-20191117183250521

image-20191117183424489

컨테이너 내부의 파일을 살펴보면 정상적으로 복사가 된 것을 확인할 수 있다.

image-20191117183703844

그상태에서 컨테이너의 ip 확인

image-20191117183914459

ip : 172.27.186.167

http://172.27.18.167/hello.aspx 접속해 본다.

어라? 당연히 “안녕? 여러분?” 문자가 찍혀있는 웹브라우저를 생각했는데…

에러가 떡하니 나온다..

image-20191117190000863

왜 그럴까 ? 일단 Web.config 를 수정해 에러의 내용을 봐야겠다.

컨테이너 내부로 들어가 웹응용프로그램 경로로 이동한다.

image-20191117200030353

그리고 에러의 상세내용을 볼 수 있게 수정한 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>"

image-20191117200234731

http://172.27.18.167/hello.aspx 접속 하니 다음과 같은 상세 에러가 보인다.

image-20191117200454278

아무래도 target framework 이 4.6.1로 되어 있는 assembly를 로딩하지 못하는 에러인것 같다.

다음편 DockerFile to Image to Container 2편 에서는 현재 발생한 이 에러를 해결해 보겠다.

다음편에서 계속….

그런데 여기서 드는 의문점

실질적으로 웹서비스를 제공한다고 하면 사용자들은 docker 컨테이너 아이피가 아닌 호스트의 아이피로 접근을 할텐데.. 과연 호스트 아이피로 docker 컨테이너 내부로의 접근이 가능할까?

docker가 올라와있는 물리적서버 아이피 : 192.169.219.151

image-20191117143413544

역시 예상했던대로 사이트에 연결할 수 없다.

이 문제도 다음편 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

댓글남기기