序言
一个容器提供一个服务,将需要的东西写成dockerfile,然后build成镜像,那么就能一次编译,到处浪啊浪。。。。
容器提供服务,其实和大多数的服务一样,同样也是CS架构的,如下图简略:
客户端主要是使用docker指令,例如docker pull redis;docker info 等命令,此命令会发送至docker daemon执行。
docker daemon可以接收本机的请求也可以接受其他的主机的请求,主要是用来管理镜像,创建,运行,停止容器的操作。
当客户端发送docker pull命令的时候,先从本地仓库查找是否存在镜像文件,如果没有,那么就会去远程仓库查找镜像,查找到后,就会下载到本地仓库中。
docker开启远程服务
1、 修改配置文件
[root@docker-1 ~]# ls -l /etc/sysconfig/docker(配置文件路径)
-rw-r--r--. 1 root root 1301 Dec 25 00:43 /etc/sysconfig/docker
[root@docker-1 ~]# grep -i options /etc/sysconfig/docker(使用-H选项开启需要监听的连接,可以写多个,记得将IP修改为本机的IP地址)
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -H tcp://192.168.1.32:2376 -H unix:///var/run/docker.sock'
2、 查看是否监听
可以看到监听已经在tcp监听和sock本地监听。
3、 验证
在默认不指定连接主机的时候,是使用sock连接,当使用-H 指定主机IP和端口的时候,使用的是tcp方式的连接。也可以直接使用curl进行访问(注意主机名发生了变化,这是在另外一台主机上远程访问docker服务端)。
4、可能出现的问题
如上,当配置文件中仅仅指定了tcp监听端口的时候,默认是不会监听docker.sock,从而在进行docker info的时候,必须要指定主机IP和端口进行tcp连接进行管理。
在其他主机上,进行远程连接的时候,出现报错,no route to host,并不是路由的问题好么。。。骗子。。。。
主要原因是因为防火墙的阻挡,关闭防火墙或者开通2376端口就好了。
centos中默认的服务进程
在这里主要使用centos来进行查看相关的配置文件,但是。。。。在centos中,提供了一些其他的命令,都不知道干啥用的,MMP。。。
当直接使用docker info查看docker服务端信息的时候,当显示无法连接到docker daemon的时候,就表示docker服务端未启动。
在安装docker的时候,默认会将这个docker-comon作为依赖进行安装。
对比使用封装之前的命令和封装之后的命令,查看info结构,两者。。。基本是相同的。
启动服务端之后,可以看到打开的经常和监听的端口:
在启动dockerd之后,默认会监听三个unix端口,主要用于直接和本机通信。。。-在netstat中-x表示查看unix端口,在此时,因为仅仅只监听了本机的unix端口,从而远程是不能连接的。
从上面看出centos并不是使用使用dockerd来直接启动的,so。。。
就centos牛逼,非要搞个自己的名字出来,还弄的大小那么大,并不知道为啥。。。。
查看线程的时候,可以看到开启了好几个线程:
docker常用的配置文件路径如下所示:
这些配置文件其实都是用来设置环境变量的,然后统一在docker.service中生效,需要注意的是,如果在多个地方设置了有冲突的变量,那么可能会发生错误,记得在修改之前需要备份。
最后放一张图(在ps的时候可以看到dockerd,containerd,shim,runc):
dockerd也就是docker的引擎,主要用来存储容器的相关信息,并管理大部分的任务。
containerd主要是用来管理容器运行。
shim主要是用来初始化并且处理来自调用者的重新连接。
runc是容器的启停和资源隔离的实现。