docker api指的是docker的應用程序接口,是軟件系統不同組成部分銜接的約定,docker主要有三大對外api:1、Docker Registry API;2、Docker Hub API;3、Docker Remote API。
本教程操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。
一、什么是API
1. API具體是什么?
API這個詞在維基百科里解釋是這樣的:應用程序接口(英語:application programming interface,縮寫作 API),又稱為應用編程接口,就是軟件系統不同組成部分銜接的約定。看完這個解釋估計你還是有點懵逼,不過沒關系,下面我們會用通俗的語言來介紹什么是API。
我們每個人都有手機,當手機沒電了我們肯定會找固定的充電器和充電線來充電。蘋果的用蘋果,安卓的用安卓。但是你肯定不會用安卓的線去充蘋果的手機,這道理很簡單,因為你的蘋果手機是Lightning 接口,安卓的是micro接口。你要想充電或者對你手機傳輸數據,那么必須買合適的充電線和數據線, 這是對于接口最簡單易懂的認識。
類似的,程序的接口也是如此。每個程序都有固定對外的標準接口,這個接口由開發這個程序的開發者定義的,你要想連接它們,那么就應該遵循它們的接口標準。
2. 什么是REST
現在學習API 經常看到一個詞叫REST,英文全稱是Representational State Transfer。那么什么是REST呢? REST一詞是Apache 基金會主席Roy Fielding博士提出來的,中文意思叫”表現層狀態轉化”。中文不太好理解,不過我們從下面幾個方面去認識你就大概能明白什么是rest。
2.1. 什么是表現層?
這里的表現層指的是資源的表現層,所謂”資源”,就是網絡上的一個具體信息。一個文本,一部電影,一個服務都可以算作一資源。那么這些資源用什么來確定和表現呢?那就得用到URI,比如我們下載一個電影,肯定有對應的URI地址,我們看一部網絡小說,也有對應的URI地址。而且這個地址是唯一的,獨一無二的。資源用URI標識了,我們可以理解為這個資源已經在網絡上“表現”了。所以說到這里,表現層的意思其實就是把”資源”具體呈現出來的形式。
2.2. 什么是狀態轉化?
常識里,我們要把一物體發生狀態改變,肯定需要一些操作和手段。網絡上的資源也是如此,你下載一部電影,首先得下載,然后才能打開欣賞。下載獲取都需要走HTTP協議,HTTP協議里面,四個基本的操作方式:GET、POST、PUT、DELETE(獲取,新建,更新,刪除)。通過這基本的四種方法可以對網絡上的資源進行一些狀態轉化操作。
所以,REST 就是表現層的狀態轉化,大家分開理解上面兩點然后結合在一起就明白了。簡單粗暴的可以理解為:方法 + URI資源。
GET /movie/war/珍珠港
DELETE /movie/war/珍珠港
…
二、Docker API種類
docker 的api也遵循rest的風格,因此我們了解了上面兩點后,我們開始學習docker本身api的相關知識。
首先,我們把docker當作一種資源,我們可以通過api來對docker進行操作,操作的方法也是http的那幾種方法。
其次,我們要了解docker有哪些對外可使用的api,這里docker官方主要有三大對外api
- Docker Registry API
- Docker Hub API
- Docker Remote API
1. Docker Registry API
這個是docker鏡像倉庫的api,通過操作這套API,你可以自由的自動化、程序化的管理你的鏡像倉庫。
2. Docker Hub API
Docker Hub API是用戶管理操作的API,docker hub是使用校驗和公共 namespaces 的方式來存儲賬戶信息、認證賬戶、進行賬戶授權。API同時也允許操作相關的用戶倉庫和 library 倉庫。
3. Docker Remote API
這套API用于控制主機 Docker 服務端的 API,等價于 docker命令行客戶端。 有了它,你能遠程操作docker容器,更重要的是你可以通過程序自動化運維docker進程。
三、API使用前準備
前面我們說過,操作rest api用的就是http的那些方法。那么具體怎么使用這些方法呢?這里我們提供幾種通用的方式來操作調用下docker 的API,然后體驗下。在體驗之前,我們需要開啟docker rest api,不然沒開啟,你是不能用的。具體開啟的方法:
$?vim?/usr/lib/systemd/system/docker.service
在 ExecStart=/usr/bin/dockerd 后面直接添加 -H tcp://0.0.0.0:8088 -H unix:///var/run/docker.sock (注意端口8088自己隨便定義,別跟當前的沖突即可)
$?systemctl?daemon-reload $?systemctl?restart?docker
重啟完成后,我們執行 curl 127.0.0.1:8088/info | python -mjson.tool 命令即可查看docker的狀態狀態(json形式,python -mjson.tool借用了這個工具,這樣讓json格式化,好閱讀)
啟用了docker API后,我們還有個問題,那就是在哪查詢docker 現有的API?既然docker提供了那3大API庫:Docker Registry API、Docker Hub API、Docker Remote API。那么在哪里可以查看具體詳細的API,比如Docker Registry API 下面到底有哪些API地址?有查詢鏡像的API嗎?有刪除的嗎?其實這些都有的,我們可以直接去官網API手冊里查看即可,地址就是:https://docs.docker.com/engine/api/v1.38/ (想看什么版本的把最后的v1.38 替換成目標版本號即可)
這里要注意的是,官方不再建議使用API v1.12之前的版本,建議使用v1.24 or 更高的版本。
查看本地docker API版本可以用 docker version 命令:
四、如何操作docker API
1. 最簡單的curl方式
CURL這個命令,我想大家都熟悉,默認linux下都自帶安裝。很多測試http的方法都可以直接使用 CURL的方式。
比如我們查看docker的images詳細信息,就可以直接用curl 來調取:
?$?curl?-X?GET?http://127.0.0.1:8088/images/json
這樣顯示會比較錯亂無章,我們可以在命令后面加個 python -mjson.tool 格式化下
$??curl?-X?GET?http://127.0.0.1:8088/images/json?|?python?-mjson.tool
這樣的結果格式就比較標準化,比較容易閱讀。
查看所有containers容器:
$?curl?-X?GET?http://127.0.0.1:8088/containers/json?|?python?-mjson.tool
創建一個containers容器:
這里創建一個mariadb數據庫的容器,設置了密碼是123456,監聽端口是3306
$?curl?-X?POST?-H?"Content-Type:?application/json"?-d?'{ ????"Image":?"mariadb", ????"Env":?["MYSQL_ROOT_PASSWORD=123456"], ????"ExposedPorts":?{ ????????"3306/tcp":?{} ????}, ????"HostConfig":?{ ????????"PortBindings":?{ ????????????"3306/tcp":?[{"HostIp":?"","HostPort":?"3306"}] ????????} ????}, ????"NetworkSettings":?{ ????????"Ports":?{ ????????????"5000/tcp":?[{"HostIp":?"0.0.0.0","HostPort":?"3306"}] ????????} ????} }'?http://127.0.0.1:8088/containers/create
啟動/停止/重啟 一個containers容器:
$ curl -X POST http://127.0.0.1:8088/containers/{id}/start (注意這里是POST方法) $ curl -X POST http://127.0.0.1:8088/containers/{id}/stop (注意這里是POST方法) $ curl -X POST http://127.0.0.1:8088/containers/{id}/restart (注意這里是POST方法) ...
具體還有很多API方法,大家都可以登錄上面提到的鏈接進行查看
https://docs.docker.com/engine/api/v1.38
2. python程序腳本方式
python 非常強大,這個大家都認可。現在很多自動化場景都是通過python加載第三方對應的庫,然后編寫業務邏輯自動化方式devops運維。docker給python也提供了一個非常強大的庫,名字就叫做docker。我們可以登錄官方的python sdk地址來學習認識python如何具體操作docker。
地址是:https://docker-py.readthedocs.io/en/stable/
2.1. 安裝docker python庫
$ pip install docker
2.2. 開始使用
import?docker client?=?docker.DockerClient(base_url='unix://var/run/docker.sock',?version="auto") client.containers.run("ubuntu",?"echo?hello?world")
這是一個很簡單的使用例子,我們可以分析下:
第一行表示引入第三方庫docker。
第二行用于配置Docker服務端的基本信息,包含了base_url(Docker服務端的地址)以及version(auto可以自動檢查docker的版本)。
第三行則是相當于運行了一個docker run ubuntu echo hello world的命令。
2.3. 進階使用
import?docker client?=?docker.DockerClient(base_url="tcp://ip:port") client.images.list()???????#?類似docker?images命令,顯示image的信息列表 client.containers.list()???????#??類似docker?ps命令 client.containers.list(all=True)???????#?類似docker?ps?-a命令 container?=?client.containers.get(container_id)???????????#?獲取daodocker容器,這里container_id?是你要輸入的具體容器id container.start()????????????#?類似docker?start?傳入具體的容器id?,開啟容器
總結: 現在很多企業都已經步入自動化運維時代了,所以掌握api的運用技巧和法則是非常有必要的。上面我們大概介紹了下docker api的入門,其實你要玩得非常好,這里有很大的靈活性和復雜性,不過這里就需要你一些腳本編程方面的知識了。
推薦學習:《docker視頻教程》