도커(docker) 개념 및 명령어

hj·2021년 10월 26일
0

도커란?

컨테이너라는 것을 이용해 환경에 제약없이 애플리케이션을 실행하거나 개발할 수 있게 해주는 플랫폼이다.

컨테이너

컨테이너는 애플리케이션을 배포하고 테스트하기 위한 단위로, 애플리케이션을 실행하는데 필요한 것을 가지고 있다.

컨테이너를 사용하면 서비스의 프로덕션 환경(서버 컴퓨터 or 클라우드)에 애플리케이션을 실행하기 위한 추가적인 설치를 하지 않아도 된다.

가상 머신 vs 컨테이너

둘 다 하나의 서비스 프로덕션 환경에서 여러 개의 애플리케이션을 격리된 환경에서 실행하기 위해서 만들어진 것이다.

가상 머신: host OS 위에 guest OS가 올라가는 형태이다. host와는 다른 OS를 사용하여 시스템의 나머지 부분과 격리시킨다.

컨테이너: 따로 guest OS를 올리는 것이 아니라 host OS와 자원을 공유한다. 컨테이너를 host나 다른 컨테이너로부터 격리시킨다. OS를 올리는 게 아니기 때문에 가상 머신을 쓰는 것보다 가볍다.

도커 사용법

도커는 컨테이너를 이용해서 격리된 공간에 애플리케이션이 실행될 수 있도록 도와주는 도구이다.

컨테이너를 만드는 방법은?
컨테이너를 만들기 위해서는 이미지라는 것이 필요하다. 이미지란 컨테이너를 실행하기 위해 필요한 파일이나 설정값을 가지고 있는 것이다. 이미지를 만들기 위해서는 Dockerfile이 필요한데, 어떤 OS를 쓸지, 어떤 명령어를 쓸지, 어떤 파일들을 컨테이너 안에 가져갈지를 정의 해주면 된다.

  1. Dockerfile로 이미지 생성
    docker build -t <이름/이미지명:버전> <도커 파일 경로>
  2. 생성된 이미지로 컨테이너 생성 및 실행
    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

Dockerfile로 docker build

Dockerfile

FROM node:12.18.4

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install

COPY . .

CMD [ "npm", "run", "start" ]

FROM

  • FROM <base image>
  • react 프로젝트이기 때문에 base image로 node 이미지를 사용한다.

COPY

  • COPY <host 머신의 파일> <컨테이너 내부 경로>
  • COPY [<host 머신의 파일>, ... , <컨테이너 내부 경로>]
    여러가지 파일을 복사해야 하는 경우 배열을 사용한다. host 머신에서 컨테이너로 복사해야하는 파일들을 넣어주고 마지막 원소는 컨테이너 내부 경로(host 머신에 있는 파일이 복사될 컨테이너의 내부 경로)를 넣어준다.

    위의 도커파일에서 COPY를 두번하는데, package.json 파일은 자주 바뀌지 않기 때문에 프로젝트 코드를 모두 복사하는 명령과 분리시켜 놓았다.

    도커는 빌드된 이미지가 있으면 결과를 캐싱해둔다. 빌드했을 때 똑같은 내용?이 있다면 캐싱해둔 결과를 사용한다.
    -> package.json 파일이 바뀌지 않으면 npm install도 바뀌는 게 없기 때문에 캐싱되어 있는 결과를 이용해서 도커를 빌드한다. 그리고 소스 코드를 바꾸면 COPY . . 는 다시 실행된다.
FROM node:12.18.4

COPY . .

RUN npm install

CMD [ "npm", "run", "start" ]

만약 Dockerfile을 위처럼 설정한다면 소스 코드를 바꿀 때마다 npm install을 한다. (소스코드를 바꾼지 dependency에 패키지가 추가된지 모르기 때문)

RUN

  • 이미지에 새로운 패키지를 설치하거나 명령어를 실행시킬 때 주로 사용한다.

CMD

  • 이미지가 컨테이너 내부에서 실행될 때 실행할 명령어를 입력한다.

.dockerignore

도커 컨테이너에 copy하지 않을 파일/폴더는 .dockerignore 파일에 추가해주면 된다.

node_modules
.git
.DS_Store

도커 이미지 생성 - build

docker build -t <이름/이미지명:버전> <도커 파일 경로>

docker images를 입력하면 생성된 image들을 볼 수 있다.

  • 이미지 삭제
    docker image rm <image ID>

컨테이너 실행 - docker run

docker run -v <host 머신의 파일 경로>:<컨테이너의 파일 경로> -p <host 머신의 포트번호>:<컨테이너의 포트번호> <도커 이미지 이름>

  • -p 옵션: -p <host 머신의 포트번호>:<컨테이너의 포트번호>
    도커 컨테이너는 host 머신과 완전히 분리된 곳이다. 그렇기 때문에 외부에서 도커 컨테이너에 접근하고 싶을 땐, 컨테이너의 특정 포트를 열어주어야 한다. 컨테이너에서 실행된 애플리케이션을 로컬에서 확인하고 싶을 때 사용할 수 있다.

  • -v 옵션: -v <host 머신의 파일 경로>:<컨테이너의 파일 경로>:ro
    도커 컨테이너에 코드를 올려두고 개발을 진행한다면 코드가 업데이트될 때마다 docker build를 해주어야 변경 사항을 볼 수 있는데, -v 옵션을 이용하면 수정된 코드가 자동으로 업데이트 된다.
    추가 옵션을 주지 않으면 host 머신뿐만 아니라 도커 컨테이너의 내부에서 파일을 생성, 수정, 삭제하면 host 머신의 파일에도 영향을 준다. 만약, 컨테이너에서 파일을 생성, 수정, 삭제하는 것을 막고 싶다면 :ro를 추가해주면 된다.(host 머신에서만 코드를 수정할 수 있음.)
    https://docs.docker.com/develop/dev-best-practices/#differences-in-development-and-production-environments
    https://www.daleseo.com/docker-volumes-bind-mounts/

  • -d 옵션: 컨테이너를 생성하여 백그라운드에서 실행할 수 있다.

reference

0개의 댓글