설치 환경을 동일하게 적용하기 위해 환경을 통쨰로 이미지화 한다.
도커파일의 각 커맨드는 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"]
docker build -t vlwkaos/docker-demo-app:1.0 .
을 입력하면 각각 커맨드가 단계적으로 실행된다.
이렇게 빌드된 이미지는 다른 이미지를 만드는데 사용할 수도 있고, container를 실행하는데 이용할 수도 있다.
Container에서 실행하려면 docker image를 [[Container Registry]]가있는 서버에 push해야한다.
로컬에서 하는 방법은 다음과 같다
docker run {{dockerID}}
를 실행하면 된다. 그러나 지정한 포트로 접속해도 접속할 수 없을 것이다. 왜냐, 도커에서만 우리가 지정한 포트를 노출시켰지 로컬 환경에서는 여전히 막혀있기 때문이다.
docker run -p 5000:8080 {{dockerID}}
왼쪽은 로컬 포트이고 오른쪽은 docker 에서 지정한 포트이다. -p
옵션으로 포트포워딩을 하는 것이다. (오른쪽=돌고있는 서비스에 접근하기 위한 포트)
한가지 기억할 점은 이 상태에서 터미널을 종료하더니라도 container는 여전히 실행 중이라는 점이다. container를 직접 종료시켜야한다.
docker ps
docker stop {{id}}
container 끼리 데이터를 공유하고 싶을 수 있다. 이럴 때는 Volume을 이용한다.
docker volume create shared-vol
Volume은 그냥 공용 폴더라고 보면된다. Volume은 파일을 유지시킬 수 있고 각기 다른 Container에서 가져다 쓸 수 있다.
docker run --mount source=shared-vol,target=/folder
Docker GUI를 이용하여 현재 실행중 상태와 여러가지 로그를 볼 수 있다.
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
으로 모두 실행한다.