Docker C/S架构
Docker C/S架构
简介
Docker是一个开源的应用容器引擎,基于GO语言。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。
整体架构图
概念
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的三个主要概念:
- docker image: 镜像只是读的,镜像中包含有需要运行的文件。镜像用来创建container 容器,一个镜像可以运行多个容器container,镜像只有读取的权限,不能修改。镜像还可以通过Dockerfile脚本创建,也可以下载远程仓库中的镜像
- docker container:容器是docker运行组件,启动一个镜像就是一个容器,容器是一个隔离的环境,多个容器之间是不会相互影响的,保证容器中的程序月在一个相对安全的环境中
- docekr hub/registry:共享和管理docker 镜像,用户可用上传下载远程仓库中的镜像,官方仓库地址
简单来说:镜像就是相当于打包好的版本,镜像启动之后运行在容器中,仓库就是存放镜像的地方
命令执行过程
- Docker的守护进程运行在宿主机上,也就是我们常说的“C/S架构”的Server(服务)端,守护进程会在启动后,一直在后台运行,负责实现Docker的各种功能
- 用户通过client客户端输入docker命令通过命令行接口将用户输入的命令传递给docker daemon守护进程
- 守护进程将命令执行的结果返回给客户端,返显示在命令行接口中
Remote API
除了使用客户端的命令行接口,docker也提供了Remote API接口调用的方式,与docker的守护进程通信的方式。
Remote API 和常见的网络平台提供的api接口相似,是RESful 风格的api接口。这就意味着我们可以直接通过编程的方式调用docker API接口,与docker环境集成。
Docker的Remote在某些复杂的情况下,也支持以下方式进行交互:
- STDIN:标准输入
- STDOUT:标准输出
- STDERR: 标准错误输出
通过Remote API的形式,来实现Docker的C/S架构的模式图:
用户可以与自定义的程序(JAVA、C++等)进行交互,而这些程序通过调用Remote API与Docker的守护进行进行协作。
客户端与守护进程的通信方式
Docker的客户端与守护进程,实际上是通过Socket进行连接的。
Docker提供了三种进行Socket连接的模式:
- Unix的端口模式【Docker默认的客户端与守护进程的连接方式】
unix:///var/run/docker.sock
- TCP协议的host:port模式
tcp://host:port
- fd的Socket模式
fd://socketfd
完整的Docker的C/S模式的运行方式图:
演示
- 启动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
- 查看docker version详情
docker version
- 修改配置文件使用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
- 测试访问接口
curl localhost:2375/images/json
#查看宿主机的所有镜像json格式
[
{
"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
}
]
注意:使用原有命令接口需要,修改原来配置