도커의 이미지와 컨테이너에 대해 알아보고
도커허브에서 직접 도커 이미지를 다운받고,
이미지를 컨테이너로 만들어 실행해보도록 하겠습니다!
저는 제가 할당한 aws ec2서버에서 직접 도커를 다운받고, 도커허브에 로그인까지 완료한 후에 실행하였습니다.
Docker Image(이미지)
도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 "Docker Image"라고 합니다.
즉, 이미지는 컨테이너 실행에 필요한 모든 설정값(환경)이나 종속성들을 갖고있는 상태의 파일을 의미합니다.
도커 컨테이너를 만들기 위한 템플릿으로 생각하면 될 것 같습니다.
예를 들면, Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있다고 볼 수 있습니다.
이미지와 레이어(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 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술입니다.
정리하자면,
Dockerfile로 프로그램을 실행하는데 필요한 모든 설정이나 종속성들을 갖고 있는 Docker Image를 만들고(빌드하고),
Docker Image가 여러 개의 Docker Container를 생성한다고 보면 됩니다!
- 이미지와 컨테이너는 각각 관리해주어야 합니다.
- 각 이미지는 컨테이너로 만들어주어야 실행이 가능합니다.
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
추가적인 명령어 옵션은 다음과 같습니다.
docker run -d -p 9999:80 httpd # 호스트의 9999포트로 들어오는 요청을 컨테이너의 80포트로 넘기는 컨테이너를 생성
그리고 이를 크롬 웹브라우저에서 직접 서버주소:9999로 들어가 확인해보겠습니다!
(ec2의 인바운드 규칙에 포트 9999에 대한 설정을 미리 해주어야 합니다)
서버의 9999포트로 요청을 날렸을때 잘 작동되는 것을 확인할 수 있습니다.
개발자도구를 키고 응답 헤더를 확인해봤을때,
Server: Apache/2.4.52를 확인할 수 있습니다.
[참고]