이미지
Nginx와 직접 개발한 애플리케이션 같은 소프트웨어들은 해당 소프트웨어 하나만 독자적으로는 실행할 수 없다.
먼저, 소프트웨어가 하드웨어의 자원을 사용할 수 있도록 필수 기능을 제공해주는 1. OS가 필요하다.
또한 일반적으로 2. 특정 패키지나 라이브러리의 의존성을 가지고있으며 실행시키기 위해서 3. 런타임 언어를 설치해야한다.
Nginx 웹서버를 컨테이너로 실행 시킬 경우 위와 같이 소프트웨어에 필요한 의존 요소를 설치하는 과정 없이 Nginx라는 이미지 이름만 지정했었다.
어떻게 서버를 구성하는 과정(OS,의존성,런타임) 없이 한번에 Nginx 프로그램을 실행할 수 있었을 까 ?
그 이유는 바로 Nginx 이미지를 통해서 컨테이너를 실행했기 때문이다.
이미지 : 파일시스템에 특정 시점을 저장해 놓은 압축 파일.(마치 게임을 할때 중간 저장을 하듯이)
이미지는 제작 단계에서 부터 소프트웨어 뿐만 아니라 소프트웨어가 실행하기 위해서 필요한 모든 요소들을 준비해서 압축한다.
Nginx 이미지 같은 경우는 Nginx 개발사가 OS위에 Nginx와 의존성 요소들을 미리 준비하고 Nginx를 실행할 준비가 되어 있는 상태 자체를 이미지로 저장한 뒤에 공유한다.
그래서 docker run 명령에 nginx라는 이미지 이름을 입력했을 때 이 이미지를 다운받아서 격리된 공간에 컨테이너가 실행된 것이고, 이 컨테이너를 실행할 때 이미지 안에 있던 nginx 프로그램이 함께 실행된것이다.
이미지는 Window 백업 기능과 유사하다. 컴퓨터에 OS와 프로그램을 설치하고 그 상태를 백업으로 저장해 놓으면 언제든지 해당 프로그램을 실행할 수 있는 시점으로 만들수 있다. 그리고 그 백업 파일을 다른 컴퓨터에 공유 할수도 있다.
가상머신에는 스냅샷이라는 기능을 제공한다.
하지만 컨테이너의 이미지는 백업이나 스냅샷보다 압축 파일의 사이즈가 아주 작다.
그래서 인터넷을 통해서 저장하고 공유하기가 훨씬 수월하다.
이미지는 Nginx 이미지 처럼 다른 사람이 만든 이미지를 다운 받아서 사용할 수도 있다. 또한 직접 이미지를 제작할 수도 있다.
도커와 이미지 정리
도커는 가상환경의 서버를 운영하는 기술이다.
도커를 사용한다는 것은 컨테이너 내에서 웹서버나 웹애플리케이션 같은 소프트웨어를 운영하는 것이 목적이다.
컨테이너는 이미지를 통해서 실행 할 수 있고, 이미지는 특정 소프트웨어를 실행 하기 위해서 OS와 의존요소, 런타임 언어와 같은 소프트웨어가 포함되어 있는 파일 시스템의 상태를 저장해 놓은 압축 파일이다.
이 이미지를 컨테이너로 실행 시키면 호스트 OS 안에서 완전히 격리된 공간인 컨테이너가 만들어 지는것이다.
그리고 이 컨테이너 안에서 소프트웨어가 실행된다. 그리고 이 이미지는 다른 사람이 만든것을 사용할수도 있고 직접 만들어서 사용할수도 있다.
이미지와 컨테이너
프로그램의 경우 CPU나 메모리 같은 컴퓨터 리소스를 사용하지 않고 오로지 스토리지의 디스크 공간만 차지한다.
이런 프로그램을 실행시키면 프로세스가 되며 각 프로세스들은 CPU와 메모리를 사용하며 많이 사용하면 컴퓨터가 느려질 수 있다.
이미지와 컨테이너의 관계도 동일하게 이해하면 좋다.
이미지는 프로그램이 실행되기 위한 환경이 모두 포함되어 있는 파일 시스템이다.
그리고 그 이미지를 실행한것이 컨테이너이다.
이미지는 압축 파일의 형태로 호스트 머신의 특정 경로에 위치한다.
하나의 이미지로 여러 컨테이너를 실행할수 있으며 동일한 이미지에서 실행한 컨테이너는 내부에서 모두 동일한 프로세스로 실행된다.
즉, 이미지를 컨테이너로 실행시키는 것은 이미지에 저장되어 있는 모든 요소들을 격리된 공간으로 만든다음 격리된 공간 안에서 프로그램을 프로세스로 실행시키는 단계를 거치는 것이다.
이미지의 메타데이터
하나의 이미지는 실제로 압축된 파일과 이 파일의 정보가 저장되어 있는 메타 데이터로 구성되어 있다.
메타 데이터에는 이미지의 아이디,이름,사이즈가 있으며 특히 Env와 Cmd를 유심히 봐야한다.
Env는 애플리케이션이 사용하는 환경 설정 값을 의미힌다.
그래서 이 값이 바뀌게 되면 nginx가 다른 방식으로 동작하게 할수 있다.
Cmd는 이미지를 컨테이너로 실행할 때 명령어를 지정할 수 있다.
윈도우에서 클릭으로 실행하는 것처럼 리눅스에서는 일반적으로 명령어를 통해 프로그램을 실행한다.
즉, 이미지를 컨테이너로 실행할 때 CMD에 있는 명령어를 통해서 어떤 프로그램을 실행할지를 메타데이터에서 결정한다.
여기서 지정한 Nginx 이미지의 이미지 압축 파일과 이미지의 메타 데이터를 사용해서 격리된 공간인 컨테이너가 만들어 진다.
그 후 컨테이너에 있는 파일 시스템과 메타데이터는 새롭게 격리되어 있는 공간이다.
이 이미지가 컨테이너로 실행됭때 cmd 필드에 있는 nginx - g demon off 라는 명령어가 실행된다.
그리고 프로세스가 실행되면서 env 필드에 있는 환경 설정 값을 사용하는 것이다.
그리고 이 메타 데이터는 컨테이너를 실행할 때 새로운 값으로 덮어 쓰기 할 수도 있다.
메타 데이터 관련 명령어
docker image inspect 이미지명 # 이미지 세부 정보 조회
docker container inspect 컨테이너명 # 컨테이너의 세부 정보 조회
docker run (컨테이너명) 이미지명 ( 실행명령) # 컨테이너 실행시 메타 데이터의 cmd 덮어쓰기
docker run --env KEY=VALUE 이미지명 # 컨테이너 실행 시 메타데이터의 env 덮어쓰기
컨테이너의 라이프사이클
docker create : 격리된 공간이 생성, 호스트 OS의 CPU메모리 사용 X,디스크 사용 O
run = create + start
restart : 10 초뒤 프로세스를 재시작
pasue : 프로세스 일시 정지, 현재의 상태를 메모리에 저장(CPU는 사용 X),unpause 명령을 사용하면 재시작 가능
stopped : 컨테이너에서 실행중인 프로세스를 완전히 중단, CPU와 메모리 사용 중단, 다시 실행시키면 처음부터 다시 실행
이미지 레지스트리(이미지 저장소)
이미지 레지스트리를 통해서 개인이나 팀이 이미지를 다른 사람과 공유 하거나 필요한 이미지를 다운받을 수 있다.
이미지 공유 : 이미지를 다운로드하고 업로드하는 기능을 제공
이미지 검색 : 필요한 이미지를 검색하고 찾는 기능 제공
이미지 버전 관리 : 이미지의 버전을 특정해서 다운 받을수 있는 기능 제공
보안 : 원하는 사용자만 이미지를 다운 받을수 있게 인증 처리과 권한 기능 제공
파이프라인 : DevOps 파이프 라인 기능과 연계해서 이미지를 업로드 했을 때 자동으로 배포가 이루어 질수 있도록 연계 기능이나 알림 기능도 제공한다.
이미지가 저장되는 3가지
1. docker run nginx라는 명령어가 입력 되면 먼저 로컬 스토리지에 해당 이미지가 있는지 검색한다.
(로컬 스토리지 : 도커를 실행하는 호스트 OS의 특정 폴더를 의미)
2. 로컬 스토리지에 이미지가 있으면 바로 실행이 되며 없으면 온라인 레지스트리에서 로컬 스토리지로 이미지를 다운 받는다.
3. 이후 부터는 이미 다운로드 받은 이미지가 있기에 1번과 같이 온라인 레지스트리를 검색하지 않고 바로 컨테이너로 실행된다.
이미지 네이밍 룰
이미지 이름은 크게
1. 레지스트리주소 - 어떤 레지스트리를 사용하지(docker.io가 기본값)
2. 프로젝트명 - 이미지를 보관하는 폴더 (Docker hub의 경우 가입한 사용자의 계정명)
3. 이미지명 - 다운로드 받을 이미지의 이름
4. 이미지 태그
로 구성된다.
왼쪽과 같이 도커는 도커사가 직접 검증한 이미지는 오피셜 이미지로 제공하고 있다.
이런 오피셜 이미지는 libary라는 프로젝트에서 관리하고 있어 별도로 계정명을 입력 하지 않으면 libary가 기본 값으로 적용된다.
오른쪽은 도커사가 검증은 하지 않았지만 꽤나 큰 규모의 회사가 자체적으로 생성한 이미지로 신뢰가 높다.
이미지 레지스트리 실습
docker pull 이미지명 # 로컬 스토리지로 이미지 다운로드
docker tag 기존 이미지명 추가할이미지명 # 로컬스토리지의 이미지명 추가
docker push 이미지명 # 이미지 레지스트리에 이미지 업로드
docker login # 이미지 레지스트리 인증 정보 생성
docker logout # 이미지 레지스트리 인증 정보 삭제
docker image rm 이미지명 # 로컬 스토리지의 이미지 삭제
'SOPT 34기 서버파트 > Docker 스터디' 카테고리의 다른 글
[Docker] 가상 네트워크 (0) | 2024.05.07 |
---|---|
[Docker] 컨테이너 애플리케이션 구성 (0) | 2024.05.04 |
[Docker] 이미지 빌드와 Dockerfile (1) | 2024.04.28 |
[Docker] 이미지 레이어구조와 커밋 (1) | 2024.04.28 |
[Docker]가상화 기술[하이퍼바이저,컨테이너] (0) | 2024.04.07 |