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

查看docker version详情
docker version

修改配置文件使用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
<br />4. **测试访问接口**```shellcurl 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}]
注意:使用原有命令接口需要,修改原来配置
