docker tutorial
docker run (컨테이너 생성)
-d- 백그라운드 실행-p- host의 80포트를 컨테이너의 80포트에 매핑docker run -d -p 80:80 dockersamples/101-tutorial // same docker run -dp 80:80 dockersamples/101-tutorial
컨테이너란?
- 호스트 컴퓨터의 모든 프로세스와 격리된 또 다른 프로세스
- 도커는 리눅스에 원래 있는 기능을 사용하기 쉽게 만든 개념이다
컨테이너 이미지란?
- 컨테이너에서 사용되는 파일시스템과 모든 환경설정값 등을 가지고 있고 변하지 않는다.
- 컨테이너란 컨테이너 이미지를 실행한 상태라고 볼 수 있다.
이미지 생성
- 아래는
node:10-alpine이미지로 부터 새로운docker-101이미지를 만든다는걸 의미한다.
docker build -t docker-101 .
// Dockerfile
FROM node:10-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]
- docker-101 이미지를 3000번 포트로 실행
docker run -dp 3000:3000 docker-101
앱 업데이트
-
아래처럼 컨테이너 삭제 후 다시 컨테이너를 실행하면 업데이트된 앱을 볼 수 있다.
-
도커 컨테이너 리스트 보기
docker psdocker ps -a -
컨테이너 중지시키기
docker stop <the-container-id> -
컨테이너 제거
docker rm <the-container-id> -
컨테이너 이미지 제거
docker rmi <imagename> -
컨테이너 실행
도커 이미지 공유
리포 만들기
- 이미지를 푸시하려면 도커 허브에 리포지토리를 만들어야 한다.
- create repository를 클릭
- 페이지에서 push 커멘드 명령어를 가이드 해줌
이미지 푸시
-
도커 이미지 리스트 확인
docker image ls -
태그 생성
docker tag <이미지이름> <새로운 이미지 이름> -
푸시
docker push <새로운 이미지 이름> // docker push superlucky84/101-todo-app -
저장소에 올린 이미지를 가져와서 컨테이너 실행
docker run -dp 3000:3000 superlucky84/101-todo-app
DB 상태 유지하기
컨테이너의 파일시스템
- 컨테이너의 파일시스템은 이미지의 레이어 계층을 사용하여 생성되며, 같은 이미지부터 생성된 컨테이너들은 각각의 스크래치 공간을 사용하여 독립적으로 표시된다.
컨테이너 볼륨
- 컨테이너의 파일시스템의 특정 경로를 호스트pc에 연결해주는 기능이다.
- 볼륨기능은 일반적으로(실제로는 플러그인을 통해 더 많은 형태의 볼륨형태를 사용할수 있다고 함) 두가지 형태로 사용할 수 있다 (명령된볼륨, 바인드 마운트).
- 볼륨 만들기
docker volume create todo-db
- 생성한 볼륨을 지정하여 컨테이너 실행
docker run -dp 3000:3000 -v todo-db:/etc/todos docker-101
- 컨테이너 삭제 후, 위 명령어로 볼륨을 지정하여 다시 실행하면 파일이 유지되며 실행됨
볼륨에 뛰어들기
- 아래 명령어를 통해 볼륨의 실제 저장 위치 정보를 확인할수 있다.
docker volume inspect todo-db
바인드 마운트 사용하기(네임드 볼륨이 아닌…)
- 바인드마인트를 사용하면 호스트의 정확한 마운트 지점을 제어할 수 있다.
- 변경사항을 호스트에서 바로바로 확인할 수 있는 장점이 있다.
개발모드로 컨테이너 실행하기
- 아래처럼 바인드 마운트를 하면 개발환경을 세팅하지 않고도 도커 이미지를 활용해서 코드만 수정하여 실행할수 있다.
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "yarn install && yarn run dev"
멀티 컨테이너 사용하기
네트워크에 컨테이너를 연결
- 시작할 때 할당하거나 기존 컨테이너를 연결한다
- 네트워크 생성
docker network create todo-app
- mysql 컨테이너를 생성하고 네트워크에 연결
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
- mysql 이미지에 들어가보기
docker exec -it <mysql-container-id> mysql -p
nicolaka/netshoot(네트워킹 문제를 해결하는데 유용한 이미지라고 함) 이미지를 사용하여 todo-app 네트워크에 연결
docker run -it --network todo-app nicolaka/netshoot
- 생성한 네트워크로 dev앱 실행
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
- dev앱 컴테이너에 로그 확인
docker logs <container-id>
// ...
// Connected to mysql db at host mysql
도커 컴포즈
- 도커 컴포즈는 다중 컨테이너 어플리케이션을 정의하고 공유하도록 개발되었다
- YAML파일을 생성하여 서비스를 정의하고 단일 명령으로 관리 가능
- 파일에 어플리케이 스택을 정리하여 버전관리할 수 있는 장점이 있다
도커 컴포즈 설치
- 맥용 toolbox를 설치 했더면 이미 컴포즈도 설치되어 있으며, linux에서 설치하려면 가이드가 따로 있다.
- 도커 컴포즈 버전 설치 버전 확인
docker-compose version
컴포즈 파일생성
docker-compose.yml파일 생성- 스키마 버전을 선택하여야 하며 버전은 링크 에서 확인 가능하다(항상 최신 버전을 사용하는게 좋다).
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:
컴포즈에 정의한 어플리케이션 스택을 실행
-
따로 스택에 정의하지 않아도 컴포즈는 기본적으로 네트워크를 자동으로 생성한다
docker-compose up -d -
로그확인
docker-compose logs -f
빌드 캐싱
-
이미지 레이어 히스토리
docker image history --no-trunc getting-started -
Dockerfile의 종속성 캐싱
- 도커파일의 정의된 라인마다 이미지 레이어가 생기며, 변경되지 않은 동일한 라인은 이미지가 캐싱되어 리빌드시 활용된다.
- node_module은 package.json 이나 yarn.lock이 변경되지 않고 yarn install부분까지변경된 부분이 없다면 리빌드시 캐싱을 이용해 처리되므로 node_modules 이 캐시되는 효과를 줄 수 있다.
- original
// Dockerfile FROM node:10-alpine WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "/app/src/index.js"] - change
// Dockerfile FROM node:12-alpine WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install --production COPY . . CMD ["node", "src/index.js"] - .dockerignore 파일생성
node_modules
- original
다단계 빌드
- 빌드 이미지 크기 감소와 종속성 캐싱의 효과의 장점이 있다
- 빌드 단계에만 필요한 빌드도구가 프러덕션에스는 필요 없을경우. 빌드를 위한 부분만 분리하여 다단계 빌드를 할 수 있다.
- 리액트 프로젝트 예: (node:12 는 이미지 레이어에 포함되지 않고 빌드에만 사용된다.)
FROM node:12 AS build WORKDIR /app COPY package* yarn.lock ./ RUN yarn install COPY public ./public COPY src ./src RUN yarn run build FROM nginx:alpine COPY --from=build /app/build /usr/share/nginx/html
컨테이너 오케스트레이션 도구
- 모니터링, 로깅, 보안, 확장등과 관련된 실제 프로덕션 모드에서 더커를 실행할때 도움이 되는 많은 프로젝트가 있다.(예를 들면 쿠버네티스)
파일로 저장
docker save -o aa.tar dockerimage