2. Docker의 이해

ㅇ 실습 사전 준비
  • KT Cloud Server 메뉴에 접속하여 Central-B Zone에 VM을 1개 미리 생성합니다.
    • 이름/hostname: docker-tutorial
    • OS: Ubuntu 16.04 version
    • 사양: 2vCore 4GB
    • Zone: Central-A
  • Server > Server 네트워킹 > 위치 Central-B 선택 후 돋보기 클릭 > 해당 공인 IP 클릭 > 포트포워딩 탭 들어가서 4개 항목 추가
    • (서버 'docker-tutorial' 선택, 공용 포트 10001, 사설 포트 22) 선택 후 추가하기 버튼 클릭
    • (서버 'docker-tutorial' 선택, 공용 포트 10002, 사설 포트 4567) 선택 후 추가하기 버튼 클릭
    • (서버 'docker-tutorial' 선택, 공용 포트 10003, 사설 포트 8080) 선택 후 추가하기 버튼 클릭
    • (서버 'docker-tutorial' 선택, 공용 포트 10004, 사설 포트 8888) 선택 후 추가하기 버튼 클릭
    • (서버 'docker-tutorial' 선택, 공용 포트 10005, 사설 포트 8000) 선택 후 추가하기 버튼 클릭
  • Docker Hub 계정 생성
    • cloud.docker.com 회원가입
  • Docker, Docker-compose 설치
    • ssh root@{Central-B 공인 IP} -p 10001
    • vim docker-install.sh
    • #!/bin/bash
      
      rm /var/lib/dpkg/lock
      sudo dpkg --configure -a
      
      # 아래 참고 링크에 있는 내용 참고해서 복붙
      sh docker-install.sh
    • # docker 정상 설치되었는지 확인
      docker version
    • <참고> https://gist.github.com/amitavroy/91d0dd84c3df2522286e3339ab14d7d1

2.1 Docker 설명

ㅇ 컨테이너 정의
  • 격리된 공간에서 프로세스가 동작하는 기술
ㅇ 도커의 정의
  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 도커는 LXC(Linux Container) 기반으로 시작하여 0.9 version에서는 자체 libcontainer 기술을 사용하였고, 추후 runC기술에 합쳐졌다.
ㅇ VM vs Container



  • Hypervisor 기반 가상화
    • 기존의 가상화 방식은 주로 OS를 가상화하였다.
    • VMware나 VirtualBox 같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다.
    • 이와 같이 추가적인 OS를 설치하여 가상화하는 방법은 overhead가 발생하였고, 이를 개선하기 위해 프로세스 격리하는 방식이 등장했다.
  • Container 기반 가상화
    • 단순 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다.

    • CPU, Memory는 프로세스가 필요한만큼만 사용하므로 성능상의 이슈는 거의 없다.

    • 컨테이너를 사용하다 보면 가벼운 VM의 느낌을 준다.

ㅇ 도커의 구조


  • Docker는 Client와 Server (Docker Host) 구조
    • Client : user가 'docker run' 등의 명령어를 입력하면 이를 Server쪽에 전송하고, 이를 Docker daemon이 수행한다.
    • Docker daemon : docker api 요청을 수신하고 image, container, network, volume과 같은 docker object를 관리한다. 다른 docker daemon과의 통신을 통해 서비스를 관리할 수 있다.
    • Docker Registry : Docker 이미지 저장소이다.
    • Image : 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있다. (Immutable) 공식 이미지의 경우 해당 이미지를 실행하기 위한 모든 것이 세팅되어 있다.





ㅇ 도커의 특징




  • 레이어 저장방식
    • 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 크다. 처음 이미지를 다운받을 때는 크게 부담이 되지 않지만, 기존 이미지에 파일 하나 추가했다고 다시 해당 용량이 큰 파일을 다시 받는건 비효율적이다.
    • 도커는 이런 문제를 해결하기 위해서 Layer라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다

    • 컨테이너 생성할 때도 레이어 방식을 사용하여 기존의 이미지 레이어 위에 읽기/쓰기(read-write) 레이어를 추가한다.

  • Dockerfile
    • 도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-specific language) 언어를 이용하여 이미지 생성 과정을 적는다.

    • Application 실행에 필요한 과정들을 Dockerfile로 작성하여 관리할 수 있으며, 해당 Dockerfile을 보면서 이미지 생성과정을 알 수 있으므로 수정하기도 용이하다.

  • Docker Hub
    • Docker hub를 통해 공개 이미지를 무료로 관리해줍니다. 공식 이미지를 직접 관리해주며, namespace가 없다.


2.2 Docker 실습

ㅇ 실습 내용
  • 컨테이너 실행하기
  • 컨테이너 목록 확인하기
  • 컨테이너 중지하기
  • 컨테이너 제거하기
  • 컨테이너 로그보기
  • 이미지 목록 확인하기
  • 이미지 다운로드하기
  • 이미지 삭제하기
  • 네트워크 만들기
  • Dockerfile 작성하기
  • 이미지 생성 & 도커 허브에 푸쉬하기
  • Docker Compose

ㅇ 컨테이너 실행하기



  • # run명령어는 사용할 이미지가 있는 지 확인하고 없다면 다운로드(pull)를 받고
    # 컨테이너를 생성(create)하고 시작(start)합니다.
    
    $ docker run ubuntu:16.04
    $ docker run --rm -it ubuntu:16.04 /bin/bash
    
    
    # [WEB APPLICATION]
    $ docker run -d -p 4567:4567 brenden0730/kt-workshop:latest
    
    
    # [MySQL]
    $ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true  --name mysql  mysql:5.7
    
    
  • exec
    •  exec명령어는 run 명령어와 달리 실행 중인 도커 컨테이너로 접속할 때 사용합니다. 
    • $docker exec -it mysql mysql
      
      create database wp CHARACTER SET utf8;
      grant all privileges on wp.* to wp@'%' identified by 'wp';
      flush privileges;
      show databases;
      
      quit
  • #[Wordpress]
    $ docker run -d -p 8080:80  -e WORDPRESS_DB_HOST=172.17.0.1:3306 -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress
    
    
    
    #[Tensorflow]
    $ docker run -it -p 8888:8888 tensorflow/tensorflow
    
    # Ctrl + D로 종료

ㅇ 컨테이너 목록 확인하기
  •  ps
    • # 컨테이너 목록 확인하기 위한 명령어
      
      $ docker ps
      
      # 중지된 컨테이너도 확인하려면 -a 옵션을 붙인다.
      
      $ docker ps -a

ㅇ 컨테이너 중지하기
  • stop
  • docker stop [OPTIONS] CONTAINER [CONTAINER...]         
ㅇ 컨테이너 제거하기
  • rm
  • docker rm [OPTIONS] CONTAINER [CONTAINER...]     
  • mysql, wordpress 제외하고 모두 삭제한다.
ㅇ 컨테이너 로그보기
  • logs
  • docker logs [OPTIONS] CONTAINER          
  • -f 옵션을 사용해보자
ㅇ 이미지 목록 확인하기
  • images
  • docker images [OPTIONS] [REPOSITORY[:TAG]]         
  • $ docker images
    
ㅇ 이미지 다운로드하기
  • pull
  • docker pull [OPTIONS] NAME[:TAG|@DIGEST]              
  • run명령어는 pull 과정이 포함되어 있다. 같은 태그지만 이미지가 업데이트 된 경우 pull 명령어를 통해 새로 다운받을 수 있다.
ㅇ 이미지 제거하기
  • rmi
  • docker rmi [OPTIONS] CONTAINER [CONTAINER...]     
  • mysql, wordpress 제외하고 모두 삭제한다.
ㅇ 네트워크 만들기
  • network create
  • docker network create [OPTIONS]     
  • # wordpress와 mysql이 통신할 네트워크를 만든다.
    $ docker network create app-network 
    
    # 만들어 놓은 mysql에 네트워크를 추가합니다.
    $ docker network connect app-network mysql
    
    # wordpress container를 띄워서 둘이 제대로 연결되었는지 확인한다.
    $ docker run -d -p 8080:80  --network=app-network -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress
ㅇ Dockerfile 작성하기
  • vim Dockerfile
    
    # 아래 세 줄 추가하고 저장
    FROM httpd:latest
    EXPOSE 80
    CMD ["httpd-foreground"]
    
  • $ docker build -t httpd-test .
    
    
    # 기존에 떠 있는 Container stop,rm 해주고 실행한다.
    $ docker run -d -p 8080:80 httpd-test
ㅇ 이미지 생성 & 도커 허브에 푸쉬하기
  • docker hub에 httpd-test repository 생성
  • $ docker tag httpd-test ${docker_hub_id}/httpd-test:v1
    
    $ docker login
    
    $ docker push ${docker_hub_id}/httpd-test:v1
ㅇ Docker Compose 실습
  • docker-compose up : 시작
  • vim docker-compose.yml
    
    #아래 내용 작성
    version: '3'
    services:
      wordpress:
        image: wordpress
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_NAME: wp
          WORDPRESS_DB_USER: wp
          WORDPRESS_DB_PASSWORD: wp
        ports:
          - "8000:80"
        restart: always
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: wp
          MYSQL_DATABASE: wp
          MYSQL_USER: wp
          MYSQL_PASSWORD: wp
  • docker-compose up -d
  • docker-compose ps
  • docker-compose logs -f
  • docker-compose down