[docker] Docker 입문부터 실천 노트까지

Docker 시작 - 실습 노트
기본 개념
  • 미러링(Image)
  • 컨테이너(Container)
  • 웨어하우스(Repository)
  • 미러링
  • 특수 파일 시스템
  • 동적 데이터 없음
  • Union FS 기술을 사용한 계층형 아키텍처 설계
  • 용기.
  • 거울과 용기는'클래스'와'실례'와 같은 차이
  • 용기의 실질은 프로세스
  • 용기도 층구조로 용기 저장층이 존재하고 용기가 운행할 때 읽기와 쓰기를 위해 준비하며 생명주기와 용기가 동기화
  • 창고.
  • Docker Registry(등록 서버): 집중적으로 저장하고 거울을 나누어 주는 서비스
  • 하나의registry 여러 개의repository(창고)
  • 하나의 Repository(창고) 여러 개의 tag(라벨)
  • tag (탭) 이미지 (거울)
  • 일반 작업
    미러링
    미러 가져오기
    docker pull --help
    

    미러를 실행하여 컨테이너 가져오기
    docker run --help
    

    미러 목록
    docker image ls
    

    미러 이미지 띄우기
    docker image prune #      
    

    중간 레이어 대칭복사
    docker image ls -a #     
    

    부분 미러 표시
    docker image ls [repo:tag]
    

    미러 id 표시
    docker image ls -q
    

    로컬 미러 제거
    docker image rm --help  #  tag   
    

    미러링 실행 컨테이너 사용자 정의
    docker run  --name webserver -d -p 81:80 nginx 
    // nginx           webserver,   80  , http://localhost:81     (-p      :    )
    //     docker exec -it webserver bash
    //     exit
    //       docker diff webserver
    //         (         )docker commit
    

    미러 사용자 정의
    docker commit --help
    //         (          )
    

    미러 내역 보기
    docker history [repo:tag]
    

    용기.
    부팅 컨테이너
    두 가지 방식
  • 미러 기반 새 컨테이너
  • 종료된 컨테이너를 재부팅
  • 새로 만들기 및 시작
    docker run ubuntu:18.04 /bin/echo 'Hello world'
    //       “Hello World”,      。
    
    docker run -t -i ubuntu:18.04 /bin/bash
    //-t    Docker       (pseudo-tty)            
    //-i              。
    

    docker run의 백엔드 논리
  • 로컬에 지정된 이미지가 있는지 확인하고 존재하지 않으면 공유창고에서 다운로드
  • 미러를 사용하여 컨테이너를 생성하고 시작합니다
  • .
  • 파일 시스템을 할당하고 읽기 전용 미러 레이어 외부에 읽기 및 쓰기 레이어
  • 를 마운트합니다.
  • 숙주 호스트가 설정한 브리지 인터페이스에서 가상 인터페이스를 연결하여 용기로 이동
  • 주소 탱크에서 ip 주소를 용기에 설정하기
  • 사용자 지정 어플리케이션 실행
  • 실행 완료 후 용기가 종료됨
  • 종료된 컨테이너 시작
    docker container start
    

    백그라운드 실행
  • -d 매개 변수 결정
  • 활성화된 출력 결과는 숙성 호스트에 인쇄되지 않습니다. docker logs에서 볼 수 있습니다
  • 유일한 id를 되돌려줍니다.docker container ls를 통해 볼 수 있습니다
  • 출력 정보 보기 docker container logs
  • 용기가 오래 실행될지 여부는 dockerrun이 지정한 명령과 관련이 있으며 - d 파라미터와는 무관합니다.
  • #      
    docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    
    #-d     , docker logs 
    docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    

    컨테이너 종료
  • docker container stop 실행 중지 용기
  • docker 용기에서 지정한 응용 종료 시 용기가 자동으로 종료됩니다.
  • 터미널 용기 호출 exit만 시작하고 ctrl+d가 터미널을 종료하면 용기가 종료됩니다.
  • #    
    docker container ls -a
    #        
    docker container stop 
    #         
    docker container start
    #         
    docker container restart
    

    용기에 들어간다
    #attach  
    docker run -dit ubuntu
    docker attach xxx //   stdin exit,       。
    
    #exec  
    docker run -dit ubuntu
    docker exec -it 69d1 bash //    stdin   exit,         
    
    #    
    docker exec --help
    
    

    가져오기 내보내기 컨테이너
    컨테이너 내보내기
    #           
    docker export 7691a814370e > ubuntu.tar
    

    컨테이너 스냅샷 가져오기
    #  docker import               
    cat ubuntu.tar | docker import - test/ubuntu:v1.0
    docker image ls
    
    #        URL          
    docker import http://example.com/exampleimage.tgz example/imagerepo
    
    
  • 로컬 미러 라이브러리에 미러 저장소 파일을 가져오는 docker load
  • 컨테이너 스냅샷을 로컬 이미지 라이브러리로 가져오는 docker import
  • 이러한 차이점은 다음과 같습니다.
  • 컨테이너 스냅샷 파일은 모든 히스토리와 메타데이터 정보를 삭제합니다(즉, 컨테이너 당시의 스냅샷 상태만 저장).
  • 미러 저장소 파일은 전체 레코드를 저장하고 크기도 커야 합니다.
  • 컨테이너 스냅샷 파일에서 가져올 때 탭과 같은 메타데이터 정보를 다시 지정할 수 있습니다.

  • 컨테이너 삭제 및 정리
    #             
    docker container rm trusting_newton
    
    #            
    docker container rm -f xxxx //docker   SIGKILL     。
    
    #             
    docker container prune
    

    창고.
  • 창고(Repository)는 미러를 중앙 집중식으로 보관하는 곳입니다.
  • 등록 서버(Registry)는 창고를 관리하는 구체적인 서버로 서버마다 여러 개의 창고가 있고 창고 아래에 여러 개의 거울이 있다.
  • 창고는 구체적인 항목이나 목록으로 여겨질 수 있다
  • dl.dockerpool.com/ubuntu 중dl.dockerpool.com은 등록 서버 주소이고 ubuntu는 창고 이름입니다.

  • Docker Hub
    Docker 공식적으로 15000개 이상의 미러가 포함된 공용 창고 Docker Hub을 유지 관리합니다.
    일반 명령
    docker search //          
    docker pull //     
    docker push //          Docker Hub
    

    자동 생성
    자동 생성(Automated Builds) 기능은 미러 내부 프로그램을 자주 업그레이드해야 하는 경우에 편리합니다.
    개인 창고
  • 도구 docker-registry
  • 데이터 관리
    용기에서 데이터를 관리하는 두 가지 경로
  • 볼륨
  • 호스트 디렉토리 마운트(Bind mounts)
  • 데이터 볼륨
  • 는 하나 이상의 컨테이너에 사용할 수 있는 특수 디렉토리로서 UFS를 우회하면 유용한 기능을 많이 제공할 수 있습니다
  • .
  • 데이터 볼륨은 용기 간에 공유하고 다시 사용할 수 있다
  • 데이터 볼륨에 대한 수정 사항이 즉시 적용됩니다
  • .
  • 미러에 영향을 주지 않고 데이터 볼륨 업데이트 수행
  • 데이터 볼륨은 컨테이너가 삭제되더라도 기본적으로 항상 존재합니다.
    데이터 볼륨의 사용은 리눅스에서 디렉터리나 파일을 mount하는 것과 유사하며, 거울에 있는 마운트 지점으로 지정된 디렉터리의 파일은 숨겨지고 마운트된 데이터 볼륨을 볼 수 있다.
    일반 작업
    #        my-vol
    docker volume create my-vol
    
    #         
    docker volume ls
    
    #                        
    docker volume inspect my-vol
    
    #            
    #       web    ,               /webapp   。
    docker run -d -P --name web --mount source=my-vol,target=/webapp \ training/webapp \ 
    python app.pyc
        docker run            
    
    #          
    #              web      
    docker inspect web   //        "Mounts" Key   
    
    #     
    docker volume rm my-vol
    
    #     
    docker volume prune
    
    
  • 데이터 볼륨은 데이터를 지속하기 위해 설계된 것으로 그의 생명주기는 용기에 독립되어 있으며 Docker는 용기가 삭제된 후에 자동으로 데이터 볼륨을 삭제하지 않는다
  • 용기에서 인용되지 않은 데이터 볼륨을 처리하기 위한 스팸 회수 메커니즘도 존재하지 않는다
  • 컨테이너를 삭제하는 동시에 데이터 볼륨을 제거해야 할 경우용기를 삭제할 때 docker rm-v 명령을 사용할 수 있습니다
  • 호스트 디렉토리 마운트
    호스트 디렉터리를 데이터 볼륨으로 마운트합니다. - mount 표시는 로컬 호스트를 마운트하는 디렉터리를 용기에 마운트할 수 있습니다.
    #      /src/webapp        /opt/webapp   
    docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py
    
    # read only  
    docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,read
    only \
    training/webapp \
    python app.py
    
    #   web      
    docker inspect web
    

    데이터 볼륨으로 로컬 호스트 파일 마운트
    -- mount 태그는 호스트에서 개별 파일을 컨테이너에 마운트할 수도 있습니다.
    docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
    ubuntu:18.04 \
    bash
    #                 
    

    네트워크 기능
    Docker는 외부 액세스 컨테이너나 컨테이너를 통해 네트워크 서비스를 제공할 수 있습니다.
    외부 액세스 컨테이너
    -P(대문자) 매핑
  • -P(대문자p) Docker는 49000~49900의 포트를 내부 용기에 열린 네트워크 포트에 무작위로 비추어 줍니다.
  • docker container ls에서 매핑 관계를 볼 수 있음
  • #      
    docker run -d -P training/webapp python app.py
    
    #      
    docker container ls -l
    
    #      
    docker logs -f nostalgic_morse
    

    -p(소문자) 매핑
  • -p(소문자)는 비추는 포트를 지정할 수 있고 지정된 포트에 용기만 연결할 수 있습니다.
  • 지원되는 형식은 ip:hostPort:containerPort | ip:::containerPort |hostPort:containerPort입니다.
  • #        
    #hostPort:containerPort       5000          5000   
    docker run -d -p 5000:5000 training/webapp python app.py
    #                   。
    
    #            
    #ip:hostPort:containerPort               ,  
    localhost    127.0.0.1
    docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
    
    #            
    #ip::containerPort    localhost           5000   ,  
               。
    docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    
    #        
    # udp       udp   
    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp pytho
    n app.py
    
    

    포트 구성 보기
    docker port을 사용하여 현재 맵의 포트 설정을 볼 수도 있고, 연결된 주소를 볼 수도 있습니다
    docker port nostalgic_morse 5000
    

    컨테이너 내부 네트워크 구성 보기
  • 용기는 자신의 내부 네트워크와 IP 주소가 있음
  • docker inspect를 사용하면 모든 변수를 얻을 수 있습니다
  • Docker는 가변 네트워크 구성도 가능
  • 여러 포트 바인딩
    docker run -d \
    -p 5000:5000 \
    -p 3000:80 \
    training/webapp \
    python app.py
    

    컨테이너 상호 연결
    새 네트워크
    docker network create -d bridge my-net
    #-d      Docker       bridge overlay 
    #   overlay        Swarm mode
    

    링크 컨테이너
    #  busybox1,    busybox,   my-net
    docker run -it --rm --name busybox1 --network my-net busybox sh
    
    #  busybox2,    busybox,   my-net
    docker run -it --rm --name busybox2 --network my-net busybox sh
    
    #    
    docker container ls
    
    #    , busybox1 ping busybox2
    ping busybox2
    

    Docker Compose
    여러 컨테이너 간에 상호 연결이 필요한 경우 Docker Compose를 사용하는 것이 좋습니다.
    DNS(Domain Name System) 구성
    컨테이너의 호스트 이름과 DNS를 설정합니다. Docker는 가상 파일을 이용하여 컨테이너의 3개의 관련 프로필을 마운트합니다. 컨테이너에서 mount를 실행하면 마운트 정보를 얻을 수 있습니다.
    $ mount
    /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
    /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
    tmpfs on /etc/resolv.conf type tmpfs ...
    #           DNS        ,   Docker     DNS      /etc/resolv.conf         。
    

    모든 컨테이너에 대한 DNS 구성
    /etc/docker/daemon.json 파일에 다음 내용을 추가해서 설정합니다.
    {
    "dns" : [
    "114.114.114.114",
    "8.8.8.8"
    ]
    }
    #        DNS       114.114.114.114   8.8.8.8
    #              。
    docker run -it --rm ubuntu:18.04 cat etc/resolv.conf
    

    컨테이너 구성 수동 지정
    docker run 명령을 사용하여 컨테이너를 시작할 때 다음과 같은 매개 변수를 추가할 수 있습니다.
  • -h HOSTNAME 또는 --hostname=HOSTNAME 설정 용기의 호스트 이름
  • 용기 내의/etc/hostname과/etc/hosts에 기록됩니다.
  • 그러나 이것은 용기 외부에서 볼 수 없습니다. docker container ls에 표시되지 않을 뿐만 아니라 다른 용기의/etc/hosts에도 표시되지 않습니다.
  • --dns=IP_ADDDRESS가 컨테이너의/etc/resolv에 DNS 서버를 추가합니다.conf
  • 용기는 이 서버로/etc/hosts에 없는 모든 호스트 이름을 분석합니다.
  • --dns-search=DOMAIN 설정 용기의 검색역
  • 검색 영역을.example.com에서 host라는 호스트를 검색할 때 DNS는host뿐만 아니라host도 검색합니다.example.com .

  • 주의: 용기를 시작할 때 마지막 두 개의 인자가 지정되지 않으면, Docker는 기본적으로 호스트의/etc/resolv를 사용합니다.conf를 사용하여 컨테이너를 구성합니다.

    좋은 웹페이지 즐겨찾기