컨테이너라는 것을 이용해 환경에 제약없이 애플리케이션을 실행하거나 개발할 수 있게 해주는 플랫폼이다.
컨테이너는 애플리케이션을 배포하고 테스트하기 위한 단위로, 애플리케이션을 실행하는데 필요한 것을 가지고 있다.
컨테이너를 사용하면 서비스의 프로덕션 환경(서버 컴퓨터 or 클라우드)에 애플리케이션을 실행하기 위한 추가적인 설치를 하지 않아도 된다.
둘 다 하나의 서비스 프로덕션 환경에서 여러 개의 애플리케이션을 격리된 환경에서 실행하기 위해서 만들어진 것이다.
가상 머신: host OS 위에 guest OS가 올라가는 형태이다. host와는 다른 OS를 사용하여 시스템의 나머지 부분과 격리시킨다.
컨테이너: 따로 guest OS를 올리는 것이 아니라 host OS와 자원을 공유한다. 컨테이너를 host나 다른 컨테이너로부터 격리시킨다. OS를 올리는 게 아니기 때문에 가상 머신을 쓰는 것보다 가볍다.
도커는 컨테이너를 이용해서 격리된 공간에 애플리케이션이 실행될 수 있도록 도와주는 도구이다.
컨테이너를 만드는 방법은?
컨테이너를 만들기 위해서는 이미지라는 것이 필요하다. 이미지란 컨테이너를 실행하기 위해 필요한 파일이나 설정값을 가지고 있는 것이다. 이미지를 만들기 위해서는 Dockerfile이 필요한데, 어떤 OS를 쓸지, 어떤 명령어를 쓸지, 어떤 파일들을 컨테이너 안에 가져갈지를 정의 해주면 된다.
docker build -t <이름/이미지명:버전> <도커 파일 경로>
docker run <도커 이미지 이름>
docker build -t <이름/이미지명:버전> <도커 파일 경로>
docker run <도커 이미지 이름>
: 컨테이너 생성 & 실행docker start <컨테이너 이름>
: 컨테이너 실행(이미 만들어진 컨테이너가 있는 경우)docker exec
: 실행중인 컨테이너에게 명령 날릴 수 있다.docker exec -t <컨테이너ID> bash
: 컨테이너 내부로 들어가고, 명령어를 날릴 수 있다.docker pull
docker rm <컨테이너ID>
docker rmi <이미지ID>
docker logs <container_id>
React
FROM node:12.18.4
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install
COPY . .
CMD [ "npm", "run", "start" ]
FROM
FROM <base image>
COPY
COPY <host 머신의 파일> <컨테이너 내부 경로>
COPY [<host 머신의 파일>, ... , <컨테이너 내부 경로>]
COPY
를 두번하는데, package.json
파일은 자주 바뀌지 않기 때문에 프로젝트 코드를 모두 복사하는 명령과 분리시켜 놓았다. COPY . .
는 다시 실행된다.FROM node:12.18.4
COPY . .
RUN npm install
CMD [ "npm", "run", "start" ]
만약 Dockerfile을 위처럼 설정한다면 소스 코드를 바꿀 때마다 npm install을 한다. (소스코드를 바꾼지 dependency에 패키지가 추가된지 모르기 때문)
RUN
CMD
도커 컨테이너에 copy하지 않을 파일/폴더는 .dockerignore 파일에 추가해주면 된다.
node_modules
.git
.DS_Store
docker build -t <이름/이미지명:버전> <도커 파일 경로>
docker images
를 입력하면 생성된 image들을 볼 수 있다.
docker image rm <image ID>
docker run
docker run -v <host 머신의 파일 경로>:<컨테이너의 파일 경로> -p <host 머신의 포트번호>:<컨테이너의 포트번호> <도커 이미지 이름>
-p
옵션: -p <host 머신의 포트번호>:<컨테이너의 포트번호>
-v
옵션: -v <host 머신의 파일 경로>:<컨테이너의 파일 경로>:ro
-v
옵션을 이용하면 수정된 코드가 자동으로 업데이트 된다.:ro
를 추가해주면 된다.(host 머신에서만 코드를 수정할 수 있음.)-d
옵션: 컨테이너를 생성하여 백그라운드에서 실행할 수 있다.