이미지와 컨테이너
도커 이미지는 docker run {실행할 거} 를 통해 pull을 할수 있고 이미지가 없을경우 docker hub에서 다운을 받아온다
이미지 자체는 해당 디렉토리에 존재하지 않고, 따로 Docker에서 관리하는 디렉토리에 저장된다.
그리고 컨테이너는 해당 이미지를 통해 여러개의 컨테이너를 동시에 만들수도 있다. (독립적인 환경 구축)
title: Dockerfile
```Dockerfile
FROM node
WORKDIR /app
COPY . /app
RUN npm install
EXPOSE 80
CMD [ "node", "server.js" ]
```
말 그대로 Dockerfile에 들어가는 기본적인 내용들이다
Dockerfile은 이미지를 통해 컨테이너를 어떻게 만들지 결정해주는 설정파일이다.
RUN node server.js 가 아니라
CMD ["node", "server.js"] 인 이유는
RUN 명령어는 해당 컨테이너 템플릿이 컨테이너를 만드는과정에서 실행하는 느낌이고 그건 우리가 원하는 결과가 아니다
(RUN: 이미지를 빌드하는 과정에서 필요한 실행을 담당)
우린 만들어진 컨테이너 환경에서 해당 명령어를 실행하고 싶은것이기 때문에 CMD를 사용하여 설정을 해준다고 한다
(CMD: 컨테이너 실행시 필요한 실행을 담당)명령어를 통해 컨테이너를 build할때는
docker build.을 통해 Dockerfile대로 이미지를 빌드를 하고
docker run -p 3000:80 <해시값> 이런식으로 컨테이너를 실행시킬수 있는데 여기서 3000은 외부 포트, 80은 내부에 EXPOSE해둔 포트이다
Docker는 정책상 엄격하게 외부와 내부가 분리되어있기 때문에 위와같은 방법으로 포트를 맞추어 줘야 접근 가능하다.
그리고 ctrl c를 누른다고해서 Docker 프로세스가 종료되지 않는다
따라서 docker ps 명령어를 통해 실행중인 프로세스 이름을 확인하고 docker stop <이름> 으로 프로세스를 멈춰줘야한다.
title: 스냅샷
그리고 간단하게 docker에 대해 설명하면 그냥 해당 파일에 대한 스냅샷을 docker에서 관리하는 파일로 가지고 있는것이다
위의 예시로 들면 /app에 해당 디렉토리를 전부 복사하게 둔거과 같다
그래서 만약 소스파일에 변화가 생긴다면 해당 변화는 docker의 /app 디렉토리의 변화로 이어지지 않는다
따라서 docker의 파일또한 바꾸어줘야한다
이러한 이유로 **이미지는 읽기 전용**이라고 한다 (수정불가능)
**-> 다시 빌드해야한다 (새로운 이미지 생성하여 컨테이너생성)**title: 나름의 최적화?
```Dockerfile
FROM node
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 80
CMD [ "node", "server.js" ]
```
도커는 변화가 있는 파일까진 심도있게 분석을하지만
**변화가 생긴 명령어 이후의 명령어들은 전부 재실행**시킨다
따라서 npm install 과같은 종속성 관련 명령어는 다시 실행 시킬 필요가 없으므로 **변화가 생길수 있는 `COPY . /app` 과 같은 명령어보다 먼저 실행되게 순서를 바꾸어주는식으로 최적화**시킬수 있다도커는 웹서버에만 쓰이는 게 아니다
그냥 일반적인 가상머신처럼 일반적인 코드 실행에서도 쓰이고 그냥 모든 방면에서 활용가능
docker run 을 할경우 보통 출력되는 터미널만 남는데 이것을 -i 옵션으로 interactive하게 바꿔줄수 있고 -t 를 사용하면 이를 터미널에서 이루어지게 해준다
자세하겐 잘 모르겠지만 그냥 -it 옵션을 사용하여 입력가능한 컨테이너 CLI를 생성한다고 생각하면 편함
docker start <이름> 은 디폴트로 detached 된 상태로 터미널과 컨테이너의 연결이 분리되어있는데 이 경우 -a로 attached 상태로 컨테이너와 터미널을 연결할수 있고 -i 옵션으로 입력가능하게 만들수 있다
docker start -ai <이름> 으로 입력가능한 컨테이너를 실행할수 있다.
