[Docker] 도커 이미지/컨테이너

이수진·2022년 1월 25일
0
post-thumbnail

도커의 이미지와 컨테이너에 대해 알아보고
도커허브에서 직접 도커 이미지를 다운받고,
이미지를 컨테이너로 만들어 실행해보도록 하겠습니다!

저는 제가 할당한 aws ec2서버에서 직접 도커를 다운받고, 도커허브에 로그인까지 완료한 후에 실행하였습니다.

Docker Image(이미지)

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 "Docker Image"라고 합니다.
즉, 이미지는 컨테이너 실행에 필요한 모든 설정값(환경)이나 종속성들을 갖고있는 상태의 파일을 의미합니다.
도커 컨테이너를 만들기 위한 템플릿으로 생각하면 될 것 같습니다.

예를 들면, Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있다고 볼 수 있습니다.

  • 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있습니다.
  • 도커 이미지들은 github와 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포가 가능합니다.
  • 다양한 API가 제공되어 원하는 만큼 자동화가 가능합니다.
  • 도커는 Dockerfile이라는 파일로 이미지를 만듭니다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하게 쉽도록 명시합니다.
  • 여러 이미지들을 layer로 쌓아서, 원하는 형태의 이미지를 만들 수 있습니다.
    ex) ubuntu 이미지에, apache 웹서버 이미지를 얹어서, 웹서버 이미지를 만들 수 있습니다.

이미지와 레이어(Layer)

레이어란, 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념입니다.
이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 layer가 생성됩니다. 그래서 도커는 여러 개의 layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해줍니다.


위에 예시로 들었던 Ubuntu이미지를 직접 도커 허브에서 다운받아보고 서버에서 확인해보겠습니다.

먼저 서버에 들어와서 "docker images" 명령어를 통해 현재 있는 이미지를 확인해보겠습니다.

ubuntu@ip-172-31-38-68:~$ docker images

아직은 아무 이미지가 없습니다.
저는 도커허브에서 ubuntu:20.04 이미지를 다운받아 보겠습니다.

ubuntu@ip-172-31-38-68:~$ docker pull ubuntu:20.04

도커 허브에서 ubuntu:20.04를 docker pull 명령어를 이용하여 다운받은 뒤,
docker images 명령어를 통해 현재 다운받은 도커 이미지를 확인해볼 수 있습니다!


도커 컨테이너(Docker Container)

도커 컨테이너란, docker image를 실행한 상태를 의미합니다. 즉, 이미지의 인스턴스이며, 프로그램을 실행합니다.
응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술입니다.

  • 컨테이너는 이미지 layer에 읽기/쓰기 layer를 추가하는 것으로 생성/실행됩니다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용됩니다.
  • 컨테이너는 종료되었다고해서 메모리에서 삭제되지않고 남아있습니다. 삭제하려면 명시적으로 삭제해야 합니다. 즉, 종료가 되어도 컨테이너 & 읽기/쓰기 layer 또한 그대로 존재하기 때문에 다시 시작할 수 있습니다.
  • 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 모두 사라진다는 것입니다.
  • 한 서버는 여러 개의 컨테이너를 가져도 당연히 상관없으며, 컨테이너는 각각 독립적으로 실행됩니다.
  • 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유합니다.

정리하자면,

Dockerfile로 프로그램을 실행하는데 필요한 모든 설정이나 종속성들을 갖고 있는 Docker Image를 만들고(빌드하고),
Docker Image가 여러 개의 Docker Container를 생성한다고 보면 됩니다!



이제는, 다운받은 Ubuntu:20.04이미지를 컨테이너로 만들어 실행해보도록 하겠습니다.
  • 이미지와 컨테이너는 각각 관리해주어야 합니다.
  • 각 이미지는 컨테이너로 만들어주어야 실행이 가능합니다.
ubuntu@ip-172-31-38-68:~$ docker create ubuntu:20.04

이미지를 컨테이너로 만든 후에
현재 실행 중이지 않은 컨테이너까지 모두 포함해서, 전체 컨테이너를 확인해보면 다음과 같습니다.

생성한 도커 컨테이너를 실행해보도록 하겠습니다.

  • 도커 실행 명령어: docker start 컨테이너이름
ubuntu@ip-172-31-38-68:~$ docker start 15e

실행되자마자 종료된 ubuntu:20.04 컨테이너를 "docker ps -a" 명령어를 통해 확인할 수 있습니다.


docker run 명령어를 통해 컨테이너 생성 및 실행

  • run = pull + create + start

    run명령어는 해당 이미지를 pull하고 컨테이너를 create 그리고 start하는것까지의
    명령을 함축하고 있다고 보면 됩니다!

-d 옵션으로 우분투 컨테이너를 백그라운드로 실행해보도록 하겠습니다.

ubuntu@ip-172-31-38-68:~$ docker run -it -d ubuntu:20.04


도커에서 apache 컨테이너로 웹 서버 실행해보기

직접 컨테이너가 실행되는 것을 확인하고싶어서,
저는 apache 웹 서버를 docker run 명령어를 사용하여 바로 이미지를 다운받아 컨테이너로 만들어 실행시켜보겠습니다.

입력한 명령어는 다음과 같습니다.

ubuntu@ip-172-31-38-68:~$ docker run -d -p 9999:80 httpd

추가적인 명령어 옵션은 다음과 같습니다.

  • -d: detached mode 즉 백그라운드 모드입니다. (서버니까)
  • -p: 포트포워딩을 해주는 옵션입니다. 인자 뒤에는 [호스트 포트]:[컨테이너 포트]를 써주면 됩니다.
docker run -d -p 9999:80 httpd # 호스트의 9999포트로 들어오는 요청을 컨테이너의 80포트로 넘기는 컨테이너를 생성

그리고 이를 크롬 웹브라우저에서 직접 서버주소:9999로 들어가 확인해보겠습니다!
(ec2의 인바운드 규칙에 포트 9999에 대한 설정을 미리 해주어야 합니다)

서버의 9999포트로 요청을 날렸을때 잘 작동되는 것을 확인할 수 있습니다.
개발자도구를 키고 응답 헤더를 확인해봤을때,
Server: Apache/2.4.52를 확인할 수 있습니다.


[참고]

profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글