Docker 소개 및 입문

Docker 는 새로운 사물 로 개념 이 가상 화 와 유사 하 다.인터넷 상에 서 Docker 입문 에 관 한 것 은 이미 매우 많다.그러나 본 고 는 Docker 의 특징, 특성, 원 리 를 연구 하고 중국 특색 을 가 진 설치 테스트 과정 도 소개 했다. 또한 Docker 의 지역사회 생태 와 Dockerfile 을 언급 하고 Dockerfile 로 nginx 환경 을 구축 했다.Docker 소개 및 입문
발단
몇 달 전 Docker 에 대해 들 었 지만 연구 할 시간 이 없 었 습 니 다. 얼마 전 azure 를 이용 해 무료 로 사용 해 보 았 습 니 다. 서둘러 실험 해 보 았 습 니 다. 하지만 ubuntu 기초 미 러 다운로드 에 걸 려 (국내 네트워크 의 특별한 이유 로) 좌초 되 었 습 니 다.구경 Segmentfault 을 하 다가 위 에 Docker 서브 스테이션 문답 이 있 는 것 을 보 았 습 니 다. 구경 을 했 는데 과연 건어물 이 있 었 습 니 다. 그래서 다시 시도 해 보 았 습 니 다. 여기 서 경험 과 체험 을 공유 해 보 겠 습 니 다.
Docker 소개
나 는 간단하게 말 하면 Docker 은 응용 프로그램 이 용 기 를 실행 하 는 것 이 고 가상 컴퓨터 와 유사 한 개념 이 라 고 생각한다.그러나 가상 화 기술 과 다른 점 은 다음 과 같다.
  • 가상 화 기술 은 물리 적 CPU 와 메모리 에 의존 하고 하드웨어 등급 이다.한편, docker 는 운영 체제 에 구축 되 고 운영 체제 의 containerization 기술 을 이용 하기 때문에 docker 는 가상 컴퓨터 에서 도 운행 할 수 있다.
  • 가상 화 시스템 은 일반적으로 운영 체제 미 러 를 말 하 는데 비교적 복잡 하고 '시스템' 이 라 고 부른다.한편, docker 는 소스 를 열 고 경 량 으로 '용기' 라 고 부 르 며 하나의 용 기 는 소량의 응용 을 배치 하기에 적합 하 다. 예 를 들 어 하나의 redis, 하나의 memcached 를 배치 하 는 것 이다.
  • 전통 적 인 가상 화 기술 은 스냅 샷 으로 상 태 를 보존 한다.한편, docker 는 저장 상태 에서 더욱 가 볍 고 원가 가 낮 을 뿐만 아니 라 유사 한 소스 코드 관리 체 제 를 도입 하여 용기 의 스냅 샷 역사 버 전 을 일일이 기록 하고 전환 원가 가 매우 낮다.
  • 전통 적 인 가상 화 기술 은 시스템 을 구축 할 때 비교적 복잡 하고 대량의 인력 이 필요 하 다.docker 는 Dockfile 을 통 해 전체 용 기 를 구축 할 수 있 고 재 부팅 과 구축 속도 가 빠르다.더 중요 한 것 은 Dockfile 을 수 동 으로 작성 할 수 있 습 니 다. 그러면 응용 프로그램 개발 자 들 은 Dockfile 을 발표 하여 시스템 환경 과 의존 도 를 지도 할 수 있 습 니 다. 이렇게 하면 지속 적 으로 전달 하 는 데 유리 합 니 다.
  • Dockerfile 은 이미 구 축 된 용기 미 러 를 기반 으로 새 용 기 를 만 들 수 있 습 니 다.Dockerfile 은 커 뮤 니 티 를 통 해 공유 하고 다운로드 할 수 있어 이 기술 의 홍보 에 유리 하 다.

  • Docker 의 주요 특성 은 다음 과 같 습 니 다 Docker: 일치 성 을 갖 춘 자동화 소프트웨어 배치.
  • 파일 시스템 격 리: 모든 프로 세 스 용 기 는 완전히 독립 된 루트 파일 시스템 에서 실 행 됩 니 다.
  • 자원 격 리: 모든 프로 세 스 용기 에 서로 다른 시스템 자원 을 배분 할 수 있 습 니 다. 예 를 들 어 CPU 와 메모리 등 입 니 다.
  • 네트워크 격 리: 모든 프로 세 스 용 기 는 자신의 네트워크 네 임 스페이스 에서 실 행 됩 니 다. 자신의 가상 인터페이스 와 IP 주 소 를 가지 고 있 습 니 다.
  • 작성 시 복사: 작성 시 복사 방식 으로 루트 파일 시스템 을 만 듭 니 다. 이 는 배 치 를 매우 빠 르 고 메모리 와 하 드 디스크 공간 을 절약 합 니 다.
  • 로그 기록: Docker 는 모든 프로 세 스 용기 의 표준 흐름 (stdout / stderr / stdin) 을 수집 하고 기록 하여 실시 간 검색 이나 대량 검색 에 사용 합 니 다.
  • 변경 관리: 용기 파일 시스템 의 변경 은 새로운 이미지 에 제출 할 수 있 으 며, 더 많은 용 기 를 만 들 기 위해 중복 사용 할 수 있 습 니 다. 템 플 릿 이나 수 동 설정 을 사용 하지 않 아 도 됩 니 다.
  • 대화 형 셸: Docker 는 가상 단말 기 를 할당 하고 모든 용기 의 표준 입력 에 연결 할 수 있 습 니 다. 예 를 들 어 일회 성 대화 셸 을 실행 할 수 있 습 니 다.
  • 현재 Docker 는 개발 단계 에 있 으 며 공식 적 으로 는 생산 환경 에 사용 하 는 것 을 권장 하지 않 습 니 다. 또한 Docker 는 Ubuntu 를 기반 으로 개발 되 었 기 때문에 공식 적 으로 는 Ubuntu 운영 체제 에 설치 하 는 것 을 추천 합 니 다. 현 재 는 Liux 시스템 에 만 설치 할 수 있 습 니 다.
    Docker 의 사용 입문
    Docker 공식 설치 지도 상세 합 니 다. 하지만 국내의 특수 한 상황 으로 인해 저 는 이 설치 지 도 를 바탕 으로 국내 개발 자 에 게 적용 되 는 입문 과정 을 제시 합 니 다. Ubuntu Precise 12.04 (LTS) (64-bit) 을 바탕 으로 이 버 전 을 추천 합 니 다. 다른 버 전 은 공식 설치 매 뉴 얼 을 참고 합 니 다.
    Docker 설치
    우선 Docker 는 공식 적 으로 리 눅 스 커 널 3.8 이상 을 실행 하 는 것 이 좋 겠 다 고 밝 혔 기 때문에 커 널 업그레이드 부터 해 야 한다.
    # install the backported kernel
    sudo apt-get update
    sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
    
    # reboot
    sudo reboot
    

    Docker 창고 의 key 추가:
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
    

    미 러 를 추가 합 니 다. 여 기 는 러시아 Yandex 를 직접 사용 합 니 다.
    sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list"
    sudo apt-get update
    

    Docker 설치
    sudo apt-get install lxc-docker
    

    일반적으로 위의 절 차 는 아무런 문제 가 없 을 것 이다.
    Docker 미 러 다운로드
    Docker 가 실행 하려 면 최소한 ubuntu 의 기본 미 러 가 필요 합 니 다. 이 미 러 는 처음 실행 할 때 자동 으로 다운로드 되 지만 국내 에서 직접 사용 하려 면 기본 적 으로 는 생각 하지 마 세 요. 대 리 를 사용 해 야 합 니 다. 여 기 는 Docker 중국어 커 뮤 니 티 에서 제공 하 는 대 리 를 사용 합 니 다. 출처, 출처.
    파일 수정 /etc/default/docker, 주석 취소 http_proxy 부분:
    # If you need Docker to use an HTTP proxy, it can also be specified here.
    export http_proxy=http://192.241.209.203:8384/  
    

    필자 의 테스트 를 통 해 위의 이 대리 도 안정 적 이지 않 고 사용 하 는 사람 이 비교적 많 을 것 이다.
    사용 가능 한 프 록 시 주소 (지속 적 인 관심 중)
    http://192.241.209.203:8384
    그리고 다음 명령 을 실행 할 수 있 습 니 다. 테스트 가 실 행 됩 니 다. 에이전트 가 안정 적 이지 않 기 때문에 몇 번 더 시도 해 야 할 수도 있 습 니 다 (침착).
    sudo docker run -i -t ubuntu /bin/bash
    

    다음 캡 처 는 제 가 pull 완성 에 성 공 했 고 hello World 성공 테스트 (약 3 - 4 번 시도) 입 니 다.
    Docker 의 커 뮤 니 티 와 생태
    창고 와 미 러
    오픈 소스 기술 을 평가 하려 면 커 뮤 니 티 와 생태 에 관심 을 가 져 야 합 니 다. Docker 의 생태 는 특정한 '미 러 (image) 가방' 을 푸 시 하고 끌 어 당 겨 서 펼 쳐 집 니 다. docker index 에서 필요 한 미 러 를 검색 할 수 있 습 니 다. 아래 명령 을 통 해 검색 할 수도 있 습 니 다.
    sudo docker search
    

    미 러 는 일부 소프트웨어 를 포함 하 는 용기 시스템 으로 볼 수 있 습 니 다. 예 를 들 어 ubuntu 는 공식 적 인 기본 미 러 입 니 다. 많은 미 러 는 이 미 러 의 '파생' 을 바탕 으로 합 니 다. 이 미 러 는 기본 적 인 ubuntu 시스템 을 포함 하고 있 습 니 다. 예 를 들 어 hipache 은 공식 적 인 미 러 용기 로 실행 후 http 와 websocket 의 대리 서 비 스 를 지원 할 수 있 습 니 다. 이 미 러 자 체 는 그 자체 에 기반 을 두 고 있 습 니 다.ubuntupull 를 통 해 미 러 를 끌 어 내 고 미 러 를 로 컬 에 다운로드 합 니 다. 예 를 들 어
    sudo docker pull hipache
    
    images 을 통 해 현재 어떤 미 러 가 있 는 지 확인 합 니 다.
    sudo docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    ubuntu              13.10               9f676bd305a4        6 weeks ago         178 MB
    ubuntu              saucy               9f676bd305a4        6 weeks ago         178 MB
    ubuntu              13.04               eb601b8965b8        6 weeks ago         166.5 MB
    ubuntu              raring              eb601b8965b8        6 weeks ago         166.5 MB
    ubuntu              12.10               5ac751e8d623        6 weeks ago         161 MB
    ubuntu              quantal             5ac751e8d623        6 weeks ago         161 MB
    ubuntu              10.04               9cc9ea5ea540        6 weeks ago         180.8 MB
    ubuntu              lucid               9cc9ea5ea540        6 weeks ago         180.8 MB
    ubuntu              12.04               9cd978db300e        6 weeks ago         204.4 MB
    ubuntu              latest              9cd978db300e        6 weeks ago         204.4 MB
    ubuntu              precise             9cd978db300e        6 weeks ago         204.4 MB
    

    위 에 있 는 것 은 모두 미 러 입 니 다. 모두 ubuntu 창고 (일반 창고 명 은 username/repository 형식 일 것 입 니 다. repository 를 창고 명 으로 한다 면 공식 적 으로 발 표 된 창 고 를 말 합 니 다. 우리 가 ubuntu 를 끌 어 올 렸 을 때 사실은 창고 안의 미 러 를 모두 끌 어 내 렸 습 니 다. 미 러 마다 유일한 IMAGE ID 과 기억 하기 쉬 운 TAG 이 있 습 니 다.IMAGE ID 의 앞 자리 나 repository:TAG 를 통 해 미 러 를 표시 할 수 있 습 니 다.
    Dockerfile 과 Dockerfile 을 통 해 Nginx 용 기 를 구축 합 니 다.
    pull 을 제외 하고 미 러 도 '컴 파일' 을 통 해 얻 을 수 있 습 니 다. 여기 있 는 '컴 파일' 입 니 다.수 동 으로 작성 하거나 github 에서 Dockerfile 을 가 져 와 서 미 러 를 만 드 는 빌 드 동작 을 말 합 니 다. Dockerfile 을 스 크 립 트 로 볼 수 있 습 니 다. 이 스 크 립 트 는 용기 가 시 작 될 때마다 실 행 됩 니 다. 일반적으로 Dockerfile 에 서 는 기본 소프트웨어 의 설치 스 크 립 트 와 설정 스 크 립 트 를 작성 해 야 합 니 다. 다음 Dockerfile 은 예 입 니 다.
    #
    # Ubuntu Dockerfile
    #
    # https://github.com/dockerfile/ubuntu
    #
    
    # Pull base image.
    FROM ubuntu:12.10
    
    # Update OS.
    RUN echo "deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse" > /etc/apt/sources.list
    RUN apt-get update
    RUN apt-get upgrade -y
    
    # Install basic packages.
    RUN apt-get install -y software-properties-common
    RUN apt-get install -y curl git htop unzip vim wget
    
    # Add files.
    ADD root/.bashrc /root/.bashrc
    ADD root/.gitconfig /root/.gitconfig
    ADD root/scripts /root/scripts
    
    # Set working directory.
    ENV HOME /root
    WORKDIR /root
    
    FROM 명령 어 는 이번 구축 에 ubuntu 창 고 를 기반 으로 한 12.10 TAG 미 러 가 필요 합 니 다. 로 컬 에 이 미 러 가 존재 하지 않 으 면 자동 으로 미 러 를 다운로드 합 니 다. 미 러 는 실제로 컴 파일 된 결과 입 니 다. 위 에 있 는 Dockerfile 은 원본 ubuntu 를 바탕 으로 자주 사용 되 는 소프트웨어 를 많이 설치 하 였 습 니 다.
    docker 공식 유 Dockerfile 튜 토리 얼
    실천 하 다.
    우선 위의 설치 절 차 를 마 쳤 는 지 확인 하고 기본 미 러 ubuntu: 12.10 을 끌 어 옵 니 다.
    현재 우 리 는 위의 Dockerfile 로 이 창 고 를 구축 합 니 다. (위의 Dockerfile 은 실제 github dockerfile 프로젝트 의 기본 창고 dockerfile/ubuntu 이 고 아래 명령 은 github 에서 Dockerfile 을 다운로드 하여 구축 합 니 다)
    sudo docker build -t="dockerfile/ubuntu" github.com/dockerfile/ubuntu
    

    다음은 마지막 구축 에 성 공 했 을 때의 출력 입 니 다.
    ...
    Processing triggers for ureadahead ...
     ---> 0a4392cf8e2d
    Step 6 : ADD root/.bashrc /root/.bashrc
     ---> b0e86f348c09
    Step 7 : ADD root/.gitconfig /root/.gitconfig
     ---> e2a9c001d457
    Step 8 : ADD root/scripts /root/scripts
     ---> 678febabdbdc
    Step 9 : ENV HOME /root
     ---> Running in c4afef311cf1
     ---> eaa3ae3277a8
    Step 10 : WORKDIR /root
     ---> Running in d50c273c75b8
     ---> c9ecf5bc3227
    Successfully built c9ecf5bc3227
    Removing intermediate container 1a3d1f794c49
    Removing intermediate container 9f72df8abb63
    Removing intermediate container 5694d1e3e77e
    Removing intermediate container 6a184821f89c
    Removing intermediate container 8195bd05fc36
    Removing intermediate container d50c273c75b8
    Removing intermediate container 70de07353ecf
    Removing intermediate container 73e3f6204613
    Removing intermediate container 5dd948415981
    Removing intermediate container c4afef311cf1
    

    이 때 창고 가 하나 더 나 옵 니 다:
    sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    dockerfile/ubuntu   latest              c9ecf5bc3227        About a minute ago   294.2 MB
    ...
    

    이제 우 리 는 dockerfile/nginx 을 구축 할 수 있다. (물론 처음부터 이 미 러 를 직접 pull
    sudo docker build -t="dockerfile/nginx" github.com/dockerfile/nginx
    

    완 료 된 후에 컴 파일 된 미 러 를 볼 수 있 습 니 다:
    sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    dockerfile/nginx    latest              68508350c656        About a minute ago   308.3 MB
    dockerfile/ubuntu   latest              c9ecf5bc3227        16 minutes ago       294.2 MB
    ...
    

    이제 진짜 효 과 를 볼 때 가 되 었 습 니 다! 다음 명령 으로 용 기 를 실행 하 십시오:
    sudo docker run -d -p 80:80 dockerfile/nginx
    

    이 명령 은 daemon 방식 으로 용 기 를 실행 합 니 다. 다음 명령 을 통 해 실행 중인 용 기 를 봅 니 다.
    sudo docker ps
    CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                NAMES
    98c474a7dd6a        dockerfile/nginx:latest   nginx               6 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp   trusting_hawking
    

    호스트 의 80 포트 를 방문 하면 nginx 의 환영 페이지 를 볼 수 있 습 니 다. 이 때 이 컴퓨터 의 프로 세 스 sudo ps -ef 를 살 펴 보 겠 습 니 다.
    root      1428   952  0 15:19 ?        00:00:00 nginx: master process nginx
    root      1429   417  0 15:19 ?        00:00:00 /sbin/udevd --daemon
    www-data  1441  1428  0 15:19 ?        00:00:00 nginx: worker process
    www-data  1442  1428  0 15:19 ?        00:00:00 nginx: worker process
    www-data  1443  1428  0 15:19 ?        00:00:00 nginx: worker process
    www-data  1444  1428  0 15:19 ?        00:00:00 nginx: worker process
    

    사물 의 본질 에 가 까 운 것 같 습 니 다. nginx 의 프로 세 스 는 실제 적 으로 이 컴퓨터 에 있 습 니 다. 이 는 용기 에서 프로그램의 실행 은 여전히 이 컴퓨터 운영 체 제 를 사용 하고 있 습 니 다. 용 기 는 스스로 운영 체 제 를 구축 하지 않 고 특정한 격 리 방식 으로 이 컴퓨터 운영 체제 에 의존 하 는 것 을 의미 합 니 다. 이것 이 바로 Docker 와 가상 컴퓨터 의 본질 적 인 차이 입 니 다.
    아래 와 같이 이 컴퓨터 의 디 렉 터 리 를 "nginx 용기" 에 표시 할 수 있 습 니 다. 디 렉 터 리 에 nginx 설정 파일 세 션 이 있어 야 합 니 다.
    docker run -d -p 80:80 -v :/etc/nginx/sites-enabled -v :/var/log/nginx dockerfile/nginx
    

    PS: 이 단 계 는 필자 가 성공 하지 못 했 습 니 다. 로그 경 로 는 map 할 수 있 지만 sites - enable - dir 의 설정 은 항상 안 됩 니 다. 계속 진단 중 입 니 다.
    미 러 공유 와 Dockfile 배포
    미 러 와 빌 드 할 Dockfile 을 공유 하여 커 뮤 니 티 에 공유 할 수 있 습 니 다.
  • Docker index 은 공식 미 러 목록 으로 그 안에서 대량의 사전 컴 파일 된 미 러
  • 를 얻 을 수 있다.
  • Dockerfile Project Dockerfile 을 위탁 관리 하 는 창고 집합
  • 의 원리
    전체적으로 말 하면 Docker 의 핵심 기술 은 다음 과 같다.
  • 네 임 스페이스
  • AUFS(advanced multi layered unification filesystem)
  • cgroup

  • 본인 의 재능 이 부족 하기 때문에 아래 에 참고 자 료 를 제시 합 니 다. 관심 이 있 는 친 구 는 확장 해서 읽 을 수 있 습 니 다. 반드시 Docker 에 대해 더욱 깊 은 인식 을 가지 게 될 것 입 니 다.
    PaaS under the hood, episode 1: kernel namespaces
    PaaS Under the Hood, Episode 2: cgroups
    PAAS Under the Hood, Episode 3: AUFS
    PaaS Under the Hood, Episode 4: GRSEC
    PaaS under the hood, episode 5: Distributed routing with Hipache
    후드 시리즈
    LXC (Linux 가상 환경) 에 대한 간단 한 소개
    docker 원리 안내
    참고 자료
    Docker 공식
    Docker: 일치 성 을 갖 춘 자동화 소프트웨어 배치
    Dockerfile 튜 토리 얼
    일부 Docker 의 커 뮤 니 티 자원:
    SegmentfaultDocker 서브 스테이션 문답
    Docker 중국어 커 뮤 니 티
    Docker 중국어 문서

    좋은 웹페이지 즐겨찾기