[Cloud Native | 06] Demonstration of Docker as a daemon to run efficiently

xpeng linux 2022-08-06 13:59:20 阅读数:968

cloudnativedemonstrationdockerdaemon

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情\

 作者简介:云计算领域优质创作者新星计划第三季python赛道第一名 阿里云ACE认证高级工程师
️个人主页:小鹏linux
个人社区:小鹏linux(个人社区)欢迎您的加入!

目录

1.Docker守护进程详解

2. 开放Docker守护进程

3. 以守护进程方式运行容器

4. 将Docker移动到不同分区

5. Docker客户端

6.  使用端口连接容器

 结束语


1.Docker守护进程详解

如下图,Docker守护进程是用户与Docker交互的枢纽,因而它是理解所有相关部分的最佳切入点.它控制着用户机器上的Docker访问权限,管理着容器与镜像的状态,同时代理着与外界的交互.

​​

Docker守护进程

守护进程与服务器,守护进程是运行在后台的一个进程,不在用户的直接控制之下.服务器是负责接受客户端请求,并执行用于满足该请求所需的操作的一个进程.守护进程通常也是服务器,接收来自客户端的请求,为其执行操作.docker命令是一个客户端,而Docker守护进程则作为服务器对Docker容器和镜像进行操作.
我们来看几个技巧,这些技巧用于展示Docker作为守护进程高效运行,同时使用docker命令与其进行的交互被限制为执行操作的简单请求,就像与Web服务器进行交互一样.第一个技巧允许其他人连接你的Docker守护进程,并执行与你在宿主机上所能执行的相同操作,第二个技巧说明的是Docker容器是由守护进程管理的,而不是你的shell会话.

2. 开放Docker守护进程

虽然默认情况下Docker的守护进程只能在宿主机上访问,但是有些情况下还是需要允许其他人访问它.读者可能遇到了一个问题,需要其他人来远程调试,或者可能想让DevOps工作流中的某一部分在宿主机上启动一个进程.

Docker可访问性:正常情况与公开情况

在开放Docker守护进程之前,必须先停止正在运行的实例.操作的方式因操作系统而异.如果不清楚怎么做,可以首先试试这个命令:
[[email protected] ~]# sudo service docker stop
复制代码

如果得到一个类似下面这样的消息,说明这是一个基于systemctl的启动系统:
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try
to use systemctl.
复制代码

可以试试这个命令:
[[email protected] ~]# systemctl stop docker
复制代码

如果这个方法有效,以下命令将看不到任何输出:
ps -ef | grep -E 'docker (-d|daemon)\b' | grep -v grep
复制代码

一旦Docker守护进程停止,就可以使用以下命令手工重启并向外界用户开放它:
docker daemon -H tcp://0.0.0.0:2375
复制代码

这个命令以守护进程方式启动Docker(docker daemon),使用-H标志定义宿主机服务器,使用TCP协议,绑定到所有IP地址上(使用0.0.0.0),并以标准的Docker服务器端口(2375)开放.如果Docker提示daemon不是一个有效的子命令,请尝试使用旧版的-d参数.
可以从外部使用如下命令进行连接:
[[email protected] ~]# docker -H tcp://<宿主机IP>:2375
复制代码

需要注意的是,在本地机器内部也需要这么做,因为Docker已经不再在其默认位置进行监听了.

3. 以守护进程方式运行容器

在熟悉了Docker之后,开始思考Docker的其他使用场景,首先想到的使用场景之一是以运行服务的方式来运行Docker容器.Docker容器与多数进程一样,默认在前台运行.在后台运行Docker容器最常见的方式是使用标准的&控制操作.虽然这行得通,但如果用户注销终端会话就可能出现问题,用户被迫使用nohup标志,而这将在本地目录中创建一个不得不管理的输出文件……是的,使用Docker守护进程的功能完成这一点将简洁得多.
要做到这一点,可使用-d选项:
[[email protected] ~]# docker run -d -i -p 1234:1234 --name daemon ubuntu nc -l 1234
复制代码

与docker run一起使用的-d标志将以守护进程方式运行容器.-i 标志则赋予容器与Telnet会话交互的能力.使用-p 将容器的1234端口公布到宿主机上.通过-- name标志赋予容器一个名称,以便后期用来对它进行引用.最后,使用 netcat(nc)在1234端口上运行一个简单的监听应答(echo)服务器.
如果现在使用Telnet连接它并发送消息,就可以使用docker logs命令看到容器已经接收到该消息,如下:
[[email protected] ~]# telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello daemon
^]
telnet> q
Connection closed.
[[email protected] ~]# docker logs daemon
hello daemon
[[email protected] ~]# docker rm daemon
daemon
[[email protected] ~]#
复制代码

(1)使用telnet命令连接到容器的netcat服务器;(2)输入发送给netcat服务器的一行文本;(3)按Ctrl+]然后按回车键退出Telnet会话;(4)输入q然后按回车键退出Telnet程序;(5)运行docker logs命令查看容器的输出;(6)使用rm命令清除容器;

4. 将Docker移动到不同分区

Docker把所有与容器和镜像有关的数据都存储在一个目录下.由于它可能会存储大量不同的镜像,这个目录可能会迅速变大.如果宿主机具有不同分区,用户可能会更快遭遇空间限制,在这种情况下,第一时间想到的是移动Docker所操作的目录.
停止Docker守护进程,并使用-g 选项指定新的位置来启动.首先必须将Docker守护进程停止.假设想在/home/dockeruser/mydocker运行Docker.运行下列命令将在这个目录中创建一组新的目录和文件:
docker daemon -g /home/dockeruser/mydocker
复制代码

这些目录是Docker内部使用的,对其进行操作风险还是比较大的.
这个虽然看起来把容器和镜像从之前的Docker守护进程清除了.不过不用担心.如果杀掉刚才运行的Docker进程,并重启Docker服务,Docker客户端就会指回它原来的位置,容器和镜像也将回归.如果想让这个移动永久有效,需要对宿主机系统的启动进程进行相应配置.

5. Docker客户端

如下图:Docker客户端是Docker架构中最简单的部件.在主机上输入docker run或docker pull这类命令时运行的便是它.它的任务是通过HTTP请求与Docker守护进程进行通信.

Docker客户端

6.  使用端口连接容器

Docker容器从一开始就被设计用于运行服务.在大多数情况下,都是这样或那样的 HTTP服务.其中很大一部分是可以使用浏览器访问的Web服务.这会造成一个问题.如果有多个Docker容器运行在其内部环境中的80端口上,它们将无法全部通过宿主机的80端口进行访问.接下来的技巧将展示如何通过暴露和映射容器的端口来管理这一常见场景.
使用Docker的-p 选项将容器的端口映射到宿主机上.要从外部地址获取镜像,可以使用docker pull命令.在默认情况下,镜像将从Docker Hub下载:
[[email protected] ~]# docker pull tutum/wordpress
复制代码

要运行第一个博客,可使用如下命令:
[[email protected] ~]# docker run -d -p 10001:80 --name xiaopeng1 tutum/wordpress
复制代码

这里的docker run命令以守护进程方式(-d)及发布标志(-p)运行容器.它指定将宿主机端口(10001)映射到容器端口(80)上,并赋予该容器一个名称用于识别它(--name xiaopeng1 tutum/wordpress).
可以对第二个博客做相同操作:
[[email protected] ~]# docker run -d -p 10002:80 --name xiaopeng2 tutum/wordpress
复制代码

如果现在运行这个命令:
[[email protected] ~]# docker ps -a | grep xiaopeng
复制代码

将看到列出的两个博客容器及其端口映射,看起来像下面这样:
9afb95ad3617 tutum/wordpress:latest "/run.sh" 9 seconds ago Up 9 seconds * 3306/tcp, 0.0.0.0:10001->80/tcp xiaopeng1
31ddc8a7a2fd tutum/wordpress:latest "/run.sh" 17 seconds ago Up 16 seconds * 3306/tcp, 0.0.0.0:10002->80/tcp xiaopeng2
复制代码

现在可以通过浏览http://localhost:10001和http://localhost:10002来访问自己的容器.要在完成后删除这些容器(假设不想保留它们),可运行下面这个命令:
[[email protected] ~]# docker rm -f xiaopeng1 xiaopeng2
复制代码

-p / P 选项的使用格式:        > -p  :将指定的容器端口映射到物理机的随机一个端口上        > -p  ::映射至指定的主机端口        > -p  :::映射至指定的主机的 IP地址 的随机端口        > -p  :::映射至指定的主机 IP 的主机端口(最完整版)        #主机ip 主机端口 容器端口        > -P(大):暴露所需要的所有端口        #将物理机的随机端口与容器的需要暴露的端口进行映射

 结束语

copyright:author[xpeng linux],Please bring the original link to reprint, thank you. https://en.javamana.com/2022/218/202208061320381037.html