Docker C/S架构

Docker C/S架构

简介

Docker是一个开源的应用容器引擎,基于GO语言。

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。

整体架构图

image-20211118103657015

概念

Docker是CS架构,主要有两个概念:

  • docekr daemon:运行在宿主机上,docker守护经常,用户通过docker client (输入docker命令)与docekr daemon交互

  • docker client: docker 命令行工具,是用户使用docker的主要方式,docker client 与docker daemon通信并将结果返回给用户,docker client 也可以通过socket 或者 RESTful api访问远程的docker daemon

img

使用docker的三个主要概念:

  • docker image: 镜像只是读的,镜像中包含有需要运行的文件。镜像用来创建container 容器,一个镜像可以运行多个容器container,镜像只有读取的权限,不能修改。镜像还可以通过Dockerfile脚本创建,也可以下载远程仓库中的镜像
  • docker container:容器是docker运行组件,启动一个镜像就是一个容器,容器是一个隔离的环境,多个容器之间是不会相互影响的,保证容器中的程序月在一个相对安全的环境中
  • docekr hub/registry:共享和管理docker 镜像,用户可用上传下载远程仓库中的镜像,官方仓库地址

简单来说:镜像就是相当于打包好的版本,镜像启动之后运行在容器中,仓库就是存放镜像的地方

命令执行过程

image-20211118104015446

  1. Docker的守护进程运行在宿主机上,也就是我们常说的“C/S架构”的Server(服务)端,守护进程会在启动后,一直在后台运行,负责实现Docker的各种功能
  2. 用户通过client客户端输入docker命令通过命令行接口将用户输入的命令传递给docker daemon守护进程
  3. 守护进程将命令执行的结果返回给客户端,返显示在命令行接口中

Remote API

除了使用客户端的命令行接口,docker也提供了Remote API接口调用的方式,与docker的守护进程通信的方式。

Remote API 和常见的网络平台提供的api接口相似,是RESful 风格的api接口。这就意味着我们可以直接通过编程的方式调用docker API接口,与docker环境集成。

Docker的Remote在某些复杂的情况下,也支持以下方式进行交互:

  • STDIN:标准输入
  • STDOUT:标准输出
  • STDERR: 标准错误输出

通过Remote API的形式,来实现Docker的C/S架构的模式图:

img

用户可以与自定义的程序(JAVA、C++等)进行交互,而这些程序通过调用Remote API与Docker的守护进行进行协作。

客户端与守护进程的通信方式

Docker的客户端与守护进程,实际上是通过Socket进行连接的。

Docker提供了三种进行Socket连接的模式:

  1. Unix的端口模式【Docker默认的客户端与守护进程的连接方式】
unix:///var/run/docker.sock
  1. TCP协议的host:port模式
tcp://host:port
  1. fd的Socket模式
fd://socketfd

完整的Docker的C/S模式的运行方式图:

img

演示

  1. 启动docker 并查看守护进程
# 启动docker 环境
[root@bogon /]# systemctl start docker
# 根据管道,搜索关键词docker,查看docker守护进程
[root@bogon /]# ps -ef |grep docker 
root       1534      1  0 18:57 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       5161   3667  0 19:03 pts/0    00:00:00 grep --color=auto docker

image-20211118110403344

  1. 查看docker version详情
docker version

image-20211118110723534

  1. 修改配置文件使用Remote API 来实现socket连接
# 1. 修改配置文件  /lib/systemd/system/docker.service文件
vim /lib/systemd/system/docker.service
# 注释掉图中第第二行,并在其上方添加一行(默认端口为2375)
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 2. 重启服务
systemctl daemon-reload
service docker restart

image-20211118113854899

image-20211118114206911

  1. 测试访问接口
curl localhost:2375/images/json
#查看宿主机的所有镜像json格式

image-20211118114424893

[
    {
        "VirtualSize": 141468644,
        "Size": 141468644,
        "SharedSize": -1,
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:fd63aac07effae8efcc4677b6197783b11a674b6664ba86e76884b1af3ffe345"
        ],
        "ParentId": "",
        "Labels": {
            "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
        },
        "Id": "sha256:e9ce56a96f8e0e9f75051f258a595d1257bd6bb91913b79455ea77e67e686c5c",
        "Created": 1637086817,
        "Containers": -1
    },
    {
        "VirtualSize": 133277153,
        "Size": 133277153,
        "SharedSize": -1,
        "RepoTags": null,
        "RepoDigests": [
            "nginx@sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36"
        ],
        "ParentId": "",
        "Labels": {
            "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
        },
        "Id": "sha256:87a94228f133e2da99cb16d653cd1373c5b4e8689956386c1c12b60a20421a02",
        "Created": 1634004220,
        "Containers": -1
    },
    {
        "VirtualSize": 440930756,
        "Size": 440930756,
        "SharedSize": -1,
        "RepoTags": [
            "jenkins/jenkins:lts"
        ],
        "RepoDigests": [
            "jenkins/jenkins@sha256:4b17ea5e222f5fbfcf8d77ac497c6f597ebe5141c39e210dac6c5815485e20a4"
        ],
        "ParentId": "",
        "Labels": {
            "org.opencontainers.image.version": "2.303.2",
            "org.opencontainers.image.vendor": "Jenkins project",
            "org.opencontainers.image.url": "https://www.jenkins.io/",
            "org.opencontainers.image.title": "Official Jenkins Docker image",
            "org.opencontainers.image.source": "https://github.com/jenkinsci/docker",
            "org.opencontainers.image.licenses": "MIT",
            "org.opencontainers.image.description": "The Jenkins Continuous Integration and Delivery server"
        },
        "Id": "sha256:e4ebf98bd6ca32c9bbc21810ce1b953dfba5308bbfa9651a3f1573a5a0aff2aa",
        "Created": 1633538013,
        "Containers": -1
    }
]

注意:使用原有命令接口需要,修改原来配置


相关Docker文章推荐

Docker文件系统 & 数据卷

Docker 安装及基本命令

Docker 部署nginx/tomcat/ES+kibana

Docker网络

Docker C/S架构

Dockerfile自定义镜像

posted @ 2021-11-18 11:51  Mr*宇晨  阅读(854)  评论(0编辑  收藏  举报