· 节制Docker网络事理
· 节制Compose的安装及YAML文件详解
· 节制Consol做事自动注册和更新
3.1 案例剖析
3.1.1 案例概述
Docker容器技能同样受到关注的微做事架构也在潜移默化的改变着运用的支配办法,其提倡将运用分割成一系列眇小的做事,每个做事专注于单一业务功能,做事之间采取轻量级通信机制相互沟通。同时,数据库办理方案也在发生在变革,多种持久化稠浊方案(Polyglot Persistence)提倡将数据存放在最适宜的数据库办理方案中,而传统的数据库办理方案将数据存在在同一个数据库做事中。做事数量的增加也就意味着容器数量的增多,逐渐增加的容器数量为容器支配,运行及管理带来了寻衅。Docker Compose的涌现办理多个容器支配的问题并提高了多个容器办理方案的可移植性。
利用Docker将Consul、Consul Template、Registrator和Nginx组装成一个值得信赖且可扩展的做事框架,这套架构在这个框架中添加和移除做事,不须要重写任何配置,也不须要重启任何做事,统统都能正常运行。
3.1.2 案例前置知识点
1. 什么是Docker Compose
Docker Compose的前身是Fig,它是一个定义及运行多个Docker容器的工具。利用Docker Compose你只须要在一个配置文件中定义多个Docker容器,然后利用一条命令将多个容器启动,Docker Compose会通过解析容器件的依赖关系(link, 网络容器 –net-from或数据容器 –volume-from)按先后顺序启动所定义的容器
2. 什么是Consul
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的做事创造与配置。与其他分布式做事注册与创造的方案,比如 Airbnb的SmartStack等比较,Consul的方案更\"大众一站式\"大众,内置了做事注册与创造框架、分布同等性协议实现、康健检讨、Key/Value存储、多数据中央方案,不再须要依赖其他工具(比如ZooKeeper等)。利用起来也较为大略。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可实行文件,方便支配,与Docker等轻量级容器可无缝合营。
3.1.3 案例环境
1. 本案例实验环境
本案例环境如表3-1所示。
表3-1创建Docker Compose 及consul环境
2. 案例需求
1)创建单机网络下容器与容器之间互通。
2)利用docker compose创建容器。
3)搭建consul做事自动创造和更新。
3. 案例实现思路
1)Docker 网络通信。
2)Docker Compose容器编排及命令解释。
3)通过Docker Compose创建lnmp环境。
4)基于Nginx和Consul构建容器自动创造与注册。
3.2 案例履行
3.2.1 Docker网络通信
Docker供应了映射容器端口到宿主机和容器互联机制来为容器供应网络做事。
1. 端口映射
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的做事。Docker供应端口映射机制来将容器内的做事供应给外部网络访问,本色上便是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的做事。
实现端口映射,须要在运行docker run命令时利用-P(大写) 选项实现随机映射,Docker会随机映射一个端口到容器内部开放的网络端口。 例如:
[root@consul ~]# docker pull httpd
[root@consul ~]# docker run -d -P httpd
24ab31d7879c3544ce540a66cbc0cccb06c8e213a3c01ca2847274d0d4abfed5
此时,利用docker –ps 命令可以看到,本机的32768端口被映射到了容器中的80端口。那么访问宿主机的32768端口即可访到容器内web运用供应的界面。
[root@ consul ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34ec7fd9538a httpd \"大众httpd-foreground\"大众 9 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp happy_almeida
还可以在运行docker run命令时利用-p(小写)选项实现指定要映射的端口,例如:
[root@consul ~]# docker run -d -p 49280:80 httpd
c8b185af1e92a04927a2a8e57a47183fd9745afce224c429736ecd084c4ae657
此时,将本机的49280端口被映射到了容器中的80端口。
[root@consul ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8b185af1e92 httpd \"大众httpd-foreground\"大众 10 seconds ago Up 7 seconds 0.0.0.0:49280->80/tcp backstabbing_feynman
2. 容器互联
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道从而实现的互联。大略点说,便是会在源容器和吸收留器之间建立一条隧道,吸收留器可以看到源容器指定的信息。
在运行docker run命令时利用--link选项实现容器之间的互联通信。
格式为 --link name:alias
个中name是要连接的容器名称,alias是这个连接的别名。
把稳:容器互联是通过容器的名称来实行的,--name选项可以给容器创建一个友好的名称,这个名称是唯一的。如果已经命名了一个相同名称的容器,当要再次利用这个名称时,需先利用docker rm删除之前创建的同名容器。
下面是利用容器互联技能实现容器间通信的例子:
1)创建源容器
利用docker run命令建立容器A ,利用--name指定容器名称为web1。
[root@consul ~]# docker run -d -P --name web1 httpd
4ca528f3d96b6979ea41aafd4a730d4984d0ca36f65ff4625e7ef26655a12f38
2)创建吸收留器
利用docker run 命令建立容器B,--name指定名称为web2,--link指定连接容器以实现容器互联。
[root@consul ~]# docker run -d -P --name web2 --link web1:web1 httpd
9fdd921d7d24e05c76e724b0b735546ef87cec8a99321614cef6024aa9f1105e
3)测试容器互联
最大略的检测方法是进入容器,利用ping命令查看容器是否相互连通。
[root@consul ~]# docker exec -it web2 /bin/bash
root@9fdd921d7d24:/usr/local/apache2## ping web1
PING web1 (172.17.0.7) 56(84) bytes of data.
64 bytes from web1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.804 ms
64 bytes from web1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.340 ms
^C
--- web1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.340/0.572/0.804/0.232 ms
[root@9fdd921d7d24 /]#
此时,可以看到容器web2与容器web1已经建立互联关系。这时Docker在两个互联的容器之间创建了一条安全隧道,而且不用映射它们的端口到宿主机上,从而避免暴露端口到外部网络。
3.2.2 Docker Compose容器编排
Compose是Docker的做事编排工具,紧张用来构建基于Docker的繁芜运用,Compose 通过一个配置文件来管理多个Docker容器,非常适宜组合利用多个容器进行开拓的场景。
1. Docker Compose环境安装
下载最新版的docker-compose文件
[root@consul ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@consul ~]# chmod +x /usr/local/bin/docker-compose
[root@consul ~]# docker-compose -v
docker-compose version 1.21.1, build 5a3f1a3
2. 文件格式及编写把稳事变
YAML是一种标记措辞很直不雅观的数据序列化格式,可读性高。类似于 XML数据描述措辞,语法比 XML大略的很多。YAML数据构造通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来, hash用花括号括起来。
1) 不支持制表符 tab键缩进,须要利用空格缩进。
2) 常日开头缩进两个空格
3) 字符后缩进一个空格,如冒号、逗号、横杆
4) 用#号注释
5) 如果包含分外字符用单引号引起来
6) 布尔值(true、 false、 yes、 no、 on、 off)必须用引号括起来,这样剖析器会将他们阐明为字符串。
3. 配置常用字段描述
配置常用字段描述如表3-2所示。
表3-2 常用字段描述表
4. Docker Compose 常用命令
Docker Compose 常用命令如表3-3所示。
表3-3 Docker Compose常用命令描述表
5. docker-compose文件构造和示例
[root@consul ~]# mkdir compose_lnmp
[root@consul ~]# cd compose_lnmp
[root@localhost compose_lnmp]# vim docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 81:80
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
php:
hostname: php
build:
context: ./php
dockerfile: Dockerfile
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
mysql:
hostname: mysql
image: mysql:5.6
ports:
- 3306:3306
networks:
- lnmp
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
command: --character-set-server=utf8
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: user123
networks:
lnmp:
3.2.3 Compose 命令解释及lnmp环境支配
大部分命令都可以运行在一个或多个做事上。如果没有特殊的解释,命令则运用在项目所有的做事上。实行 docker-compose [COMMAND] --help 查看详细某个命令的利用解释。
1. 基本的利用格式
docker-compose [options] [COMMAND] [ARGS...]
2. docker-compose选项
--verbose 输出更多调试信息。
--version 打印版本并退出。
-f, --file FILE 利用特定的 compose 模板文件,默认为 docker-compose.yml。
-p, --project-name NAME 指定项目名称,默认利用目录名称。
3. 创建lnmp环境
1)查看lnmp环境目录构造
[root@consul compose_lnmp]# tree .
.
├── docker-compose.yml
├── mysql
│ ├── conf
│ │ └── my.cnf
│ └── data
├── nginx
│ ├── Dockerfile
│ ├── nginx-1.12.1.tar.gz
│ └── nginx.conf
├── php
│ ├── Dockerfile
│ ├── php-5.6.31.tar.gz
│ └── php.ini
└── wwwroot
└── index.php
6 directories, 9 files
2)利用docker-compose构建lnmp环境在后台运行
构建lnmp环境须要一段韶光,请耐心等待!
[root@consul compose_lnmp]# docker-compose -f docker-compose.yml up -d
Creating network \公众compose_lnmp_lnmp\"大众 with the default driver
Building nginx
Step 1/10 : FROM centos:7
7: Pulling from library/centos
7dc0dca2b151: Pull complete
Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
Status: Downloaded newer image for centos:7
---> 49f7960eb7e4
Step 2/10 : MAINTAINER www.kgc.cn
---> Running in 43a5fb917bba
Removing intermediate container 43a5fb917bba
---> 47f4a6ccb11d
Step 3/10 : RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
---> Running in 611c06a87fb7
…//省略部分
Digest: sha256:0267b9b43034ed630e94f846ca825140994166c6c7d39d43d4dbe8d1404e1129
Status: Downloaded newer image for mysql:5.6
Creating compose_lnmp_nginx_1 ... done
Creating compose_lnmp_php_1 ... done
Creating compose_lnmp_mysql_1 ... done
3)查看lnmp环境的容器
[root@consul compose_lnmp]# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
compose_lnmp_mysql_1 docker-entrypoint.sh --cha ... Up 0.0.0.0:3306->3306/tcp
compose_lnmp_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:81->80/tcp
compose_lnmp_php_1 ./sbin/php-fpm -c /usr/loc ... Up 9000/tcp
4)验证docker-compose创建的lnmp环境
客户端利用浏览器验证docker-compose创建的lnmp环境,如图3.1所示。
PS:如果访问报Access denined.,手动进入nginx容器添加读权限。
[root@nginx ~]# chmod 644 /usr/local/nginx/html/index.php
图3.1
3.2.4 基于Nginx和Consul构建自动创造的Docker做事架构
1. 建立Consul 做事
要想利用Consul供应的做事实现做事的注册与创造,我们须要建立Consul做事。在Consul方案中,每个供应做事的节点上都要支配和运行Consul的agent,所有运行Consul agent节点的凑集构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的运用做事无关。以Server模式运行的Consul agent节点用于掩护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。
[root@consul ~]# mkdir consul
[root@ consul ~]# cd consul/
将consul压缩包上传到/root/consul目录下
[root@ consul consul]# unzip consul_0.9.2_linux_amd64.zip
[root@ consul consul]# mv consul /usr/bin/
[root@ consul ~]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.168.91 \
> -client=0.0.0.0 \
> -node=consul-server01
· -bootstrap:用来掌握一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
· -data-dir 参数指天命据存储目录
· -bind -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
· -ui 参数指定开启UI界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的web UI 界面。
· -client consul绑定在哪个client地址上,这个地址供应HTTP、DNS、RPC等做事,默认是127.0.0.1。
· -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
//放到后台命令启动
[root@consul ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.168.91 -client=0.0.0.0 -node=consurl-server01 &>/var/log/consul.log &
安装consul是用于做事注册,也便是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的干系做事信息,这是便是所为的做事注册与创造。
2. 查看集群信息
[root@ consul ~]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.168.91:8301 alive server 0.9.2 2 dc1
[root@ consul ~]# consul info | grep leader
leader = true
leader_addr = 192.168.168.91:8300
3. 通过http api获取集群信息
[root@ consul ~]# curl 127.0.0.1:8500/v1/status/peers //查看集群server成员
[root@ consul ~]# curl 127.0.0.1:8500/v1/status/leader //集群Raf leader
[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/services //注册的所有做事
[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx做事信息
[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息
3.2.5 容器做事自动加入Nginx集群
1. 安装gliderlabs/registrator
Gliderlabs/registrator检讨容器运行状态自动注册和注销docker容器的做事到做事配置中央。目前支持Consul、etcd和SkyDNS2。
//在192.168.168.92节点操作
[root@registrator ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.168.92 \
> consul://192.168.168.91:8500
2. 测试做事创造功能是否正常
[root@registrator ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx
[root@registrator ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx
[root@registrator ~]# docker run -itd -p:88:80 --name test-03 -h test03 httpd
[root@registrator ~]# docker run -itd -p:89:80 --name test-04 -h test04 httpd
3. 验证http和nginx做事是否注册到consul
浏览器输入http://192.168.168.91:8500,点击\公众NODES\"大众,再点击\"大众consurl-server01\公众\"大众,会涌现5个做事,如图3.2所示。
图3.2
[root@consul ~]# curl 127.0.0.1:8500/v1/catalog/services
{\"大众consul\"大众:[],\"大众httpd\"大众:[],\"大众nginx\"大众:[]} //从结果看,httpd和nginx做事已经注册到consul里面,解释做事正常。
//在192.168.168.91上操作
4. 安装consul-template
Consul-Template是基于Consul的自动更换配置文件的运用。在Consul-Template没涌现之前,构建做事大多采取的是Zookeeper、Etcd+Confd这样类似的系统。Consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上的的任意数量的指定模板,天生配置文件,更新完成往后可以选择运行shell命令实行更新操作重加载nginx。
Consul-Template可以查询Consul中的做事目录、Key、Key-values等。这种强大的抽象功能和查询措辞模板可以使Consul-Template特殊适宜动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。
5. 准备template nginx模板文件
[root@consul ~]# vim /root/consul/nginx.ctmpl
upstream http_backend {
{{range service \"大众nginx\公众}}
server {{ .Address }}:{{ .Port }};
{{ end }}
}
server {
listen 83;
server_name localhost 192.168.168.91;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
6. 编译安装nginx
手动上传nginx-1.12.0.tar.gz包到/root目录下。
[root@consul ~]# yum install gcc pcre-devel zlib-devel -y
[root@consul ~]# tar zxvf nginx-1.12.0.tar.gz
[root@consul ~]# cd nginx-1.12.0
[root@consul nginx-1.12.0]# ./configure –prefix=/usr/local/nginx
[root@consul nginx-1.12.0]# make
[root@consul nginx-1.12.0]# make install
7. 配置nginx
[root@consul ~]#vim /usr/local/nginx/conf/nginx.conf
include vhost/.conf; //在http段里面添加虚拟主机目录
[root@consul ~]#mkdir /usr/local/nginx/conf/vhost/
8. 配置并启动template
手动上传consul-template_0.19.3_linux_amd64.zip包到/root目录下。
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@consul ~]# mv consul-template /usr/bin/
在前台启动template做事,启动后不要按ctrl+c中止。
[root@consul ~]# consul-template -consul-addr 192.168.168.91:8500 -template \公众/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload\公众 --log-level=info
2018/07/11 03:51:27.198429 [INFO] consul-template v0.19.3 (ebf2d3d)
2018/07/11 03:51:27.198461 [INFO] (runner) creating new runner (dry: false, once: false)
2018/07/11 03:51:27.199222 [INFO] (runner) creating watcher
2018/07/11 03:51:27.200185 [INFO] (runner) starting
2018/07/11 03:51:27.200212 [INFO] (runner) initiating run
2018/07/11 03:51:27.238837 [INFO] (runner) initiating run
2018/07/11 03:51:27.279522 [INFO] (runner) rendered \公众/root/consul/nginx.ctmpl\公众 => \"大众/usr/local/nginx/conf/vhost/kgc.conf\公众
2018/07/11 03:51:27.279582 [INFO] (runner) executing command \"大众/usr/local/nginx/sbin/nginx -s reload\"大众 from \公众/root/consul/nginx.ctmpl\"大众 => \公众/usr/local/nginx/conf/vhost/kgc.conf\"大众
2018/07/11 03:51:27.279830 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
须要指定template模板文件及天生路径即可,天生的配置文件如下。
[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
server 192.168.168.92:84;
server 192.168.168.92:83;
}
server {
listen 83;
server_name localhost 192.168.168.91;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
9. 访问template-nginx配置文件
通过浏览访问template-nginx配置文件里面nginx监听的83端口,访问成功如图3.3所示。
图3.3
10. 增加一个nginx容器节点
增加一个nginx容器节点,测试做事创造及配置更新功能。
[root@registrator ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
1)不雅观察template做事,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf文件内容,并且重载nginx做事。
2018/07/11 05:27:28.580888 [INFO] (runner) initiating run
2018/07/11 05:27:28.609525 [INFO] (runner) rendered \公众/root/consul/nginx.ctmpl\"大众 => \"大众/usr/local/nginx/conf/vhost/kgc.conf\公众
2018/07/11 05:27:28.609595 [INFO] (runner) executing command \"大众/usr/local/nginx/sbin/nginx -s reload\"大众 from \"大众/root/consul/nginx.ctmpl\"大众 => \"大众/usr/local/nginx/conf/vhost/kgc.conf\"大众
2018/07/11 05:27:28.609788 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
2)查看/usr/local/nginx/conf/vhost/kgc.conf文件内容
[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {
server 192.168.168.92:83;
server 192.168.168.92:84;
server 192.168.168.92:85;
}
......//省略部分
3)查看三台nginx容器日志,要求正常轮询到各个容器节点上。
[root@registrator ~]# docker logs -f test-01
192.168.168.91 - - [11/Jul/2018:05:14:40 +0000] \"大众GET / HTTP/1.0\"大众 200 612 \公众-\公众 \公众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\公众 \"大众192.168.168.91\"大众
192.168.168.91 - - [11/Jul/2018:05:14:41 +0000] \"大众GET / HTTP/1.0\"大众 200 612 \"大众-\"大众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"大众 \"大众192.168.168.91\公众
192.168.168.91 - - [11/Jul/2018:05:14:44 +0000] \"大众GET / HTTP/1.0\公众 200 612 \"大众-\公众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\公众 \公众192.168.168.91\公众
[root@registrator ~]# docker logs -f test-02
192.168.168.91 - - [11/Jul/2018:05:14:39 +0000] \公众GET / HTTP/1.0\"大众 200 612 \"大众-\"大众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"大众 \公众192.168.168.91\"大众
192.168.168.91 - - [11/Jul/2018:05:14:41 +0000] \公众GET / HTTP/1.0\"大众 200 612 \"大众-\"大众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"大众 \公众192.168.168.91\"大众
192.168.168.91 - - [11/Jul/2018:05:14:43 +0000] \公众GET / HTTP/1.0\"大众 200 612 \公众-\"大众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"大众 \"大众192.168.168.91\"大众
[root@registrator ~]# docker logs -f test-05
192.168.168.91 - - [11/Jul/2018:05:45:11 +0000] \"大众GET / HTTP/1.0\公众 200 612 \"大众-\"大众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\公众 \公众192.168.168.91\"大众
192.168.168.91 - - [11/Jul/2018:05:45:11 +0000] \"大众GET / HTTP/1.0\"大众 200 612 \"大众-\"大众 \公众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\"大众 \公众192.168.168.91\公众
192.168.168.91 - - [11/Jul/2018:05:45:12 +0000] \"大众GET / HTTP/1.0\公众 200 612 \"大众-\公众 \"大众Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\公众 \公众192.168.168.91\公众