Docker

Docker是輕量級的虛擬化解決方案,使用container的技術,類似虛擬機技術,但不用像虛擬機在多準備Guest OS

架構比較

Virtural Machine 架構:Host OS | Hypervisor | Guest OS | bins/libs | APP1
Docker 架構:Host OS | Docker Enginer | bins/libs | APP1

優點:

一次建立或設定,可以在任意地方正常執行
核心層級的虛擬化,所以不需要額外的虛擬化支援,因此可以實作更高的效能和效率

運作Docker的三個重要元件

  • 映像檔(Image)
  • 容器(Container)
  • 倉庫(Repository)

Docker Image 

就是一個唯讀的模板,裡面僅安裝使用者需要的應用程式

Docker Container

  •  從映像檔建立的執行實例,Docker 利用Container來執行應用
  •  Container可以被啟動、開始、停止、刪除 
  •  每個Container都是相互隔離的環境

Docker Repository

集中存放映像檔的場所,概念跟 Git 類似,分為

  •   Public:Docker Hub(最大的公開倉庫),Docker Pool(大陸的公開倉庫) 
  •   Private:使用者也可以在本地網路內建立一個私有倉庫

安裝與啟動

以下以centos為例

sudo yum install docker 
sudo systemctl start docker

Docker image

列出本機上的docker image

$ sudo docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB
ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB
ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB
ubuntu           trusty   99ec81b80c55  4 weeks ago  266 MB

說明

REPOSITORY: 來自於哪個倉庫,比如 ubuntu

TAG : 映像檔的標記,用來標記來自同一個倉庫的不同映像檔,如果沒有指定 TAG,預設使用 latest

IMAGE ID:image的唯一ID 號,具有相同的映像檔 ID,說明它們實際上是同一映像檔,例如 ubuntu:14.04 和 ubuntu:trusty

CREATED: 建立時間

VIRTUAL SIZE:映像檔大小


從docker hub取得和上傳

在docker hub尋找需求的image

$sudo docker search ubuntu

從Docker Hub 取得已有映像檔

$sudo docker pull ubuntu:12.04

$sudo docker pull registry.hub.docker.com/ubuntu:12.04

把image上傳到Docker Hub 

$sudo docker push ubuntu:12.04


從本地取得和載入

儲存本地端image

$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

載入本地端image

$sudo docker load --input ubuntu_14.04.tar

$sudo docker load < ubuntu_14.04.tar

ps:

從本機匯入一個映像檔

$sudo cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:14.04


建立自己的Docker image

利用 Dockerfile 建立映像檔

修改已有映像檔

docker commit  [ paramater ] < container id> < image name>

舉例如下

$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
root@0b2616b0e5a8:/# gem install json  #在容器中加入 json 的 gem 套件。

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

$ sudo docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

ps: -m 指定提交的說明信息


刪除本地端image

sudo docker rmi training/sinatra

ps:

在刪除docker image之前要先用 docker rm 刪掉依賴於這個映像檔的所有container 


Docker container

基本docker管理命令

docker start <container> 重新啟動container

docker stop <container> 終止一個執行中的container

docker rm <container> 刪除一個處於終止狀態的容器

docker ps   查看容器訊息  

docker ps -a  檢視終止狀態的容器 

docker top  查看 Container Process


使用image啟動container

#docker run [parameter] < image>  

parameter說明如下
-it: 互動模式,會有訊息顯示出來
-d:把 container 執行在背景裡,不會有訊息顯示出來
–rm 跑完後刪除
–name < contain name>  指定啟動的docker叫什麼名字
-e 傳送系統變數進docker
-v 設定共享目錄
-p: 做 port 的mapping,container裡的port 80 mapping 到 host 的8080 port
bash: 啟動docker後不執行預設的啟動script

常見範例如下

輸出一個 “Hello World”

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

啟動一個 bash

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

背景執行docker 

$ sudo docker run -d

基本的執行

# docker run -it usex/project:0.1

docker離開後即刪除容器

# docker run -it --rm usex/project:0.1

docker與本機端開啟公享目錄

# docker run -it -v /local_share_dir/:/docker_dir/ usex/project:0.1

本機端傳送系統變數進Docker

# docker run -it -e sysName=”TEST” usex/project:0.1

啟動docker後不執行預設的啟動script

#docker run [parameter] < image>  bash

舉例來說,啟動docker後不執行dockerfile定義的script # docker run -it usex/project:0.1 bash

ps:
如要使用bash,在dockerfile裡面要設定CMD [“sh”]


進入container

方法1

使用容器內的指令 docker exec 

透過bash指令操作container,舉例如下

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$sudo docker exec -ti nostalgic_hypatia bash
root@243c32535da7:/#

直接使用container內的指令,舉例如下

docker exec -it debian:latest /bin/bash

docker exec -it debian:latest /sbin/ifconfig

方法2

進入容器可用docker attach

舉例如下

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

按下 ctrl + P 然後 ctrl + Q 跳離容器,讓它繼續在背景執行。

refer
https://philipzheng.gitbooks.io/docker_practice/content


docker瘦身

檢視資料使用狀況

#docker system df

#docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              11                  0                   7.319 GB            7.319 GB (100%)
Containers          0                   0                   0 B                 0 B
Local Volumes       0                   0                   0 B                 0 B

刪除所有不用的image,container,volumne

#docker system prune

删除没用的 image

#docker rmi $(docker images -f "dangling=true" -q)

删除 exited container

#docker rm -v $(docker ps -a -q -f status=exited)

删除没用的 volumn

#docker volume rm $(docker volume ls -qf dangling=true)

日志太大,刪除container 日志

#docker stop <container_id>
#rm /var/lib/docker/containers/<container_id>/<container_id>-json.log

refer
https://www.fengzifz.com/2017/03/27/clean-docker