이미지 & 컨테이너

Linda·2023년 4월 21일
0

Docker

목록 보기
2/6

컨테이너에는 소프트웨어 실행유닛이 존재한다.

도커로 작업할 때 이미지라는 디졸버 개념이 필요하다.
이미지는 실제로 '코드'와 '코드를 실행하는데 필요한 도구'를 포함한다.
그 다음 컨테이너가 실행되어 코드가 실행된다.
이미지를 사용해서 여러 컨테이너 만들수있다.
이미지 - 모든설정명령과 코드가 포함된 공유가능한 패키지
컨테이너 - 이미지의 구체적인 실행 인스턴스

즉, 이미지를 기반으로 하는 컨테이너를 실행한다. - 이것이 도커의 핵심기능이다.

이미지와 컨테이너가 따로 있기 때문에 여러 컨테이너가 서로 간섭하지 않고 동일한 이미지를 기반으로 할 수 있다.
여러 컨테이너가 동일한 이미지 기반으로 할 수 있지만 서로 완전히 격리되어있다.

컨테이너를 실행할 수 있도록 이미지 생성하고 가져오는 방법

이미존재하는 이미지 활용하는 방법
https://hub.docker.com/ 접속 - node 검색
cmd 열어서 docker run node
검색하면 docker hub에서 찾은 이미지 기반으로 하는 컨테이너가 생성된다.
컨테이너 - 실제로 실행중인 이미지 인스턴스
이미지에는 환경설정 코드가 포함되어있다.
docker run node 검색 시 처음에는 이미지 없다는 오류가 뜨는데 그 이유는 이미지가 docker hub에 있기때문이고, 없으면 알아서 docker hub 에서 찾아온다.
컨테이너 자체는 실제로 많은 일을 하진 않는다 .

docker ps -a
모든 컨테이너 ,프로세스가 결과로 나온다.
docker run -it node
도커에서 컨테이너 내부에서 호스팅 머신으로 대화형세션을 노출하고싶다고 알리는것 - 실행하면 실제 기본 노드 명령을 실행할 수 있는 인터렉티브 노드 터미널에 들어가진다.
더이상 실행되지 않아도 docker run을 반복하면 동일한 이미지 기반으로 하는 두개의 컨테이너가 동시에 실행할 수 있는걸 볼 수 있다.

node js 앱 실전

npm install
node server.js 으로 시작

'Dockerfile' 이라는 명칭으로 file 만들면 도커에의해 자동 식별된다.

FROM node 
# FROM - 어디서 이미지 가져올 건지

COPY . .
# 첫번째 . = 컨테이너 외부, 이미지 외부경로
# 두번째 . = 이미지로 복사되어야할 파일이 있는 곳
# 첫번째 . 을 넣으면 기본적으로 도커파일이 포함된 동일한 파일임을 알린다 (도커파일은 제외하고)
# 두번째 . 프로젝트의 모든 폴더, 하위폴더 및 파일을 복사해야된다고 알림

# copy 되기전에 모든 실행이 /app 안에서 일어나야한다고 알리는것
WORKDIR /app

COPY package.json /app

COPY . /app

RUN npm install

# 우리 로컬시스템에 특정포트를 노출하고 싶다는것을 도커에 알리는명령
EXPOSE 80

# run 명령어와 다른이유 - 이미지 생성될 때 실행되지 않고 이미지기반 컨테이너가실행될 때 실행된다
# 컨테이너 실행 된 후 노드서버 실행하고자 할 때 사용
CMD ["node", "server.js"]
docker build .

새커스텀이미지 빌드하도록 도커에게 지시하는 명령어 + 도커에게 도커파일 찾을수있도록알려주는위치
( . 는 전체를 의미)

run 명령어가 노드서버를 시작하기 때문에 이미지 아이디 찾은 후 docker run 이미지아이디 하면 계속 실행되는것을 확인 가능하다.

종료 - 새터미널 -

docker ps 현재 진행중인 프로세스 표시됨
docker ps -a 모든 프로세스 표시됨
위 명령어로 확인 후 docker stop 컨테이너이름

docker run 명령어 시 이미지앞에 -p를 넣어줘야하는데 여기서 p는 publish 라는뜻이다.
docker run -p 이미지아이디 이를 통해 도커에게 어떤 로컬 포트가 있는지 알려 줄 수 있다.
docker run -p 3000:3000
-p 다음 3000은 어플리케이션에 엑세스하려는 로컬포트 지정하는 것, : 뒤에는 내부도커컨테이너 노출포트 넣는다.

종료 후 다시 docker build 해도 using cache 라는 메세지가 뜬다. docker가 명령어 수행했을 때 결과가 이전과 동일하다는 것을 인식함.
-이미지는 readonly 명령이 실행되고 이미지 빌드되면 이미지가 잠기고, 다시 빌드하지않는한 코드변경 불가하다.
(기술적으로 새 이미지 생성한다는 의미)

도커는?
코드에한모든것.
어플리케이션, 애플리케이션을 구성하는 코드를 이미지라 불리는 곳에 집어넣고 그 코드를 실행하는데 필요한 도구인 실행환경도 넣는다.
Dockerfile을 통해 생성가능하다.
도커는 이미지가 아니라 컨테이너에 관한것 하지만, 이미지 또한 중요함.
이미지에 기반한 여러 컨테이너 실행 가능

이미지는?
우리가 작성한 코드 등이 포함된 것
읽기/쓰기 권한이 있는 인스턴스를 실행하는 컨테이너의 블루프린트.
컨테이너를 기반으로 앱을 시작하는데 사용할 수 있는 코드와 도구로 가득찬 패키지.
이미지의 모든 명령은 캐시가능한 레이어를 생성하고 이미지재구축 및 공유를 돕는다.

컨테이너는?
이미지를 기반으로 하는 격리된 소프트웨어유닛
이미지의 실행중인 인스턴스
이미지 위에 추가된 얇은 레이어일뿐 , 하지만 여전히 컨테이너는 이미지 기반으로 하는 실행 어플리케이션이지만 실행되면 다른 컨테이션과 독립적이다. 컨테이너가 이미지에서 이미지나 환경을 복사하진 않는다. 컨테이너는 이미지에 저장된 환경을 사용할뿐이다.

0개의 댓글