도커 듀토리얼

study, share · 2022-10-17

← 리스트로

docker tutorial

https://www.docker.com/101-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 ps
    
  • 컨테이너 중지시키기

    docker stop <the-container-id>
    
  • 컨테이너 제거

    docker rm <the-container-id>
    
  • 컨테이너 실행

도커 이미지 공유

리포 만들기

  • 이미지를 푸시하려면 도커 허브에 리포지토리를 만들어야 한다.
    • 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에 연결해주는 기능이다.
  • 볼륨기능은 일반적으로(실제로는 플러그인을 통해 더 많은 형태의 볼륨형태를 사용할수 있다고 함) 두가지 형태로 사용할 수 있다 (명령된볼륨, 바인드 마운트).
  1. 볼륨 만들기
docker volume create todo-db
  1. 생성한 볼륨을 지정하여 컨테이너 실행
docker run -dp 3000:3000 -v todo-db:/etc/todos docker-101
  1. 컨테이너 삭제 후, 위 명령어로 볼륨을 지정하여 다시 실행하면 파일이 유지되며 실행됨

볼륨에 뛰어들기

  • 아래 명령어를 통해 볼륨의 실제 저장 위치 정보를 확인할수 있다.
    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"

멀티 컨테이너 사용하기

네트워크에 컨테이너를 연결

  • 시작할 때 할당하거나 기존 컨테이너를 연결한다
  1. 네트워크 생성
docker network create todo-app
  1. 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
  1. mysql 이미지에 들어가보기
docker exec -it <mysql-container-id> mysql -p
  1. nicolaka/netshoot(네트워킹 문제를 해결하는데 유용한 이미지라고 함) 이미지를 사용하여 todo-app 네트워크에 연결
docker run -it --network todo-app nicolaka/netshoot
  1. 생성한 네트워크로 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"
  1. dev앱 컴테이너에 로그 확인
docker logs <container-id>

// ...
// Connected to mysql db at host mysql

도커 컴포즈

  • 도커 컴포즈는 다중 컨테이너 어플리케이션을 정의하고 공유하도록 개발되었다
  • YAML파일을 생성하여 서비스를 정의하고 단일 명령으로 관리 가능
  • 파일에 어플리케이 스택을 정리하여 버전관리할 수 있는 장점이 있다

도커 컴포즈 설치

  • 맥용 toolbox를 설치 했더면 이미 컴포즈도 설치되어 있으며, linux에서 설치하려면 가이드가 따로 있다.
  • 도커 컴포즈 버전 설치 버전 확인
    docker-compose version
    

컴포즈 파일생성

  • docker-compose.yml 파일 생성
    1. 스키마 버전을 선택하여야 하며 버전은 링크 에서 확인 가능하다(항상 최신 버전을 사용하는게 좋다).
    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
        

다단계 빌드

  • 빌드 이미지 크기 감소와 종속성 캐싱의 효과의 장점이 있다
  • 빌드 단계에만 필요한 빌드도구가 프러덕션에스는 필요 없을경우. 빌드를 위한 부분만 분리하여 다단계 빌드를 할 수 있다.
  • 리액트 프로젝트 예: (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
    

컨테이너 오케스트레이션 도구

  • 모니터링, 로깅, 보안, 확장등과 관련된 실제 프로덕션 모드에서 더커를 실행할때 도움이 되는 많은 프로젝트가 있다.(예를 들면 쿠버네티스)