도커 교과서-2장

김지수·2023년 5월 23일
0

도커

목록 보기
2/10

도커의 기본적인 사용법

컨테이너로 Hello World 실행하기

나는 윈도우 환경을 사용하기 때문에 파워쉘을 이용 할 것이다.

이번 장에서 이해해야하는 명령어는

docker container run diamol/ch02-hello-diamol

이다.
(이름이 diamol/ch02-hello-diamol인 도커 애플리케이션 패키지(이미지)를 내려받고 컨테이너로 애플리케이션을 실행해 메시지를 출력하는 과정이다.)

이제 차례차례 분리해서 생각해 보자.

docker container run

이 명령은 컨테이너로 애플리케이션을 실행하라는 도커 명령이다.
이 애플리케이션은 미리 도커로 실행하도록 패키징 돼 누구나 내려받을 수 있도록 공유된 것이며,
이 컨테이너 패키지(도커에선 '이미지'라 함)의 이름은 diamol/ch02-hello-diamol이다.

파워쉘 에서 위의 명령어를 입력해 보았다.

이미지가 없었기에 먼저 다운을 받았다.

그 후 이 이미지를 활용해 컨테이너를 실행했다.

응 뭐지?? 왜 나는 윈도우 환경임이 틀림없는데

어째서지?(이건 나중에 이유를 찾아봐야겠다)

방금 과정을 통해 도커를 사용하는 워크플로의 핵심을 볼 수 있다.
빌드 : 애플리케이션을 컨테이너에서 실행할 수 있도록 패키징
공유 : 다른 사람이 패키지를 사용할 수 있도록 공유
실행 : 이 패키지를 내려받은 사람이 컨테이너를 통해 실행하는 것

다시 실행 할 때마다 컴퓨터 이름과 IP주소가 바뀔 수 있다.

컨테이너란 무엇인가?

(각 컨테이너는 호스트명, IP주소, 파일 시스템을 지니는데 이는 도커가 만들어낸 가상 리소스이다.)

위의 구도를 통해 격리밀집이라는 것을 만족시킬 수 있다.
밀집이란 컴퓨터에서 CPU와 메모리가 허용하는 한 되도록 많은 수의 애플리케이션을 실행하는 것이다.
이는 여러 문제가 있다(런타임이 다름, 호환되지 않는 라이브러리, 과도한 리소스로 인한 리소스 부족)
해결 방법이 여러 가지가 있는데
그 중 하나는 VM을 이용하는 것이다. 다만 이것은 별도의 운영체제를 필요로 한다.
이는 CPU와 메모리 자원을 상당량 차지하고 라이선스 비용 등 추가 부담이 생긴다.
도커는 이 문제점들을 해결 할 수 있다.

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

docker container run --interactive --tty diamol/base

위의 명령어를 입력하면 다음과 같은 화면이 뜬다.


여기서 --interactive는 접속을 위해 사용한 것이고, --tty 플래그는 터미널 세션을 통해 컨테이너를 조작하겠다는 의미이다.


이렇게 입력이 가능하다.

여기서 중요한 것은 다음 문장이다.
"원격 컴퓨터에 접속한 것과 같은 로컬 터미널 세션이 열려 있다는 것"과 "연결된 컴퓨터가 현재 실행 중인 컨테이너라는 것"이다.

리눅스와 윈도우의 경우 같은 기능이지만 명령어가 다를 수 있다.
도커는 컨테이너의 내용물이 무엇이든 컨테이너를 다루는 방법은 환경과 상관없이 동일하다.


위의 사진은 현재 실행 중인 컨테이너에 대한 정보를 볼 수 있는 명령어이다. 잘 보면 ID값이 같은 것을 알 수 있다. 특정 컨테이너에 대해 실행할 수 있는 다양한 docker container 명령이 있는데, 이때 컨테이너를 특정하려면 컨테이너의 몇글자를 지정하면 된다.

위가 그에 해당하는 예시이다.

그 밖에도

docker container logs d1 // 대상 컨테이너에서 수집된 모든 로그 출력
docker container inspect d1 // 대상 컨테이너의 상세한 정보를 보여줌

등이 있다.

위는 단순한 예시고 이걸 통해 깨달아야하는 것이 있다.
바로 도커를 사용하는 한 컨테이너는 모두 똑같다는 것이다. run 명령으로 애플리케이션을 실행하고, logs 명령으로 로그를 출력하고, 프로세스 목록을 보려면 top 명령을 실행하며, 컨테이너의 상세 정보를 보고 싶다면 inspect 명령을 사용하면 된다.

컨테이너를 사용해 웹사이트 호스팅하기


방금 모든 docker에서 exit으로 나왔다. 그 결과 단순 ls에서는 현재 실행 중인 컨테이너가 없다 뜨며 ls -all에서 status를 보면 모두 existed가 됐다는 것을 알 수 있다.

이를 통해 2가지를 알 수 있다.
1) 컨테이너 내부의 애플리케이션이 실행 중이어야 컨테이너의 상태도 실행 중이 된다는 점이다. 종료된 컨테이너는 CPU 자원이나 메모리를 사용하지 않는다.
2) 컨테이너가 종료돼도 컨테이너는 사라지지 않는다는 점이다. 컨테이너의 파일 시스템이 그대로 남아 있으므로 호스트 컴퓨터의 디스크 공간을 계속 점유한다.

컨테이너를 실행하고 백그라운드에서 계속 동작하려면 어찌해야 할까?
도커의 주 목적은 웹사이트, 배치 프로세스, 데이터베이스 등이기 때문이다.

docker container run --detach --publish 8088:80 diamol/ch02-hello-diamol-web

뭐지... 단순히 컨테이너 ID만 출력된다.

docker container ls


오 컨테이너가 종료되지 않고 백그라운드에서 계속 동작한다.

자 이제 명령어를 분석해보자.
컨테이너가 백그라운드에서 동작하면서 네트워크를 주시(listen)하게 하려면 다음 두 플래그를 적용해야 한다

--detach //컨테이너를 백그라운드에서 실행하며 컨테이너 ID를 출력
--publish // 컨테이너의 포트를 호스트 컴퓨터에 공개

도커를 설치하면 호스트 컴퓨터의 네트워크 꼐층에 도커가 끼어들게 되는데, 그러면 호스트 컴퓨터에서 들고나는 네트워크 트래픽을 도커가 가로채서 그중 필요한 것을 컨테이너에게 전달한다.
앞 명령어 중 8088:80라고 입력한 부분이 있을 텐데, 이 의미는 호스트 컴퓨터의 8080번 포트로 들어온 트래픽이 컨테이너의 80번 포트로 전달됐다는 의미이다.
참고로 컨테이너의 IP주소는 도커가 부여한 도커 가상 네트워크 주소이지 실제 물리 네트워크가 아니다. 호스트 컴퓨터가 연결된 물리 네트워크의 컴퓨터는 컨테이너의 IP 줄소로 접근할 수 없다.(도커 내부에만 존재하기 때문) 다만 포트가 공개됐기 때문에 트래픽을 전달 할 수 있는 것이다.

http://localhost:8088/


해당 http요청은 로컬 컴퓨터에서 보낸 것이지만, HTTP 응답은 컨테이너로부터 나온 것이다.

해당 웹 페이지는 웹 서버와 함께 이미지로 패키징 된다.

docker container stats

명령어를 통해 실행 중인 컨테이너의 상태를 확인할 수 있다.

이제 종료하는 것을 배워보자.

docker container rm --force $(docker container ls --all --quiet)

이는 모든 컨테이너를 삭제하라는 명령어이다.
--force 이후에 ID를 이용하면 지정한 컨테이너를 삭제할 수 있다.

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

도커 엔진은 도커의 관리 기능을 맡는 컴포넌트다. 도커 엔진은 항시 동작하는 백그라운드 프로세스이다.
도커 명령행 인터페이스는 도커 API의 클라이언트다. docker 명령을 사용할 때 실제로 도커 API를 호출하는 것이 바로 도커 CLI이다.
즉 도커 엔진과 상호 작용할 수 있는 유일한 방법은 API를 통하는 방법 뿐이다. CLI는 API에 요청을 전달하는 역할을 한다.
도커 API는 명세가 공개되어 있다. 그러므로 도커 CLI 외의 다른 클라이언트를 사용할 수 있다.(이미지 그래픽 인터페이스를 통해 시각적으로 컨테이너를 관리할수 있는 클라이언트도 있다.)


마지막으로 도커 엔진은 containerd라는 컴포넌트를 통해 컨테이너를 실제로 관리하는데, containerd는 호스트 운영체제가 제공하는 기능을 통해 가상환경을 만든다.

연습 문제

이번 장의 연습 문제는 앞서 실행해 봤던 웹 사이트 컨테이너를 실행하고 index.html 파일을 교체해 웹 페이지의 내용을 수정하는 것이다.

이제 풀어보자 한번 돌려볼까?

흠 보아하니 백그라운드로 화면에 띄워야겠다.

호스트 8080번 포트로 들어온 트래픽을 컨테이너 80번으로 전달해보았다.

오케이 여기까지가 웹 사이트를 컨테이너에 실행한 것이다. 이제 index.html 파일을 교체해보자.

여기서 무엇을 이용해야 할까?

답지를 보니 난 하나의 컨테이너를 이용할 것이기에 해당 컨테이너 명을 이용해야한다.
또한 exec 명령을 통해 해당 컨테이너의 구성분을 볼 것이다.

이것을 통해 해당 컨테이너의 목록을 살펴 볼 수 있다. 이제 교체를 해보자.
원래 있던 것을 덮어 씌울 것인데 방식은 다음과 같다.

이렇게 하면 된다.

추가 조사

흠 단순히 답지를 따라 하는 것 말고 내 방식대로 해볼까?

이게 해당 컨테이너를 구성하는 성분이다. 이 중에 html이 아까 있던 거겠지. 응?? 근데 usr이 안보인다. 접근을 일부러 막아둔것인가.

아아 현재 내 경로가 이러니까 그러지.

그렇다면?

일단 지워 놓고 이제 내것을 옮기자.
아 이게 어쩔 수 없이 cp를 써야한다.
이유는 local과 container의 사이에서 파일 및 폴더를 복사하는 것은 해당 명령 밖에 없기 때문이다. 따라서

이게 최선인 것이다.

profile
노는게 제일 좋아

0개의 댓글