2019.04.22 - Dockerfile 알아보기, Docker volume 개론

Node 로 만들어진 웹 앱이 하나 있는데 이걸 다른 거 필요없이 그냥 도커 파일을 이용해 이미지를 빌드하고 컨테이너를 실행해서 그 위에서 돌려버리는 경험을 했다.

실로 어메이징하다.

만약 내 피씨에서 실행하려고 했으면 일단 노드부터 깔고, 환경변수 잡아주고, 포트 설정등등 귀찮았을텐데 갓커는 그냥 도커파일 이용해서 빌드해 하고 던져주니까 알아서 잘 돌려버린다.

도커파일을 한 번 뜯어보자

------- dockerfile --------

FROM node:6-alpine # 실행할 이미지

EXPOSE 3000 # container의 3000번 포트를 사용 준비상태로 둔다. (지금 당장 3000포트로 뭐 받는게 아니라 호스트에서 전달받으면 이 포트로 받겠다는 의미)

RUN apk add --update tini # container에서 실행할 명령어

RUN mkdir -p /usr/src/app # 마찬가지로 container에서 실행할 명령어

WORKDIR /usr/src/app # Working direcotory는 이 곳

COPY package.json package.json # 호스트 현재 디렉토리의 package.json을 container의 워킹디렉토리로복사한다.

RUN npm install && npm cache clean # npm을 설치하고 캐싱된 것들을 지운다

COPY . . # 호스트의 현재 디렉토리에 있는 것을 container의 워킹 디렉토리로 복붙한다.

CMD ["/sbin/tini", "--", "node", "./bin/www"] --> ' '.join(list)로 결합 된 string을 커맨드라인에서 실행한다.

-----end of dockerfile-----

dockerfile을 이용한 빌드 명령어 : docker build [-t TAGNAME] [DIRECTORY(relative)]
ex ) docker build -t testImage .


CONTAINER

docker image inspect IMAGE_NAME
도커이미지가 사용하는 볼륨(스토리지)의 루트를 볼 수 있다. MySQL 기준 /var/lib/mysql 이다.

어떤 이미지는 볼륨과 연결 되어서 사용된다. 대표적으로 DB가 그렇다. 컨테이너는 (일단 지금 단계에선) 1회용품 같다고 생각하면 좋다. 실행하면 변형은 잘 안 되고 새로운 앱이 나오면 새 컨테이너로 배포하면 된다.

DB 컨테이너를 실행하고 docker container inspect IMAGE < 를 하면 상단에 Mounted를 볼 수 있다. Source는 실제로 데이터 소스를 가져오는 경로이고 Destination은 컨테이너가 해당 데이터가 존재한다고 믿는 곳이다. 그래서 Source에서 가져와서 Destination을 가져온다.

어떤 볼륨이 있는지는 docker volume ls 명령어로 확인할 수 있고 inspect도 가능하다.
docker volume inspect IMAGE_ID

하지만 자동으로 만들어지는 docker volume은 이름이 알아보기 어려운 문자조합으로 되어있기 때문에 이를 보완하기 위해 named volume이라는 옵션을 사용할 수 있다.

docker container를 run할 때 -v(volume) 옵션을 주면 새로운 볼륨을 쓸 지 기존의 볼륨을 쓸 지 정할 수 있다.

docker container run -d --name mysql -e(environment라는 뜻) MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql

docker container run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql


댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용