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