容器技术 Docker 应用

1 端口发布
-p 宿主机的 ip:宿主机的端口:容器端口

-p 宿主机的端口:容器端口

80:80
8000:80

-p 宿主机的 ip::容器端口

2 服务容器化
官方镜像:
- Docker hub
- mysql
- 这个服务本身的官方
- oracel mysql 团队

关注点
- 环境变量
- 默认配置文件路径(绑定)
配置文件尽量使用原始的容器产生,作为宿主机的配置文件
- 默认是数据目录(mysql 的数据)

  • nginx

  • mysql

    • MYSQL_ROOT_PASSWORD
    • /etc/my.cnf
    • /var/lib/mysql
  • php

    • /var/www/html
    • /usr/local/etc/php/

一、ELK 容器化

1.获取镜像

官方文档 点我直达

官方镜像 点我直达

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2-amd64

2.启动

开发模式

docker run -d --name ela -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.2

动态查看日志文件

docker logs -f ela

查看健康状态

curl http://127.0.0.1:9200/_cat/health

1611121277 05:41:17 docker-cluster green 1 1 0 0 0 0 0 0 - 100.0%
[root@Docker1 ~]# docker exec -it ela bash
[root@e34305d08f29 elasticsearch]# pwd
/usr/share/elasticsearch
[root@e34305d08f29 elasticsearch]# cat /usr/share/elasticsearch/config/elasticsearch.yml 
cluster.name: "docker-cluster"
network.host: 0.0.0.0

二、Logstash 容器化

docker pull docker.elastic.co/logstash/logstash:7.10.0

1.配置文件

可以将本地的含有配置文件的整个目录以 bind-mounts 的方式和容器内的目录 /usr/share/logstash/pipeline/ 进行映射。

测试

docker run --rm docker.elastic.co/logstash/logstash:7.10.0


[root@Docker1 ~]# mkdir ela
[root@Docker1 ~]# cd ela/
[root@Docker1 ela]# cat logstash_stdout.conf
input {
  beats {
    port => 5044             # 监听的端口
    host => "0.0.0.0"      # 监听的本地 ip 地址,这里是全部地址
  }
}
output {
  stdout { codec => rubydebug }
}

2.正常启动

docker run -itd --rm --name=log --mount type=bind,src=$(pwd)/logstash_stdout.conf,dst=/usrl/share/logstash/pipeline/logstash.conf docker.elastic.co/logstash/logstash:7.10.0

查看状态是否启动成功

docker logs log 
docker ps |grep logstash

查看之前自定义的内容

[root@Docker1 ela]# docker exec -it log bash
bash-4.2$ pwd
/usr/share/logstash
bash-4.2$ ls config/
jvm.options  log4j2.properties  logstash-sample.conf  logstash.yml  pipelines.yml  startup.options
bash-4.2$ vi  pipeline/logstash.conf 
bash-4.2$ cat  pipeline/logstash.conf 
input {
  beats {
    port => 5044
  }
}

output {
  stdout {
    codec => rubydebug
  }
}

三、logstash 配置

1.Log4j2 文件的方式配置

配置日志级别和输出名字示例

logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug

2.Loging API 的方式配置

可以通过日志记录API动态更新日志记录级别。这些设置立即生效,无需重启。

a. 查看日志配置信息
curl -XGET 'localhost:9600/_node/logging?pretty'
b. 更新日志级别
curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
    "logger.logstash.outputs.elasticsearch" : "DEBUG",
    "logger.logstash.codecs.rubydebug" : "DEBUG"
}
'
c. 重置日志级别

要重置可能已通过日志记录API动态更新的任何日志记录级别,请发送PUT请求 _node/logging/reset。所有日志记录级别都将恢复为log4j2.properties文件中指定的值。

curl -XPUT 'localhost:9600/_node/logging/reset?pretty'

日志文件位置
您可以使用--path.logs设置指定日志文件位置。

3.慢日志

a.配置

Logstash 的Slowlog添加了对通过管道时在特定事件上花费了异常时间记录的功能。就像普通的应用程序日志一样,您可以在--path.logs目录中找到slowlogs 。

logstash.yml 可以使用以下选项在设置文件中配置Slowlog:

slowlog.threshold.warn (default: -1)
slowlog.threshold.info (default: -1)
slowlog.threshold.debug (default: -1)
slowlog.threshold.trace (default: -1)

默认情况下禁用Slowlog。默认阈值设置 -1nanos为表示无限阈值。不会调用slowlog。

b.启用慢日志

这些slowlog.threshold字段使用时间值格式,可以实现各种触发间隔。您可以使用以下时间单位指定范围:

nanos(纳秒)
micros(微秒)
ms(毫秒)
s (秒)
m(分钟)
h(小时)
d(天)。

当您提高日志级别时,Slowlog 会变得更加敏感并记录更多事件。

Example:

slowlog.threshold.warn: 2s
slowlog.threshold.info: 1s
slowlog.threshold.debug: 500ms
slowlog.threshold.trace: 100ms

在这个例子中:

如果日志级别设置为warn,则日志显示处理时间超过2秒的事件。
如果日志级别设置为info,则日志显示要处理的时间超过1秒的事件。
如果日志级别设置为trace,则日志显示要处理的时间超过100毫秒的事件。
如果日志级别设置为debug,则日志显示处理时间超过500毫秒的事件。
日志包括导致速度缓慢的完整事件和过滤器配置。

四、Filebeat 容器化

1.获取镜像

docker pull docker.elastic.co/beats/filebeat:7.10.0

2.设置配置文件

容器内的配置文件位置是 /usr/share/filebeat/filebeat.yml

这里放到自己创的目录下实验

[root@Docker1 ~]# cd ela/
[root@Docker1 ela]# vim filebeat.yml
filebeat.inputs:

- type: log
  paths:
    - /*.log

output.console:
  pretty: true

3.运行容器

a.制作日志文件
vim www.nekoosu.com.log
95.213.177.126 - - [18/Jul/2017:00:01:09 +0800] "POST http://check.proxyradar.com/azenv.php HTTP/1.1" 404 326 "https://proxyradar.com/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" "-"
202.108.211.56 - - [18/Jul/2017:00:03:23 +0800] "GET http://1.1.1.1/ HTTP/1.1" 200 6228 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21" "-"
221.228.109.90 - - [18/Jul/2017:01:52:17 +0800] "GET http://www.nekoosu.com/ HTTP/1.1" 200 6228 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:17 +0800] "GET http://www.nekoosu.com/css/style_eeoweb.css HTTP/1.1" 200 11988 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/mobile/js/deviceType.js HTTP/1.1" 200 1055 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/jplayer/skin/black/css/style.css HTTP/1.1" 200 3339 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/index_eeoweb.js HTTP/1.1" 200 910 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/easySlider.js HTTP/1.1" 200 2431 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/require_eeoweb.js HTTP/1.1" 200 7161 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/jquery.js HTTP/1.1" 200 46467 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
b.使用自定义的配置文件运行容器

我们上面的配置文件是输入到标准输出的,要想看到效果就不能让容器在后台运行了。
docker run -it --rm -v $PWD/www.nekoosu.com.log:/neko.log -v $(pwd)/filebeat.yml:/usr/share/filebeat/filebeat.yml docker.elastic.co/beats/filebeat:7.10.0

输出 部分结果

  "input": {
    "type": "log"
  },
  "ecs": {
    "version": "1.6.0"
  },
  "host": {
    "name": "d789e73453bc"
  },
  "agent": {
    "name": "d789e73453bc",
    "type": "filebeat",
    "version": "7.10.0",
    "hostname": "d789e73453bc",
    "ephemeral_id": "056d0fb1-cf08-4991-accc-1b42c319d77e",
    "id": "4021a538-a9fc-46c1-82ff-1da813658fa4"
  }
}

五、ELK+Filebeat + kibana 容器化

这里参考文档 ELK+Filebeat + kibana 容器化
把之前的联动起来

1.elasticsearch

a.创建上下文环境
mkdir -p elk/{filebeat,logstash,elasticsearch}
b.创建自定义的网络
docker network create -d bridge elk-net

docker network ls |grep elk-net
c.运行容器
docker run -d --rm --name=elasticsearch --network=elk-net -e "discovery.type=single-node" -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:7.10.2
d.检查 elasticserch 集群状态
[root@Docker1 elk]# curl http://127.0.0.1:9200/_cat/health
1611140434 11:00:34 docker-cluster green 1 1 0 0 0 0 0 34 5.7s 100.0%

2.Logstash

a.准备管道配置文件
vim elk/logstash/logstash_nginx.conf
input {
  beats {
    port => 5044
    host => "0.0.0.0"
  }
}
filter {
  if ([fileset][module]) == "nginx" {
    if ([fileset][name]) == "access" {
      grok {
        match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
        remove_field => "message"
      }
      mutate {
        add_field => { "read_timestamp" => "%{@timestamp}" }
      }
      date {
        match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
        remove_field => "[nginx][access][time]"
      }
      useragent {
        source => "[nginx][access][agent]"
        target => "[nginx][access][user_agent]"
        remove_field => "[nginx][access][agent]"
      }
      geoip {
        source => "[nginx][access][remote_ip]"
        target => "[nginx][access][geoip]"
      }
    }
    else if [fileset][name] == "error" {
      grok {
        match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
        remove_field => "message"
      }
      mutate {
        rename => { "@timestamp" => "read_timestamp" }
      }
      date {
        match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
        remove_field => "[nginx][error][time]"
      }
    }
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"] 
    manage_template => false
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }

  # stdout { codec => rubydebug }  # 假如有问题,可以打开此行进行调试

}
b.Dockerfile
vim elk/logstash/Dockerfile
FROM docker.elastic.co/logstash/logstash:7.10.0
COPY ./logstash_nginx.conf /usr/share/logstash/pipeline/logstash.conf
c.构建和运行
cd elk/logstash
docker build -t elk_logstash .

docker run -itd --rm --name=log --network=elk-net elk_logstash

3.Filebeat

a. 准备源数据
vim elk/filebeat/example.log
95.213.177.126 - - [18/Jul/2017:00:01:09 +0800] "POST http://check.proxyradar.com/azenv.php HTTP/1.1" 404 326 "https://proxyradar.com/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" "-"
202.108.211.56 - - [18/Jul/2017:00:03:23 +0800] "GET http://1.1.1.1/ HTTP/1.1" 200 6228 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21" "-"
221.228.109.90 - - [18/Jul/2017:01:52:17 +0800] "GET http://www.nekoosu.com/ HTTP/1.1" 200 6228 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:17 +0800] "GET http://www.nekoosu.com/css/style_eeoweb.css HTTP/1.1" 200 11988 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/mobile/js/deviceType.js HTTP/1.1" 200 1055 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/jplayer/skin/black/css/style.css HTTP/1.1" 200 3339 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/index_eeoweb.js HTTP/1.1" 200 910 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/easySlider.js HTTP/1.1" 200 2431 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/require_eeoweb.js HTTP/1.1" 200 7161 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
221.228.109.90 - - [18/Jul/2017:01:52:18 +0800] "GET http://www.nekoosu.com/js/jquery.js HTTP/1.1" 200 46467 "https://www.nekoosu.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" "119.61.20.114"
b. 准备配置文件
vim elk/filebeat/filebeat_to_logstash.yml
filebeat.inputs:

- type: log
  enabled: true
  paths:
    - /*.log

output.logstash:

  # The Logstash hosts

  hosts: ["logstash65:5044"]
c. Dockerfile
vim elk/filebeat/Dockerfile
FROM docker.elastic.co/beats/filebeat:7.10.0
COPY ./example.log /example.log
COPY ./filebeat_to_logstash.yml /usr/share/filebeat/filebeat.yml
d.构建和运行
cd elk/filebeat/
docker build -t elk_filebeat .

docker run -itd --rm --name=filebeat65 --network=elk-net elk_filebeat

4.kibana

下载

docker pull docker.elastic.co/kibana/kibana:7.10.2
a. 默认的配置

kibana 的容器其实处于测试性的目的就可以直接运行了。
因为默认的配置文件中集群的 url 就是 http://elasticsearch:9200

下面是容器内默认的配置文件内容

/usr/share/kibana/config/kibana.yml


---

# Default Kibana configuration from kibana-docker.

server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true
b. 这样运行 kibana 容器
docker run -itd --rm --name=kibana --network=elk-net -p 5601:5601 docker.elastic.co/kibana/kibana:7.10.0
c. 检查是否自动发现了我们创建的索引

使用浏览器访问宿主机的 5601 端口
比如 http://127.0.0.1:5601

六、Docker compose

官方文档 点我直达.

属性详解 点我直达.

中文档 点我直达.

1.安装

1.1 下载
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
1.2 修改为可执行权限
chmod +x /usr/local/bin/docker-compose
1.3 验证安装
[root@Docker1 ~]# docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
1.4 子命令补全

先安装 BASH 自身的子命令补全软件包

yum install bash-completion

下载

wget https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

测试是否下载成功

echo $?

之后推出并重新登录客户端

[root@Docker1 ~]# docker-compose p #按两次tab看看是否可以补全

2.简单使用

2.1 首先在一个指定的目录中编辑一个 docker-compose.yml 文件,
[root@Docker1 ~]# mkdir compose
[root@Docker1 ~]# cd compose/
[root@Docker1 ~]# vi docker-compose.yml
version: "3.8"                     # 指定要使用 docker-compose 的版本
services:                          # 声明服务
  host1:                           # 第一个服务的名称,可以设置多个服务
    image: "centos"                # 从这个镜像启动一个容器
    container_name: "host1"        # 容器启动后的名称
    stdin_open: true               # 相当于 docker run 的 -i    
    tty: true                      # 相当于 docker run 的 -t
    #command: /bin/bash            # 一开始执行的命令 
    networks:                      # 设置这个服务的网络信息 #这里写了下面必须指定
      centos_net:                  # 网络名称,需要在下面顶级的 networks 中声明
#        ipv4_address: 172.16.1.10  # 指定一个静态的 IP 地址 #一般不指定

networks:                          # 顶级 networks ,设置整个 docker-compose 使用的网络设备
  centos_net:                      # 网络设备名称
    driver: bridge                 # 网络设备是网桥,可以理解为是一个交换机设备
    ipam:                          # 顶层网络部分中相应的网络配置必须具有ipam块
      driver: default              # 采用的默认的网络模式
      config:                      # 下面是一个配置列表
        - subnet: 172.16.1.0/24    # 子网网络
          gateway: 172.16.1.1      # 网关
2.2 以后台的方式运行: up -d

注意:默认情况下,所有的 docker-compose 命令都必须在含有 docker-compose.yml 文件的目录下执行。
换句话说,执行 docker-compose 命令的时候,需要保证当前目录下有 docker-compose.yml 文件。

docker-compose up -d
2.3 列出 docker-compse 所有容器
[root@Docker1 compose]# docker-compose ps 

Name     Command    State   Ports
---------------------------------

host1   /bin/bash   Up  
2.4 列出当前 docker-compose 管理的所有的服务
[root@Docker1 compose]# docker-compose ps --services
host1

2.5 执行容器内的命令

[root@Docker1 compose]# docker-compose exec host1 hostname -i
172.16.1.10

进入容器

[root@Docker1 compose]# docker-compose exec host1 bash
[root@d01d8cc39fef /]# cd  
[root@d01d8cc39fef ~]# hostname -i
172.16.1.10
[root@d01d8cc39fef ~]# exit
exit
[root@Docker1 compose]# 

2.6 停止/启动容器

[root@Docker1 compose]# docker-compose stop host1
Stopping host1 ... done
[root@Docker1 compose]# docker-compose start host1
Starting host1 ... done

2.7 关闭所有已开启的容器 并删除容器、网络、卷和映像。

docker-compose down

3 添加一个新的容器进入已有的 compose 项目中

3.1 编辑 compose 文件,并添加新的容器的声明
vim docker-compose.yml
version: '3.8'
services:
  h1:
    build: .
    image: centos7-sshd
    container_name: h1
    privileged: true
    command: /usr/sbin/init
    hostname: h1.sharkyun.com
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.10

  h2:
    build: .
    image: centos7-sshd
    container_name: h2
    privileged: true
    hostname: h2.sharkyun.com
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.20
  h3:
    build: .
    image: centos7-sshd
    container_name: h3
    hostname: h3.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.30
  h4:
    build: .
    image: centos7-sshd
    container_name: h4
    hostname: h4.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.40
networks:
  xiuyun_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.2.0/24
          gateway: 172.16.2.1
3.2 更新 compose 项目

每次修改完 docker-compose.yml 文件的内容后,只需要重新执行
docker-compose up -d 命令即可立即生效。

docker-compose up -d
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐