tools & libs/도커

[docker] 04. container 활용

  • -

앞선 포스트에서 컨테이너의 라이프사이클에 대해서 살펴보았다. 어번 포스트에서는 본격적을 container를 사용하는 방법에 대해 알아보자.

container가 설치된 pc를 host라고 하는데 container의 사용은 container와 host의 통신 및 container에서 host의 자원 사용 2가지 부분을 살펴보자.

 

container와 host의 통신

 

외부에서의 접근

이제 container에서는 httpd 이미지가 80 포트에서 동작하고 있다. 문제는 이 80 포트라는 것은 host 내부에 있는 container의 포트이기 때문에 외부 클라이언트에게는 전혀 보이지 않는다. 따라서 외부 클라이언트가 접근할 수 있는 host를 통해 container에 접근할 수 있는 방법이 필요하다.

 

host와 container의 port 연결

이제 다시 container를 run 시키면서 optional settings에서 Ports의 Local Host 에 8080 이라는 포트를 지정해주자.

container의 port는 80으로 고정되어있는 것을 볼 수 있다. 이제 외부에서 8080 포트로 접근하면 container의 80 포트로 포트포워딩이 되면서 아래의 웹 페이지가 표시된다. (공유기의 포트 포워딩과 동일하다.)

 

command line 활용

물론 위의 과정은 command line을 통해서 도 가능하다.

container의 port를 host에 연결하기 위해서는 --publish 즉 -p 옵션을 사용한다.

--publish , -p		Publish a container's port(s) to the host

아래는 새롭게 8081번 포트를 이용해서 httpd 이미지를 실행시키는 예이다.

C:\Users\itsmeyjc>docker run  --name my_ws_by_cli -p 8081:80 httpd

이제 80801 포트를 이용해서 두 번째 container인 my_ws_by_cli에 접속해서 성공적으로 서비스를 받을 수 있게 되었다.

 

컨테이너의 명령 활용

container의 port를 host에 공개함으로써 외부와의 접속이 가능하게 되었다. 하지만 지금은 단지 기본적으로 제공되는 container를 사용할 뿐 container를 성공적으로 지배하지는 못하고 있다.  이제 container의 내부에 들어가볼 차례이다.

 

cli 활용

container내에 들어가기 위해서는 cli를 이용한다. 

 

cli를 이용하면 container의 콘솔에 접근할 수 있다. (여기서는 리눅스의 기본 명령어들을 사용할 수 있어야 한다.) 

다음은 cli를 실행한 예이다. 타이틀에 /bin/sh가 있는 것을 보아 본쉘이라는 것을 이용하고 있음을 알 수 있다. ls는 파일 목록 출력, pwd는 현재 폴더의 출력을 의미한다.

 

command line 활용

만약 command line에서 위와 같은 작업을 하기 위해서는 exec 명령을 사용할 수 있다.

 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

다음은 -ti 옵션을 이용해서 지속적으로 통신하게 하고 my_ws container가 가진 /bin/sh 명령을 실행 시킨 후 ls 와 pwd 명령을 실행시킨 예이다.

다시 원래의 호스트로 이동하려는 경우 exit 명령을 입력한다.

 

index.html 수정

우리가 힘들게 container 내부에 들어온 이유는 컨테이너에 대한 여러가지 조작을 해보기 위해서이다. 간단히 httpd가 서비스하는 'It Works!"라는 페이지의 내용을 수정해보자.

httpd의 문서 파일을 살펴보면 project에서 생성된 파일(public-html)을 서비스 하기 위해 아래처럼 /usr/local/apache2/httpdocs에 복사하라는 내용이 있다.

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

즉 /usr/local/apache2/htdocs/ 경로가 웹서버의 root 경로인 것이다. cli를 통해 해당 경로로 이동해보자. 그러면 index.html이 외롭게 있는 것을 발견할 수 있다. 

이제 index.html을 수정할건데 container는 가볍게 만들어서 딱 원하는 기능만 가지고 있기 때문에 편집기를 포함하지 않는다. 따라서 nano와 같은 편집기를 먼저 설치해야 한다.

다음 절차를 이용해서 nano 에디터를 이용해 index.html을 열어보자.

# apt update       // advanced packaging tool 을 업데이트 한다.
# apt install nano // nano를 설치한다.
# nano index.html  // nano 편집기로 index.html을 연다.

정말 아주 간단한 html로 It works!가 작성되어있는 것을 볼 수 있다. 필요한 부분을 변경 후 저장(ctrl + s)하고 나와 보자.(ctrl + x)

이제 다시 페이지를 요청해보면 수정한 내용으로 잘 출력되는 것을 확인할 수 있다.

 

container에서 host의 자원 사용

 

container에서 작업의 위험성과 host 리소스 활용

이제 우리는 원하는 내용을 잘 서비스 할 수 있도록 container를 제어할 수 있게 되었다. 하지만 컨테이너 내에 있는 파일(index.html)을 이용해서 서비스 한다는 것은 매우 위험하다. container는 그냥 하나의 application 같은 것인데 여기에 데이터를 보관하다가 container가 날아가버리면 난감하고 위에서 작성했듯이 파일을 관리하는 것도 쉽지 않다. 프로젝트 소스 관리를 위해 git을 써야하겠는데 이것은 또 어떻게 해야 하나..

따라서 우리는 평상시 처럼 host에 파일들을 관리하고 container에서 host의 file syste에 접근하도록 구성해 줘야 한다.

예를 들어 c:/Temp/docker_httpd라는 폴더를 만들고 아래와 같이 index.html 파일을 만들어보자.

<html>
	<body>
		<h1>Hi Docker. I'm Host!!
	</body>
</html>

이제 container를 실행할 때 container의 file system이 아닌 host의 file system을 사용하도록 설정해주면 된다.

 

docker desktop 활용

먼저 docker desktop을 이용해보자. port를 지정했을 때 화면으로 이동해서 이제 Volumes의 Host Path 항목에서 위에서 index.html 파일을 만들어둔 c:\Temp\docker_httpd 폴더를 지정해주고 Container Path에는 index.html이 있던 /usr/local/apache2/htdocs 폴더를 지정한 후 run을 클릭하면 된다.

다시 페이지를 요청해보면 host의 파일을 이용해서 서비스가 잘 이뤄짐을 확인할 수 있다.

 

commad line 활용

command line을 이용할 때는 container를 생성할 때 -v 옵션으로 host와 container의 파일 시스템을 연결할 수 있다.

C:\Users\itsmeyjc>docker run -p 8081:80 -v c:\Temp\docker_httpd:/usr/local/apache2/htdocs httpd

역시 잘 동작함을 확인할 수 있다.

 

벌써 끝

  지금까지 도커를 이용해 간단하게 apache httpd를 서비스 하는 방법에 대해서 살펴봤다. 간단한 활용예였지만 정말 활용도가 무궁무진할것 같다. 앞으로는 힘들게 애플리케이션을 설치하기 보다는 미리 잘 설치된 image를 가져와서 그냥 사용만 하는 형태가 훨씬 많아지리라 생각해본다.

아울러 좋은 강의를 제공해주는 생활 코딩에 감사의 인사를 남기고 싶다. 감사합니다.~~

HOOXY나 이 글을 읽고 Docker에 관심이 생긴 독자분은 꼭 생활 코딩의 관련 강좌를 보시기 바랍니다. 정말 좋아요..

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.