vlwkaos' digital garden

Docker

설치 환경을 동일하게 적용하기 위해 환경을 통쨰로 이미지화 한다.

Dockerfile

도커파일의 각 커맨드는 Layer다. 각 Layer는 캐싱되어 변경점이 없을 때 실행되지 않는다.

예를 들어 노드 프로젝트의 경우 보통 소스코드를 받고 의존성 모듈을 설치하지만, 도커 커맨드 단계가 캐싱된다는 사실을 이용하려면 의존성 모듈 설치를 먼저해야한다.

# 설치 환경
FROM node:12

# 사용할 경로
WORKDIR /app

# 복사
COPY package*.json ./

# 의존성 설치
RUN npm install

# 소스코드 내용 복사 /node_modules는 .dockerignore에 추가하여 복사되지 않도록 한다.
COPY . .

# 환경 변수 설정
ENV PORT=8080

# 노출시킬 포트
EXPOSE 8080

# 서비스 시작용 커맨드
CMD ["npm", "start"]

Image

docker build -t vlwkaos/docker-demo-app:1.0 . 을 입력하면 각각 커맨드가 단계적으로 실행된다.

이렇게 빌드된 이미지는 다른 이미지를 만드는데 사용할 수도 있고, container를 실행하는데 이용할 수도 있다.

Container에서 실행하려면 docker image를 [[Container Registry]]가있는 서버에 push해야한다.

로컬에서 하는 방법은 다음과 같다

Container

docker run {{dockerID}}

를 실행하면 된다. 그러나 지정한 포트로 접속해도 접속할 수 없을 것이다. 왜냐, 도커에서만 우리가 지정한 포트를 노출시켰지 로컬 환경에서는 여전히 막혀있기 때문이다.

docker run -p 5000:8080 {{dockerID}} 왼쪽은 로컬 포트이고 오른쪽은 docker 에서 지정한 포트이다. -p 옵션으로 포트포워딩을 하는 것이다. (오른쪽=돌고있는 서비스에 접근하기 위한 포트)

한가지 기억할 점은 이 상태에서 터미널을 종료하더니라도 container는 여전히 실행 중이라는 점이다. container를 직접 종료시켜야한다.

docker ps
docker stop {{id}}

container 끼리 데이터를 공유하고 싶을 수 있다. 이럴 때는 Volume을 이용한다.

Volume

docker volume create shared-vol

Volume은 그냥 공용 폴더라고 보면된다. Volume은 파일을 유지시킬 수 있고 각기 다른 Container에서 가져다 쓸 수 있다.

docker run --mount source=shared-vol,target=/folder

Debugging

Docker GUI를 이용하여 현재 실행중 상태와 여러가지 로그를 볼 수 있다.

  • 1 process per container

Docker Compose

docker-compose.yml 파일을 만든다.

version:'1'
services:
  web:
    build: .
    ports:
      - "8080:8080"
  db:
    image: "mysql"
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db-data:/foo
      
volumes:
  db-data

이런식으로 여러 서비스 형태에 따라 한번에 지정하면 커맨드를 이용하는 것보다 훨씬 편리하다.

docker-compose up 으로 모두 실행한다.

Docker