2018年1月4日 星期四

Docker

Docker - Build, Ship, and Run Any App, Anywhere
透過對應用程式的封裝(Packaging)、分派(Distribution)、部署(Deployment)、運行(Runtime)
生命週期進行管理,達到應用系統元件一次封裝,隨處運行」的目標
這裡的應用系統元件,即可以是一個Web應用一套編譯環境
也可以是整套資料庫平台服務甚至是一個作業系統或叢集



Container VS Virtual Machine Docker以及其他容器技術都屬於作業系統及虛擬化。核心透過建立多個虛擬的作業系統實例
(Instances,包含應用程式和相關函式庫)來隔離不同的程序
Docker問世的目的,不只是為了讓應用程式可以到處部署,還希望可以比VM更善用系統資源,
不要再透過一層Guest OS來執行程式碼。


=========================================================
基本概念與安裝設定
Docker三大核心概念: 映像檔(Image), 容器(Container), 倉庫(Repository)
(1) Docker映像檔類似虛擬機映像檔,可以包含一個基本的作業系統環境,
裡面僅安裝了Apache應用程式(或使用者需要的其他軟體)。可以把它稱為一個Apache映像檔

(2) Docker容器類似一個輕量級的沙箱(sandbox),Docker利用容器來運行和隔離應用。
容器是用映像檔所創造的執行實例(Instance)。可以將其建立、開始、停止、刪除,
每個容器內運行著一個應用程式,不同的容器相互隔離容器之間也可透過網路互相溝通。
可以把容器看作是一個簡易版的Linux系統環境(包括root使用者權限、
PID Namespace程序命名空間、User Namespace使用者空間和Network Namespace網路)

(3) Docker倉庫類似於程式碼儲存庫,它是Docker集中存放映像檔的場所
倉庫註冊伺服器是存放倉庫的地方,上面往往存放著多個倉庫
每個倉庫集中存放某一類映像檔,通常包括多個映像檔,透過不同的tag來進行區分
例如存放Ubuntu作業系統映像檔的倉庫,稱為Ubuntu倉庫,其中可能包括14.04、12.04
等不同版本的映像檔

私有倉庫代管服務:
=========================================================
//Get Docker Community Edition (CE) for Ubuntu Trusty 14.04
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
$ sudo apt-get update
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
     Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
sudo apt-get install docker-ce
$ sudo docker run hello-world

$ sudo docker version
Client:
 Version: 17.12.0-ce
 API version: 1.35
 Go version: go1.9.2
 Git commit: c97c6d6
 Built: Wed Dec 27 20:10:36 2017
 OS/Arch: linux/amd64

Server:
 Engine:
  Version: 17.12.0-ce
  API version: 1.35 (minimum version 1.12)
  Go version: go1.9.2
  Git commit: c97c6d6
  Built: Wed Dec 27 20:09:12 2017
  OS/Arch: linux/amd64
  Experimental: false

將目前使用者加入到安裝時自動建立的docker用戶群組
$ sudo usermod -aG docker bh0322

$ sudo service docker start
start: Job is already running: docker
$ sudo service docker status
docker start/running, process 84943
$ ps aux | grep 84943
root      84943  0.1  0.0 1353696 62024 ?       Ssl  10:20   0:01 /usr/bin/dockerd --raw-logs

$ sudo service docker restart
docker stop/waiting
docker start/running, process 67438

/etc/default/docker
/etc/init.d/docker
/var/run/docker.pid
/etc/init/docker.conf
/var/log/upstart/docker.log
=========================================================
Pull an image or a repository from a registry
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags=true|false                Download all tagged images in the repository (default false)
$ docker pull ubuntu:14.04
= docker pull registry.hub.docker.com/ubuntu:14.04
14.04: Pulling from library/ubuntu
050aa9ae81a9: Pull complete
1eb2c989bc04: Pull complete
f5e83780ccda: Pull complete
2dec31d7323c: Pull complete
286f32949bdc: Pull complete
Digest: sha256:084989eb923bd86dbf7e706d464cf3587274a826b484f75b69468c19f8ae354c
Status: Downloaded newer image for ubuntu:14.04
Image一般由數個資料層所組成,050aa9ae81a9這樣的字串是資料層唯一的ID
(實際上完整的ID包括256bits,由64個十六進制字元所組成)

$ docker pull gcr.io/tensorflow/tensorflow:latest-gpu

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 00fd29ccc6f1 3 weeks ago 111MB ubuntu 14.04 67759a80360c 3 weeks ago 221MB gcr.io/tensorflow/tensorflow latest-gpu 12cea85b0ad7 4 weeks ago 3.36GB hello-world latest f2a91732366c 7 weeks ago 1.85kB
=========================================================
Run a command in a new container
   docker run [OPTIONS] IMAGE [COMMAND] [ARG...] [flags]
$ docker run -it gcr.io/tensorflow/tensorflow:latest-gpu bash
$ docker run -it ubuntu:14.04 bash

List containers
   docker ps [OPTIONS]
$ docker ps  (--no-trunc)
CONTAINER ID  IMAGE          COMMAND  CREATED                STATUS           PORTS               NAMES
d4cf3b40d12c   ubuntu:14.04  "bash"         About a minute ago  Up 59 seconds              compassionate_mirzakhani

Run a command in a running container
   docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
$ docker exec -it compassionate_mirzakhani bash

Display a live stream of container(s) resource usage statistics
   docker stats [OPTIONS] [CONTAINER...]
$ docker stats compassionate_mirzakhani
=========================================================

docker build -t goapp

$ docker search dpdk

$ docker pull brain4net/dpdk

$ docker build [OPTIONS] PATH | URL | - [flags]

簡單更新管理
使用Dockerfile,只需要小小的修改設定,就可以取代以往大量的更新工作。並且所有修改都以堆疊的方式進行派送和更新,進而實現自動化並且高效率的容器管理
Docker三劍客: Machine, Compose, Swarm
chroot -> Linux Container (LXC) -> Docker
導入Docker的關鍵是在軟體開發流程,而非技術或系統層面
Google推出Kubernetes (K8s)
Mesos, CoreOS
Azure PaaS
Azure Container Registry
CI/CD pipeline
Azure
AWS EC2 Container

【Docker通吃全平臺秘密武器】容器專屬超迷你OS包LinuxKit登場
LinuxKit是一個全容器化的超迷你Linux環境,目標是在任何OS中建立執行容器的環境,這正是Docker打通Linux和Windows壁壘的關鍵
Unikernel結合容器技術實作出LinuxKit專案,透過LinuxKit打造自己專屬的Linux Kernel
只包含執行該平台的必要元件,元件皆由容器所組成,可迅速移除替換,並適用於各種不同的環境

Q:Docker如何實現Container標準化?
A:Docker採用了aufs檔案系統來設計一個可以層層堆疊的Container映象檔,將Container內的所有程式(包括應用程式、相關函式庫、設定檔),都打包進Docker映象檔,並且提供了一個Dockerfile設定檔來記錄建立Container過程的每一個步驟包括參數。只要在任何支援Docker平臺的環境中,就可以從這個映象檔來建立出一個一模一樣的Container來執行同一個應用程式。如此一來,應用程式等於是可以透過Docker映象檔,或甚至只需要Dockerfile,就能將程式執行環境帶著走,移動到任何支援Docker的環境中。


Q:一個Container映象檔內可以安裝多少應用程式?
A:一個Container的映象檔內可以安裝多支程式,例如同時安裝Ubuntu、Apache、MySQL、Node.js、Ruby等。不過,Docker官方建議,一隻程式安裝在一個Container內,再把這些Container疊起來提供一個完整的服務。
Docker稱這是一種Microservices(微服務)的新軟體架構,將組成一個應用系統的每一個Stack,拆解成許多小型服務,例如Apache服務、MySQL服務、Node.js服務、Ruby服務,每一個服務都是包在Container裡的一隻程式,例如MySQL服務就是部署在Container內的MySQL。

這麼做的好處是可以建立一個鬆散耦合的彈性應用程式架構,也能輕易地抽換其中一個Container,例如要升級MySQL,只需要重新載入新版MySQL的Container映象檔,就可以完成資料庫升級,不用將整套應用系統停機。

Q:Docker對Devops有何幫助?
A:因為Docker透過Dockerfile來記錄建立Container映象檔的每一個步驟,
可以將建立應用程式執行環境的過程和配置參數,完整地記錄下來。
開發人員和維運人員之間可以利用Dockerfile來溝通對執行環境的討論。
甚至結合版本控制服務如GitHub,可以讓Dockerfile具備版本控制功能,
能將基礎架構程式化(Infrastructure as code)來管理。

Reference
https://docs.docker.com/engine/reference/commandline/stats/
https://www.gitbook.com/book/yeasy/docker_practice/details

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build        Build an image from a Dockerfile
  commit    Create a new image from a container's changes
  cp           Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff          Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history      Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info          Display system-wide information
  inspect     Return low-level information on Docker objects
  kill           Kill one or more running containers
  load         Load an image from a tar archive or STDIN
  login        Log in to a Docker registry
  logout      Log out from a Docker registry
  logs         Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port         List port mappings or a specific mapping for the container
  ps            List containers
  pull          Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename    Rename a container
  restart     Restart one or more containers
  rm           Remove one or more containers
  rmi          Remove one or more images
  run          Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start        Start one or more stopped containers
  stats        Display a live stream of container(s) resource usage statistics
  stop         Stop one or more running containers
  tag          Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top          Display the running processes of a container
  unpause   Unpause all processes within one or more containers
  update     Update configuration of one or more containers
  version     Show the Docker version information
  wait         Block until one or more containers stop, then print their exit codes

$ sudo curl -sSL https://get.docker.com | sh
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ lsb_release -c
Codename: trusty
$ sudo vim /etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo ubuntu-trusty main
$ sudo apt-get install docker.io

// Uninstall old versions
$ sudo apt-get remove docker docker-engine docker.io

沒有留言:

張貼留言