Programming-[Infra]/Docker

도커 교과서(엘튼 스톤맨, 심효섭) - 1. 컨테이너 구성 환경과 원리, 기본 명령어

컴퓨터 탐험가 찰리 2023. 1. 3. 13:31
728x90
반응형

예제 파일 다운로드(길벗 출판사 제공) : https://github.com/gilbutITbook/080258

 

 

1. 도커의 구성환경 

가상 머신 방법과 다르게, 각 컨테이너가 같은 운영체제는 공유하면서 개별 IP, 호스트, 디스크 드라이브를 갖는 형태이다. 이러면 가상 머신 방식에 비해 훨씬 빠르고 운영체제를 가상 머신 개수별로 관리해줘야하는 부담도 줄어든다.

 

아래에서 배울 여러가지 container를 활용한 명령어들은 운영체제가 윈도우, 맥, 리눅스 인지에 상관없이 똑같이 적용할 수 있다. 다시 말해 컨테이너는 도커를 실행하는 컴퓨터의 운영체제를 공유하므로 도커 자체의 설치 시외에 다른 프로그램용 컨테이너를 쓸때는 운영체제를 따로 신경쓰지 않아도 된다. 다만 컨테이너 내부에서 작동하는 애플리케이션은 각 운영체제별로 다르게 동작할 수 있다.

 

 

 

2. 컨테이너 실행, 기본 명령어

 

컨테이너 실행과 이미지

터미널에서 아래 명령어를 입력하면 image를 local에서 찾을 수 없다는 내용과 함께 docker-hub에서 해당 이름의 최신(latest) 버전의 이미지를 다운로드 받고, 실행한다. docker-desktop에도 해당 이름의 이미지가 컨테이너로 등록된 것을 확인할 수 있다.

docker container run diamol/ch02-hello-diamol

 

여기서 혹시 도커에 로그인이 안되있으면 access가 불가능하다는 에러가 뜨니, 로그인을 하자. 그럼 docker-hub에서 저자가 등록해놓은 diaml/ch02-hello-diamol 이미지를 다운받을 수 있다.

docker desktop tray icon을 클릭하여 로그인하자

터미널 내용 일부

Unable to find image 'diamol/ch02-hello-diamol:latest' locally

latest: Pulling from diamol/ch02-hello-diamol

...

 

 

컨테이너를 원격 컴퓨터처럼 이용

docker container run --interactive --tty diamol/base
  • --interactive 플래그: 컨테이너에 접속한 상태로 만들어준다.
  • --tty 플래그: 터미널 세션을 통해 컨테이너를 조작하겠다고 선언하는 것이다(tty는 teletype을 의미한다. ~을 송신하다).

*이렇게 접속된 터미널 환경에서 hostname, date 명령어를 치면 해당 컨테이너의 hostname과 시스템 날짜를 확인할 수 있다.

 

 

여러가지 기본 명령어들

 

docker container ls

ls는 list의 줄임말이다. 현재 운영체제에서 실행 중인 Container의 list를 보여준다.

 

docker container top {container ID}

그냥 터미널에서 top 명령어를 치면 현재 운영체제에서 실행 중인 프로세스 정보들을 보여주는 것처럼, Docker도 특정 Container가 실행 중인 프로세스 목록을 보여준다.

* {container ID}값을 입력할 때 다른 Container ID와 중복되지 않는 자리 수 까지만 입력하면 된다. 위 사진에서는 f3까지만 입력했다.

 

docker container logs {container ID}

현재까지 해당 컨테이너에서 수집한 로그를 보여준다. 로컬로 사용하는 데이터베이스 컨테이너에 명령어를 입력했더니 에러가 났던 기록이 연속으로 출력됐다.

 

 

docker container inspect {container ID}

컨테이너의 상세 정보들을 출력해준다.

 

 

*터미널에 exit을 입력하면 해당 터미널에서의 작업을 로그로 남기고 프로세스를 종료할 수 있다.

 

 

 

3. 호스트 컴퓨터와 컨테이너의 상호작용

 

웹 호스팅 해보기

호스트 컴퓨터와 컨테이너가 어떻게 상호작용하는지 배우기 위해서 아래 명령어로 간단한 웹 사이트를 호스팅해본다.

docker container run --detach --publish 8088:80 diamol/ch02-hello-diamol-web
  • --detach: 애플리케이션이 종료되어도 컨테이너를 백그라운드에서 계속 실행하게 하고 싶다면 이 --detach 플래그를 적용해주면 된다. 기본적으로는 컨테이너는 내부의 애플리케이션이 종료되면 컨테이너의 상태를 종료로 변경한다. 종료된 컨테이너는 CPU나 메모리 같은 자원을 사용하지 않는다.
  • --publish: 컨테이너의 포트를 호스트 컴퓨터에 공개한다. 기본적으로 컨테이너의 IP 주소 및 포트는 호스트 컴퓨터에게 공개되지 않는다. 각 컨테이너의 IP 주소는 컨테이너 내부에 숨겨져있다. 위 명령어의 --publish 8088:80 부분은 호스트 컴퓨터의 8088 포트를 해당 컨테이너의 80 포트에 연결하겠다는 의미가 된다.

[호스트 컴퓨터와 컨테이너간 네트워크 상호작용 그림]

 

 

컨테이너에 요청 전달하기

docker container ls --all

명령어를 입력하여 실행 중, 실행 중이 아닌 모든 컨테이너를 조회할 수 있다.

맨 위 컨테이너를 보면 STATUS가 Up인 상태로 실행 중인 것을 볼 수 있고, PORTS도 0.0.0.0:8088 -> 80/tcp로 지정되어 호스트 컴퓨터의 8088번 포트로 들어오는 요청을 컨테이너의 80번 포트로 전달하도록 설정된 것을 확인할 수 있다.

 

브라우저에서 localhost:8088/로 접속해보면 컨테이너에서 구동 중인 서버로 요청이 들어가서 간단한 HTML 응답 페이지가 출력되는 것을 확인할 수 있다. 다시말해 호스트 컴퓨터의 8088포트로 요청을 쏴서, 컨테이너의 80번 포트로 전달된 것이다. 위에서 배운 docker container logs {컨테이너 ID} 명령어를 통해 로그를 출력해보면 컨테이너로 요청이 정상적으로 들어간 것을 볼 수 있다.

 

실행된 도커에 접속해서 데이터 변경하기

교재에 나온 연습문제와 관련된 내용이다.

docker exec -it {container 이름} {접속 디렉터리 path}

 

  • exec: execute의 약자로 특정 컨테이너에 접속하거나 어떤 명령을 내릴 수 있다.
  • -it: 위에서 배운 --interactive의 축약 플래그 -i와 --tty의 축약 플래그 -t를 합친 것이다.
  • {접속 디렉터리 path}: 보통 기본 리눅스 path인 /bin/bash로 입력한다. 하지만 알파인 리눅스 체계로 구성된 경우 /bin/sh로 입력하여 홈 디렉터리에 접근한다.

이렇게 실행 후 apache2/htdocs 디렉터리에 접근하면 index.html 페이지를 확인할 수 있다. 여기서 vi 명령어로 html 페이지를 열어서 VIM 커맨드로 내용을 수정하면 수정된 html 페이지를 확인할 수 있다.

 

 

 

4. 도커가 컨테이너를 실행하는 원리

 

  • 도커 엔진: 리눅스의 데몬, 윈도우의 서비스와 같이 항상 동작하는 백그라운드 프로세스다. 표준 HTTP 기반으로 작성된 도커 API와 소통하여 도커를 관리한다.
  • 도커 CLI(Command Line Interface): 위에서 배운 명령어들을 받아들이고 이를 도커 API에 전달한다. 즉 도커 API의 클라이언트가 도커 CLI이다.

 

도커 엔진과 상호작용하기 위해서는 반드시 도커 API를 거치도록 구성되어 있다. 기본적으로 외부 컴퓨터를 통해 도커 API 네트워크를 경유해서 도커 엔진에 접근할 수 없도록 되어있다. 하지만 도커 엔진의 설정을 수정하면 접근 가능하도록 바꿀 수도 있다.

728x90
반응형