iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
0
DevOps

用30天來介紹和使用 Docker系列 第 13

Day13:如何使用 Docker Restful API

前幾天在介紹如何使用 Docker 的 command line 在操作 Docker Container。Docker 另外也有提供 Restful API 的功能方便我們去使用,這樣的好處是不管我們是寫任何的程式語言就可以方便的透過 Restful API 去執行 Docker Container。

像是如果要在我們的測試程式中建立一個 Data Base 測試環境,就可以透過呼叫 Docker 的 Restful API,建立 Data Base 的 Container,等到測試執行完成之後就呼叫 Restful API 把 Data Base 的 Container 刪除掉。這也就是使用 Docker 在執行建構測試環境的方便性,也就不用另外的去架設和管理 Data Base 的 Service 測試環境,這樣也就可以提高工作的效率。

今天就介紹如何的來使用 Docker Restful API 的功能

一.使用 Docker Restful API 之前需要設定 Docker 步驟如下:

  1. 修改 /etc/docker/daemon.json 的設定檔,如下
# vi /etc/docker/daemon.json

設定如下

{
  "live-restore": true,
  "group": "dockerroot",
  "insecure-registries": ["192.168.182.130:5000"],
  "hosts": [
     "unix:///var/run/docker.sock",
     "tcp://192.168.182.130:2375"
  ]
}

主要是要把 tcp 的連線 port 打開,這樣外面的 host 才能連到此 Host 的 docker service,但開了 2375 的 port 之後要注意安全性的問題。

  1. 重新啟動 Docker Service,指令如下
# systemctl restart docker

二. 操作 Docker 提供的Restful API 功能
以下操作 Restful API 的方式是透過 Linux 的 curl 指令以及透過 Web Browser。另外也可以使用 postman。

  1. 從Docker Hub 上 pull,Docker Image 的 Restful API 如下
$ curl -X POST http://192.168.182.130:2375/images/create?fromImage=nginx:latest

這裡是要使用Restful API pull nginx 的 Docker Image

執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171216/20103456SMceAY8eP2.png

  1. 顯示目前有哪些的 Docker Image 的 Restful API 如下
    到 Browser 輸入以下的 URL
    http://192.168.182.130:2375/images/json

執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171216/20103456mxFMoGDvWU.png

  1. 建立 Docker Container 的 Restful API 如下
$ curl -H "Content-Type: application/json" -d '{"Image": "nginx","HostConfig":{"PortBindings": {"80/tcp": [{"HostPort": "8080"}]}}}'  http://192.168.182.130:2375/containers/create?name=nginx_container

這個 Restful API 這主要的設定是要把 Container 的 80 port mapping 到實體 host的8080 port,另外 container 的 name 為 nginx_container

執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171216/20103456H8DYa3uW7x.png

  1. 執行 Docker Container 的 Restful API 如下
curl -X POST http://192.168.182.130:2375/containers/nginx_container/start

nginx_container 為 Container Name

執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171216/201034561x8imxrvLf.png

  1. 顯示有執行了哪些 Docker Container 的 Restful API 如下
    在 Browser 輸入以下的 URL
    http://192.168.182.136:2375/containers/json

執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171216/20103456KDIL4e9gI6.png

  1. 刪除 Docker Container 的 Restful API 如下:
$ curl -X POST http://192.168.182.130:2375/containers/nginx_container/stop
$ curl -X DELETE http://192.168.182.130:2375/containers/nginx_container

Docker 提供的 Restful API 還有很多沒有被介紹到,如果有興趣的話可以參考 Docker 官方網站所提供的說明文件,網址如下:
https://docs.docker.com/engine/api/v1.24/#31-containers


上一篇
Day12:介紹執行 Docker Container 常用到的指令(二)
下一篇
Day14:使用 third party 的 Jar 呼叫 Docker Restful API
系列文
用30天來介紹和使用 Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
dgullou
iT邦新手 5 級 ‧ 2019-02-20 14:11:32

大大可否請問一下 我碰到一個問題如下
pc1(192.168.59.122)為Docker Registry Server有執行docker run -d -p 5000:5000 -v /home/dgullou/storage:/var/lib/registry --name registry registry:2

pc2的daemon.json如下
{
"live-restore": true,
"group": "dockerroot",
"insecure-registries": ["192.168.59.122:5000"],
"hosts": [
"unix:///var/run/docker.sock",
"tcp://192.168.59.122:2375"
]
}
但為何我restart docker service的時候會出現錯誤
Feb 20 11:03:11 centos7.oz.com systemd[1]: Starting Docker Application Container Engine...
Feb 20 11:03:11 centos7.oz.com dockerd-current[5484]: time="2019-02-20T11:03:11.067875018+08:00" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOU...OING [!]"
Feb 20 11:03:11 centos7.oz.com dockerd-current[5484]: listen tcp 192.168.59.122:2375: bind: cannot assign requested address
Feb 20 11:03:11 centos7.oz.com systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Feb 20 11:03:11 centos7.oz.com systemd[1]: Failed to start Docker Application Container Engine.
Feb 20 11:03:11 centos7.oz.com systemd[1]: Unit docker.service entered failed state.
Feb 20 11:03:11 centos7.oz.com systemd[1]: docker.service failed.

如果拿掉下列這串就可以正常啟動
"hosts": [
"unix:///var/run/docker.sock",
"tcp://192.168.59.122:2375"
]

感覺像是pc1的tcp無法連接,但我防火牆都關掉了
懇請大大指點迷津

xmlredice iT邦新手 5 級 ‧ 2020-03-26 15:32:55 檢舉

官方網站有解答 USE THE HOSTS KEY IN DAEMON.JSON WITH SYSTEMD
新增 /etc/systemd/system/docker.service.d/docker.conf
內容為

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

就可以正常systemctl start docker了

/images/emoticon/emoticon41.gif

我要留言

立即登入留言