5/10/2018

Docker Command 사용법 정리

1. Docker Concept


Docker를 Container의 기술이라고 하며, 이 기술은 Virtualization과 아주 흡사하게 동작하는 기술이다.
이는 개발과 배포를 보다 손쉽게 해주는 실행해주는 기술로, 가상머신처럼 Image를 받아 실행을 해주는 기술이다.

Docker 기본환경설치
  https://ahyuo79.blogspot.com/2017/07/docker.html

Docker Redmine 설치
  https://ahyuo79.blogspot.com/2018/02/docker-redmine.html


1.1 Docker 의 containers 와 Image 개념


Dockerfile -> Image -> Container 

  • Container
쉽게 생각하면, Virtual Machine에서 Virtual HW에 해당하는 부분이지만, 좀 다르게, 추상화된 Package가 맞을 것 같다. 
Containers는 Image (App/Bin/Libs) 가 제대로 동작할 수 있도록하는 Image의 Instance 개념으로 Container를 생성한다.
그리고, 이 Image의 Instance를 Docker 기반으로 내부 App을 실행을 하고 외부와 차단하여 동작되어진다.
아래 그림 참조 

Virtual Machine과 다르게 Hypervisior / Guest OS를 사용하지 않고 Docker만을 이용하여,  외부(Container 끼리 혹은 Host)와 차단을 하여 동작을 한다.

물론 Container 외부와 통신하고 공유하는 방법도 존재하므로 설정에 따라 이 부분은 다르게 동작한다.
Container가 생성된 후에는 Container 내부에서는 독립적으로 데이타 저장도 가능하며 확장도 가능하지만, 종료가 될 때 Container도 삭제하도록 구성도 가능하다
일반적으로 Docker에서 Container를 생성하는 방법은 run 명령create를 이용하여 생성할 수 있다.


  • Images
Image는 실행될 수 있는 Binary Package를 말하며, 이는 Application을 구동시키기 위해서 사용되어지는 
Runtime Code , Libraries , 환경변수 및 설정파일들을 포함하고 있다.
처음 Dockerfile에 의해서 상위구성들을 Image로 만든다. 그리고,
이 Image는 Container를 처음 구성할때 같이 포함되어 실행될때 필요하다.

Container 와 image의 차이라면, Container는 Docker에서 실행을 하면서 필요한 Data 저장 및 변화된 환경 및 상태보관이 가능하다.
이외 에도 있을 거지만, 거기까지는 나도 잘 모르겠다. 


  • Container Orchestration
Container 하나만을 실행하면 괜찮겠지만, 문제는 여러개를 사용할 경우 이것을 조율해주고 관리해주는 Tool 이 필요하게된다.
이를 Container Orchestration 이라고 하며, 현재 유명한 것이 Docker Swarm Kubernetes 인 것 같으며,  아직 사용법은 모르겠다.

요즘 이슈가 되는게, Kubernetes로 Server기반으로 많이 사용되는 것 같으며, 내가 사용을 할 기회는 거의 없을 것 같다. 


1.2 Docker 와 Virtual Machine 비교 

간단하게 차이를 보면 Hypervisior, 즉 가상의 CPU / HW환경구성을 비롯하여 Guest OS를 볼수 있겠다.


  • Docker vs Virtual Machine 비교

Docker
Image 기반으로 Container라는 공간을 만들어 APP/Bins/Libs를 관리하며 기본으로 외부와 격리되어 동작된다.

Virtual MachineHypervisior라는 가상의 CPU구성 및 HW 환경구성 기반위에 별도의 GuestOS가 있고, 그 위에 App 관련된 구성이 돌아간다. (다른 CPU구성과 HW구성도 가능)


위에서 보았듯이 Docker의 Container 기술은 가볍고 빠르게 동작이 가능하지만, Host OS Kernel 과 공유하는 부분이 존재하므로, HW 자원의 고갈문제가 발생한다.
예를들면, 여러개의 Contianer가 동작 중이라면, 각각의 Container 마다 Host OS의 HW자원을 사용하려고 할텐데, 이 부분을 별도로 관리가 필요해서 오케스트라션이 필요한 것 이다.
이를 흔히 로드밸랜스라고 한다. 


  • Docker 세부내용은 아래 사이트 참조
  https://docs.docker.com/get-started/#docker-concepts
  https://docs.docker.com/get-started/part2/

  • Virtual Machine 과 Docker 비교
  https://www.aquasec.com/wiki/display/containers/Docker+Containers+vs.+Virtual+Machines
  https://blog.docker.com/2016/04/containers-and-vms-together/
  https://blog.thousandeyes.com/thousandeyes-docker-enterprise-agents/
  https://www.aquasec.com/wiki/display/containers/Docker+Architecture
  https://docs.docker.com/engine/docker-overview/
  https://www.phpflow.com/misc/devops/part-1-getting-started-docker-tutorial/
  https://success.docker.com/article/networking
  https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
  http://www.leafcats.com/146


1.3 Docker 개념의 관련자료 링크모음 


  • Docker Overview 및 개념확인


  • LXC vs Docker
Docker  Container 기술과 유사한 기술인 LXC (Linux Container) 있지만 이는 좀 다르게 동작하는 것 같다.
  http://www.opennaru.com/openshift/docker/what-is-the-difference-between-docker-lxd-and-lxc/
  https://linuxcontainers.org/lxc/introduction/
  https://robin.io/blog/containers-deep-dive-lxc-vs-docker-comparison/

  • Docker 관련내용 
  https://www.slideshare.net/pyrasis/docker-docker-38286477
  https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
  https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
  https://www.clien.net/service/board/lecture/7042127
  http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/



  • Docker VirtualBox
Docker에서 virtual box를 이용하여 사용하는데, virtual box 내부에서 docker를 사용하는지는 추후에 알아보자
  https://docs.docker.com/machine/drivers/virtualbox/


  • Docker EE의 구성
  https://www.docker.com/products/docker-enterprise


  • Container  Orchestration
컨테이너 오케스라이션 두 개를 각각 자세히 알아보자.
추후에 세부적으로 사용할 일이 있겠지?

Docker SWARM
  https://docs.docker.com/swarm/overview/#understand-swarm-cluster-creation

Kubernetes
  https://kubernetes.io/
  https://www.redhat.com/ko/topics/containers/what-is-kubernetes
  https://www.popit.kr/kubernetes-introduction/
  https://www.slideshare.net/ienvyou/docker-on-kubernetes-v1
  https://cloud.google.com/kubernetes-engine/

Jenkins(DevOps) 와 Kubernets 연결 (Google의 활용)
  https://cloud.google.com/solutions/jenkins-on-kubernetes-engine-tutorial


2. Docker 의 기본설치 

Docker는 최근부터 두가지 Edition으로 제공하고 있으며, CE는 아래의 글을 읽어 보면 알겠지만, 
무료이고 개발용/실험용으로 무료로 제공해주고 있다.
EE는 기업용으로 좀 더 나은 기능을 제공해주고 있다.
현재 내가 본 Docker Version 17.09이며 지속적으로 새로운 기능과 다른 기능을 추가해주고 있는 것 같다.
  1. Docker CE (Community Edition)
  2. Docker EE (Enterprise Edition)

기업용(EE)는 나는 사용할 기회가 없으므로, 추후 기회가 생긴다면 그때 알아보자.
그리고 현재 아래의 사이트에서 다른 점 및 CE의  업데이트 주기를 알고 넘어 가야겠다.

  • Docker 설치 전에 확인사항 
Docker Version과 CE/EE 의 차이를 알아두자
  https://docs.docker.com/v17.09/engine/installation/
  https://docs.docker.com/install/

  • Docker  설치 방법
설치방법은 어렵지 않으니 아래의 사이트에서 확인
  https://docs.docker.com/install/linux/docker-ce/ubuntu/
  https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository
  http://dololak.tistory.com/354?category=644234
  http://pyrasis.com/Docker/Docker-HOWTO
  https://docs.docker.com/glossary/


2.1  Docker 의 명령어 사용법 

간단하게 아래의 사이트에서 Docker 의 명령어들을 익혀보자

간단 Manual
  https://gist.github.com/nacyot/8366310

Docker Command의 Option 확인
  https://docs.docker.com/engine/reference/commandline/start/#options

  • Docker-CE의 Command 확인 

$ docker --help
Usage: docker [OPTIONS] COMMAND [arg...]

A self-sufficient runtime for linux containers.

Options:
  --api-cors-header=                   Set CORS headers in the remote API
  -b, --bridge=                        Attach containers to a network bridge
  --bip=                               Specify network bridge IP
  -D, --debug=false                    Enable debug mode
  -d, --daemon=false                   Enable daemon mode
  --default-ulimit=[]                  Set default ulimits for containers
  --dns=[]                             DNS server to use
  --dns-search=[]                      DNS search domains to use
  -e, --exec-driver=native             Exec driver to use
  --fixed-cidr=                        IPv4 subnet for fixed IPs
  --fixed-cidr-v6=                     IPv6 subnet for fixed IPs
  -G, --group=docker                   Group for the unix socket
  -g, --graph=/var/lib/docker          Root of the Docker runtime
  -H, --host=[]                        Daemon socket(s) to connect to
  -h, --help=false                     Print usage
  --icc=true                           Enable inter-container communication
  --insecure-registry=[]               Enable insecure registry communication
  --ip=0.0.0.0                         Default IP when binding container ports
  --ip-forward=true                    Enable net.ipv4.ip_forward
  --ip-masq=true                       Enable IP masquerading
  --iptables=true                      Enable addition of iptables rules
  --ipv6=false                         Enable IPv6 networking
  -l, --log-level=info                 Set the logging level
  --label=[]                           Set key=value labels to the daemon
  --log-driver=json-file               Containers logging driver
  --mtu=0                              Set the containers network MTU
  -p, --pidfile=/var/run/docker.pid    Path to use for daemon PID file
  --registry-mirror=[]                 Preferred Docker registry mirror
  -s, --storage-driver=                Storage driver to use
  --selinux-enabled=false              Enable selinux support
  --storage-opt=[]                     Set storage driver options
  --tls=false                          Use TLS; implied by --tlsverify
  --tlscacert=~/.docker/ca.pem         Trust certs signed only by this CA
  --tlscert=~/.docker/cert.pem         Path to TLS certificate file
  --tlskey=~/.docker/key.pem           Path to TLS key file
  --tlsverify=false                    Use TLS and verify the remote
  -v, --version=false                  Print version information and quit

Commands:
    attach    Attach to a running container       // 동작 중인 Container에 접속가능 (exec로도 가능)
    build     Build an image from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders from a container's filesystem to the host path // Container에서 생성된 정보를 가져올때 사용 
    create    Create a new container
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    exec      Run a command in a running container // 동작 중인 Container에 명령어 실행 (/bin/bash 를 이용하여 접속가능) 
    export    Stream the contents of a container as a tar archive
    history   Show the history of an image
    images    List images   // 현재 존재하는 Image List들을 확인 
    import    Create a new filesystem image from the contents of a tarball
    info      Display system-wide information
    inspect   Return low-level information on a container or image
    kill      Kill a running container
    load      Load an image from a tar archive
    login     Register or log in to a Docker registry server
    logout    Log out from a Docker registry server
    logs      Fetch the logs of a container
    port      Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
    pause     Pause all processes within a container
    ps        List containers   // 동작 중인 containers의 list 보여주며, name도 확인가능 
    pull      Pull an image or a repository from a Docker registry server // Image를 가져올때 사용 
    push      Push an image or a repository to a Docker registry server
    rename    Rename an existing container
    restart   Restart a running container
    rm        Remove one or more containers  // container 제거 
    rmi       Remove one or more images      // image 제거 
    run       Run a command in a new container // 처음 Container를 생성할 때 사용하는 명령
    save      Save an image to a tar archive
    search    Search for an image on the Docker Hub // Docker Hub에서 Image 검색 
    start     Start a stopped container
    stats     Display a stream of a containers' resource usage statistics  // Container의 HW 자원 확인 
    stop      Stop a running container
    tag       Tag an image into a repository
    top       Lookup the running processes of a container
    unpause   Unpause a paused container
    version   Show the Docker version information
    wait      Block until a container stops, then print its exit code



Docker 안쓰는 Image / Container 삭제
  http://www.kwangsiklee.com/2017/07/docker-%EC%95%88%EC%93%B0%EB%8A%94-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0/
  https://www.popit.kr/%ED%95%B4%EA%B2%B0%EB%B0%A9%EC%95%88-docker%EB%A5%BC-%EC%9A%B4%EC%98%81%ED%95%98%EB%8B%A4-%EC%9A%A9%EB%9F%89%EC%9D%B4-%EA%BD%89%EC%B0%BC%EC%9D%84%EB%95%8C/


$ cat /lib/systemd/system/docker.service  //docker server부분 설정 

$ sudo du -sh /var/lib/docker   // docker image 및 저장위치 인 것 같음 

$ ls /etc/docker/      // 각 설정, 현재 모름 
daemon.json  key.json    



  • MYSQL  세부저장 
  http://jibak.tistory.com/13?category=625389
  http://jibak.tistory.com/7


  • Docker 저장소 변경 
  https://kiros33.blogspot.kr/2015/05/docker.html


2.3 Docker Container의  Backup 과  Restore 방법 

Docker 기반으로 개발할 경우, Container의 Backup 과 Restore는 중요하며, 이부분은 별도로 테스트를 해서 검증을 해보며 써야 할 것  같다.
대부분 Container에서 부족한 부분은 본인 Terminal을 이용해서 설치도 가능하며, 이를 Backup 해서 본인만의 image를 새로 구축해도 될 것 같다. (배포도 가능)

commit 후에 save를 할때 tar 묶는 이유를 보면, docker가 하나의 image로 저장이 되지 않아서 인것 같다.
/var/lib/docker 으로 분산되어 존재하는 것 같은데,  추후에 자세히 알면 이 부분은 다시 분석

아래사이트 참고
  http://home.zany.kr:9003/board/bView.asp?bCode=13&aCode=14131&cBlock=0&cPageNo=1&sType=0&sString=
  https://digndig.kr/docker/709/


2.4 Docker File 만들기 

docker build를 이용하여 dokerfile을 쉽게 image로 만들 수 있으며, 대 부분은 기존의 Base Image가 존재하는 상태에서
본인 필요한 Package를 추가하는 형태로 새롭게 만들어나가는 구조로 사용하는 것 같다.

결과적으로 보면 Docker Container Backup 과 기존의 Image를 이용하여 Docker File을 새롭게 만들어서 구축하는 방법은 동일하다.
배포도 가능하며, 이 부분은 추후에 다시 동작을 해보도록 하자.

  • Docker File 만들기
DOCKERFILE , File을 만든 후 아래의 Link의 Command로 쉽게 구성할 수 있다. 
  https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
  https://medium.com/@NovaWoo/docker-%EC%99%80-jenkins-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-ci-1-9510178a525f


3. Simple Linux File System Download

우연히 발견한 사이트이지만,  가끔 Simple한 File system 구성이 필요할때가 있는데, 마침 찾았다.
예전처름 처음부터 package를 일일히 설치해가며 Filesystem을 구축을 해 만들필요는 없는것 같다.


  https://alpinelinux.org/downloads/