前幾天在介紹如何使用 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 步驟如下:
/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 之後要注意安全性的問題。
# systemctl restart docker
二. 操作 Docker 提供的Restful API 功能
以下操作 Restful API 的方式是透過 Linux 的 curl 指令以及透過 Web Browser。另外也可以使用 postman。
$ curl -X POST http://192.168.182.130:2375/images/create?fromImage=nginx:latest
這裡是要使用Restful API pull nginx 的 Docker Image
執行畫面如下
執行畫面如下
$ 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
執行畫面如下
curl -X POST http://192.168.182.130:2375/containers/nginx_container/start
nginx_container 為 Container Name
執行畫面如下
執行畫面如下
$ 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
大大可否請問一下 我碰到一個問題如下
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無法連接,但我防火牆都關掉了
懇請大大指點迷津
官方網站有解答 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了