日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker的/var/run/docker.sock参数

發(fā)布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker的/var/run/docker.sock参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關于/var/run/docker.sock參數(shù)

在創(chuàng)建docker容器時,有時會用到/var/run/docker.sock這樣的數(shù)據(jù)卷參數(shù),例如以下docker-compose.yml,可以看到kafka容器的數(shù)據(jù)卷參數(shù)帶有/var/run/docker.sock

version: '2' services:zookeeper:container_name: zookeeperimage: wurstmeister/zookeeperports:- "2181:2181"kafka:container_name: kafkaimage: wurstmeister/kafka:2.11-0.11.0.3ports:- "9092"environment:KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://:9092KAFKA_LISTENERS: PLAINTEXT://:9092KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181volumes:- /var/run/docker.sock:/var/run/docker.sock

本文要聊的就是這個/var/run/docker.sock參數(shù)。


注:關于上述docker-compose.yml的作用和相關實戰(zhàn),請參考《kafka的Docker鏡像使用說明(wurstmeister/kafka)》;

預備知識

搞清楚/var/run/docker.sock參數(shù)的前提是了解docker的client+server架構(gòu),如下是執(zhí)行docker version命令的結(jié)果:

[root@minikube ~]# docker version Client:Version: 1.13.1API version: 1.26Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64Go version: go1.10.3Git commit: b2f74b2/1.13.1Built: Wed May 1 14:55:20 2019OS/Arch: linux/amd64Server:Version: 1.13.1API version: 1.26 (minimum version 1.12)Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64Go version: go1.10.3Git commit: b2f74b2/1.13.1Built: Wed May 1 14:55:20 2019OS/Arch: linux/amd64Experimental: false

可見在電腦上運行的docker由client和server組成,我們輸入docker version命令實際上是通過客戶端將請求發(fā)送到同一臺電腦上的Doceker Daemon服務,由Docker Daemon返回信息,客戶端收到信息后展示在控制臺上,來自stack overflow的架構(gòu)圖如下:

做好了準備工作就可以進入正題了。

官方解釋

從下面這個官方文檔看起,地址是:https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#description

上圖是Docker Daemon的配置參數(shù),紅框處可見daemon默認監(jiān)聽的是/var/run/docker.sock這個文件,所以docker客戶端只要把請求發(fā)往這里,daemon就能收到并且做出響應。

按照上面的解釋來推理:我們也可以向/var/run/docker.sock發(fā)送請求,也能達到docker ps、docker images這樣的效果;

好吧,來試試!

向Docker Daemon發(fā)送請求

為了驗證Docker Daemon可以通過/var/run/docker.sock接收請求,我們用curl命令來驗證,測試環(huán)境如下:

  • 操作系統(tǒng):CentOS Linux release 7.6.1810
  • Docker: 1.13.1
  • 接下來開始動手驗證:

  • 執(zhí)行docker image命令看本地有哪些鏡像:
  • [root@centos7 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/tomcat 8.5.42-jdk8-openjdk-slim d9f443abac03 7 days ago 286 MB docker.io/nginx 1.16.0-alpine ef04b00b089d 6 weeks ago 20.4 MB

    可見有tomcat和nginx兩個鏡像;
    2. 執(zhí)行docker ps命令看本地有哪些正在運行的容器:

    [root@centos7 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37df022f2429 docker.io/tomcat:8.5.42-jdk8-openjdk-slim "catalina.sh run" 7 minutes ago Up 7 minutes 8080/tcp tomcat

    可見只運行了一個tomcat容器;
    3. 執(zhí)行以下命令,可以直接發(fā)http請求到Docker Daemon,獲取本地鏡像列表,等同于docker image

    curl -s --unix-socket /var/run/docker.sock http:/images/json

    收到的響應是JSON,格式化后如下所示,可見通過/var/run/docker.sock向Docker Daemon發(fā)送請求是沒有問題的:

    [{"Containers": -1,"Created": 1560552952,"Id": "sha256:d9f443abac03d29c12d600d5e65dbb831fb75d681ade76a541daa5ecfeaf54df","Labels": null,"ParentId": "","RepoDigests": ["docker.io/tomcat@sha256:aa736d24929d391d98ece184b810cca869a31312942f2b45309b9acd063d36ae"],"RepoTags": ["docker.io/tomcat:8.5.42-jdk8-openjdk-slim"],"SharedSize": -1,"Size": 286484547,"VirtualSize": 286484547},{"Containers": -1,"Created": 1557535081,"Id": "sha256:ef04b00b089d1dc0f8afe7d9baea21609ff3edf91893687aed0eec1351429ff6","Labels": {"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"},"ParentId": "","RepoDigests": ["docker.io/nginx@sha256:270bea203d2fc3743fb9ce0193325e188b7e6233043487e3d3cf117ea4d3f337"],"RepoTags": ["docker.io/nginx:1.16.0-alpine"],"SharedSize": -1,"Size": 20421143,"VirtualSize": 20421143} ]
  • 執(zhí)行以下命令,可以直接發(fā)http請求到Docker Daemon,獲取運行中的容器列表,等同于docker ps
  • curl -s --unix-socket /var/run/docker.sock http:/containers/json

    收到的響應是JSON,格式化后如下所示:

    [{"Id": "37df022f242924526750cda7580edb487085f9acde0ae65e2cebc7529fb02d5d","Names": ["/tomcat"],"Image": "docker.io/tomcat:8.5.42-jdk8-openjdk-slim","ImageID": "sha256:d9f443abac03d29c12d600d5e65dbb831fb75d681ade76a541daa5ecfeaf54df","Command": "catalina.sh run","Created": 1561172541,"Ports": [{"PrivatePort": 8080,"Type": "tcp"}],"Labels": {},"State": "running","Status": "Up 18 minutes","HostConfig": {"NetworkMode": "default"},"NetworkSettings": {"Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "4509fb8eabe34dc61145284a637f138c2b734683749e590be878afb1763f07a9","EndpointID": "ebb5de894f92c36a88aa01f785be4b4782723c565e1628ea77bccf7a9c32017a","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02"}}},"Mounts": []} ]
  • 更多與Docker Daemon交互的請求信息請參考官方文檔:https://docs.docker.com/engine/api/v1.39 ,信息很全面,如下圖:

    至此,我們對docker的client、server架構(gòu)有了清楚的認識:Docker Daemon相當于一個server,監(jiān)聽來自/var/run/docker.sock的請求,然后做出各種響應,例如返回鏡像列表,創(chuàng)建容器。
  • 順便搞清楚一個常見問題

  • 有個常見的問題相信大家都遇見過,執(zhí)行docker命令時控制臺報錯如下:
  • [root@centos7 ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    此時的您一定很清楚問題原因了:Docker Daemon服務不正常,所以客戶端發(fā)送請求得不到響應
    2. 用systemctl status docker命令看看Docker Daemon狀態(tài),應該是停止或報錯:

    [root@centos7 ~]# systemctl status docker ● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: inactive (dead) since 六 2019-06-22 11:45:14 CST; 3min 58s agoDocs: http://docs.docker.comProcess: 9134 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=0/SUCCESS)Main PID: 9134 (code=exited, status=0/SUCCESS)
  • 如果是停止狀態(tài),執(zhí)行systemctl start docker啟動服務即可,如果是錯誤就要case by case去分析了。
  • 開篇問題

    再回到文章開篇處的問題,啟動容器時的數(shù)據(jù)卷參數(shù)"/var/run/docker.sock:/var/run/docker.sock"有什么用?相信您已經(jīng)猜到了:

    宿主機的/var/run/docker.sock被映射到了容器內(nèi),有以下兩個作用:

  • 在容器內(nèi)只要向/var/run/docker.sock發(fā)送http請求就能和Docker Daemon通信了,可以做的事情前面已經(jīng)試過了,官方提供的API文檔中有詳細說明,鏡像列表、容器列表這些統(tǒng)統(tǒng)不在話下;
  • 如果容器內(nèi)有docker文件,那么在容器內(nèi)執(zhí)行docker ps、docker port這些命令,和在宿主機上執(zhí)行的效果是一樣的,因為容器內(nèi)和宿主機上的docker文件雖然不同,但是他們的請求發(fā)往的是同一個Docker Daemon;
  • 基于以上結(jié)論,開篇問題中的鏡像wurstmeister/kafka:2.11-0.11.0.3既然用到了/var/run/docker.sock參數(shù),那么該容器應該會向Docker Daemon發(fā)送請求,接下來我們嘗試著分析一下,看看能否證實這個推測;

    證實推測

  • 去鏡像的官網(wǎng)找到容器啟動時自動執(zhí)行的腳本 start-kafka.sh,地址是:https://github.com/wurstmeister/kafka-docker/blob/0.10.0/start-kafka.sh ,如下圖紅框所示,果然有用到docker客戶端,執(zhí)行的是docker port命令:

    上圖紅框中的功能:通過docker port命令得到該容器的端口映射信息,再通過sed命令從該信息中取得端口號,然后再用export命令暴露出去。

  • 還剩最后一個問題:上圖紅框中的docker命令在容器中可以執(zhí)行么?會不會提示"找不到docker命令"?
    對于這個問題,我的猜測是該鏡像已經(jīng)包含了可執(zhí)行文件"docker",所以去看看該鏡像的Dockerfile文件吧,地址是:https://github.com/wurstmeister/kafka-docker/blob/0.10.0/Dockerfile 如下圖紅框,果然在構(gòu)建鏡像的時候就安裝了docker應用,因此在容器中執(zhí)行docker xxx命令是沒問題的:

    至此,所有理論上的推測都找到了直接證據(jù),可以動手驗證:進kafka容器內(nèi)試試docker命令。

  • 驗證上述分析

  • 首先確保您的電腦上docker、docker-compose都已經(jīng)裝好可以正常使用;
  • 創(chuàng)建名為docker-compose.yml的文件,內(nèi)容如下(其實就是開篇貼出的那個):
  • version: '2' services:zookeeper:container_name: zookeeperimage: wurstmeister/zookeeperports:- "2181:2181"kafka:container_name: kafkaimage: wurstmeister/kafka:2.11-0.11.0.3ports:- "9092"environment:KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://:9092KAFKA_LISTENERS: PLAINTEXT://:9092KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181volumes:- /var/run/docker.sock:/var/run/docker.sock
  • 在docker-compose.yml所在目錄執(zhí)行命令docker-compose up -d創(chuàng)建容器:
  • [root@centos7 22]# docker-compose up -d Creating network "22_default" with the default driver Creating zookeeper ... done Creating kafka ...
  • 執(zhí)行以下命令進入kafka容器:
  • docker exec -it kafka /bin/bash
  • 在容器內(nèi)執(zhí)行命令docker ps,看到的內(nèi)容和在宿主機上執(zhí)行docker ps命令是一樣的:
  • bash-4.4# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d612301ea365 wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 3 hours ago Up 2 hours 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp zookeeper 9310ab2d82f4 wurstmeister/kafka:2.11-0.11.0.3 "start-kafka.sh" 3 hours ago Up 2 hours 0.0.0.0:32769->9092/tcp kafka

    可見容器內(nèi)的docker客戶端發(fā)出的請求的確是到達了宿主機的Docker Daemon,并且收到了響應。
    6. 在容器內(nèi)執(zhí)行命令ps -ef|grep docker,沒有結(jié)果,證明容器內(nèi)沒有Docker Daemon服務在運行,在宿主機執(zhí)行此命令可以看到如下內(nèi)容,證明宿主機上的Docker Daemon服務是正常的:

    [root@centos7 22]# ps -ef|grep docker root 14604 1 0 12:00 ? 00:00:46 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2 root 14610 14604 0 12:00 ? 00:00:11 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true root 27981 14604 0 16:03 ? 00:00:00 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 32769 -container-ip 172.18.0.2 -container-port 9092 root 27999 14610 0 16:03 ? 00:00:00 /usr/bin/docker-containerd-shim-current 9310ab2d82f41629f734a9dcf54d0002945eaccb7cfcc2352d5a76141a709a14 /var/run/docker/libcontainerd/9310ab2d82f41629f734a9dcf54d0002945eaccb7cfcc2352d5a76141a709a14 /usr/libexec/docker/docker-runc-current root 28022 14604 0 16:03 ? 00:00:00 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 2181 -container-ip 172.18.0.3 -container-port 2181 root 28029 14610 0 16:03 ? 00:00:00 /usr/bin/docker-containerd-shim-current d612301ea365ac6c6e2b8987e28beb2c2c3eccca720e7d5d7214bf9945c15034 /var/run/docker/libcontainerd/d612301ea365ac6c6e2b8987e28beb2c2c3eccca720e7d5d7214bf9945c15034 /usr/libexec/docker/docker-runc-current root 38299 10540 0 19:23 pts/0 00:00:00 grep --color=auto docker

    優(yōu)化建議

    目前我們docker的client、server架構(gòu)已經(jīng)比較清楚了,對開篇的問題也找到了答案,不過細心的您是否注意到一個問題,如下圖,這是kafka鏡像的Dockerfile文件:

    上圖顯示kafka鏡像中安裝了docker應用,這里面包含了client和daemon,但實際上只用到了client,這樣是否有些浪費呢?如果以后我們制作鏡像的時候要用到docker客戶端,難道我們的鏡像也要這樣把整個docker應用裝好么?

    一篇來自官方的文檔給我們了啟發(fā),地址是:https://docs.docker.com/docker-for-azure/upgrade/ ,如下圖紅框所示,將宿主機的可執(zhí)行文件docker映射到容器的/usr/bin目錄下,這樣容器啟動后就可以直接執(zhí)行docker命令了:

    至此,對docker的/var/run/docker.sock參數(shù)的學習和實戰(zhàn)就全部完成了,希望本文能幫助您加深對docker的理解,靈活的使用該參數(shù)可以助您設計出更強大的docker鏡像。

    再加一句:現(xiàn)在您可以去了解Docker in Docker了,相信您會學得很輕松愉快。

    歡迎關注我的公眾號:程序員欣宸

    總結(jié)

    以上是生活随笔為你收集整理的docker的/var/run/docker.sock参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。