简介

Docker是一个开源的应用容器引擎,基于GO语言。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。

整体架构图

Docker C/S架构 - 图1

概念

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

Docker C/S架构 - 图2

使用docker的三个主要概念:

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

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

命令执行过程

Docker C/S架构 - 图3

  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架构的模式图:
Docker C/S架构 - 图4

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

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

Docker的客户端与守护进程,实际上是通过Socket进行连接的。
Docker提供了三种进行Socket连接的模式:

  1. Unix的端口模式【Docker默认的客户端与守护进程的连接方式】

    1. unix:///var/run/docker.sock
  2. TCP协议的host:port模式

    1. tcp://host:port
  3. fd的Socket模式

    1. fd://socketfd

    完整的Docker的C/S模式的运行方式图:
    Docker C/S架构 - 图5

    演示

  4. 启动docker 并查看守护进程

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

    Docker C/S架构 - 图6

  5. 查看docker version详情

    1. docker version

    Docker C/S架构 - 图7

  6. 修改配置文件使用Remote API 来实现socket连接 ```shell

    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

  1. ![](https://zhangyu-blog.oss-cn-beijing.aliyuncs.com/img/image-20211118113854899.png#crop=0&crop=0&crop=1&crop=1&id=hyvcU&originHeight=759&originWidth=987&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />![](https://zhangyu-blog.oss-cn-beijing.aliyuncs.com/img/image-20211118114206911.png#crop=0&crop=0&crop=1&crop=1&id=ywluC&originHeight=123&originWidth=611&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  2. 4. **测试访问接口**
  3. ```shell
  4. curl localhost:2375/images/json
  5. #查看宿主机的所有镜像json格式

Docker C/S架构 - 图8

  1. [
  2. {
  3. "VirtualSize": 141468644,
  4. "Size": 141468644,
  5. "SharedSize": -1,
  6. "RepoTags": [
  7. "nginx:latest"
  8. ],
  9. "RepoDigests": [
  10. "nginx@sha256:fd63aac07effae8efcc4677b6197783b11a674b6664ba86e76884b1af3ffe345"
  11. ],
  12. "ParentId": "",
  13. "Labels": {
  14. "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
  15. },
  16. "Id": "sha256:e9ce56a96f8e0e9f75051f258a595d1257bd6bb91913b79455ea77e67e686c5c",
  17. "Created": 1637086817,
  18. "Containers": -1
  19. },
  20. {
  21. "VirtualSize": 133277153,
  22. "Size": 133277153,
  23. "SharedSize": -1,
  24. "RepoTags": null,
  25. "RepoDigests": [
  26. "nginx@sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36"
  27. ],
  28. "ParentId": "",
  29. "Labels": {
  30. "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
  31. },
  32. "Id": "sha256:87a94228f133e2da99cb16d653cd1373c5b4e8689956386c1c12b60a20421a02",
  33. "Created": 1634004220,
  34. "Containers": -1
  35. },
  36. {
  37. "VirtualSize": 440930756,
  38. "Size": 440930756,
  39. "SharedSize": -1,
  40. "RepoTags": [
  41. "jenkins/jenkins:lts"
  42. ],
  43. "RepoDigests": [
  44. "jenkins/jenkins@sha256:4b17ea5e222f5fbfcf8d77ac497c6f597ebe5141c39e210dac6c5815485e20a4"
  45. ],
  46. "ParentId": "",
  47. "Labels": {
  48. "org.opencontainers.image.version": "2.303.2",
  49. "org.opencontainers.image.vendor": "Jenkins project",
  50. "org.opencontainers.image.url": "https://www.jenkins.io/",
  51. "org.opencontainers.image.title": "Official Jenkins Docker image",
  52. "org.opencontainers.image.source": "https://github.com/jenkinsci/docker",
  53. "org.opencontainers.image.licenses": "MIT",
  54. "org.opencontainers.image.description": "The Jenkins Continuous Integration and Delivery server"
  55. },
  56. "Id": "sha256:e4ebf98bd6ca32c9bbc21810ce1b953dfba5308bbfa9651a3f1573a5a0aff2aa",
  57. "Created": 1633538013,
  58. "Containers": -1
  59. }
  60. ]

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