使用docker运行zabbix-server

2021-07-20 15:05:08 浏览数 (1)

容器间的互联

在运行zabbix之前务必要了解容器间互联的方法

代码语言:javascript复制
# 创建一个nginx容器
docker run -d -p 80:80 nginx
# 创建容器,做link,并进入容器中
docker run -it --link quirky_brown:web01 centos-ssh /bin/bash
# 在容器中访问nginx容器可以ping通
ping web01 

命令执行过程

代码语言:javascript复制
# 启动apache容器
[root@docker01 ~]# docker run -d httpd:2.4  
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01 docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
3f1f7fc55472        httpd:2.4           "httpd-foreground"   6 seconds ago       Up 5 seconds        80/tcp              determined_clarke
# 拉取一个busybox 镜像
[root@docker01 ~]# docker pull busybox 
# 启动容器
[root@docker01 ~]# docker run -it  --link determined_clarke:web busybox:latest   /bin/sh 
/ # 
# 使用新的容器访问最初的web容器
/ # ping web 
PING web (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms
^C
--- web ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.058/0.058/0.058 ms   

启动zabbix容器

1、启动一个mysql的容器

代码语言:javascript复制
docker run --name mysql-server -t 
      -e MYSQL_DATABASE="zabbix" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="zabbix_pwd" 
      -e MYSQL_ROOT_PASSWORD="root_pwd" 
      -d mysql:5.7 
      --character-set-server=utf8 --collation-server=utf8_bin 

2、启动java-gateway容器监控java服务

代码语言:javascript复制
docker run --name zabbix-java-gateway -t 
      -d zabbix/zabbix-java-gateway:latest

3、启动zabbix-mysql容器使用link连接mysql与java-gateway。

代码语言:javascript复制
docker run --name zabbix-server-mysql -t 
      -e DB_SERVER_HOST="mysql-server" 
      -e MYSQL_DATABASE="zabbix" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="zabbix_pwd" 
      -e MYSQL_ROOT_PASSWORD="root_pwd" 
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
      --link mysql-server:mysql 
      --link zabbix-java-gateway:zabbix-java-gateway 
      -p 10051:10051 
      -d zabbix/zabbix-server-mysql:latest

4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。

代码语言:javascript复制
docker run --name zabbix-web-nginx-mysql -t 
      -e DB_SERVER_HOST="mysql-server" 
      -e MYSQL_DATABASE="zabbix" 
      -e MYSQL_USER="zabbix" 
      -e MYSQL_PASSWORD="zabbix_pwd" 
      -e MYSQL_ROOT_PASSWORD="root_pwd" 
      --link mysql-server:mysql 
      --link zabbix-server-mysql:zabbix-server 
      -p 80:80 
      -d zabbix/zabbix-web-nginx-mysql:latest

关于zabbix API

关于zabbix API可以参考官方文档:

https://www.zabbix.com/documentation/3.4/zh/manual/api

1、获取token方法

代码语言:javascript复制
# 获取token
[root@docker02 ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1
}' http://10.0.0.100/api_jsonrpc.php
{"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1}

docker 仓库(registry)

创建一个普通仓库

1、创建仓库

代码语言:javascript复制
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry 


2、修改配置文件,使之支持http

代码语言:javascript复制
[root@docker01 ~]# cat  /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries": ["10.0.0.100:5000"]
}


重启docker让修改生效
[root@docker01 ~]# systemctl restart  docker.service

3、修改镜像标签

代码语言:javascript复制
[root@docker01 ~]# docker tag  busybox:latest  10.0.0.100:5000/clsn/busybox:1.0
[root@docker01 ~]# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
centos6-ssh                     latest              3c2b1e57a0f5        18 hours ago        393MB
httpd                           2.4                 2e202f453940        6 days ago          179MB
10.0.0.100:5000/clsn/busybox    1.0                 5b0d59026729        8 days ago          1.15MB

4、将新打标签的镜像上传镜像到仓库

代码语言:javascript复制
[root@docker01 ~]# docker push   10.0.0.100:5000/clsn/busybox

带basic认证的仓库

1、安装加密工具

代码语言:javascript复制
[root@docker01 clsn]# yum install httpd-tools  -y

2、设置认证密码

代码语言:javascript复制
mkdir /opt/registry-var/auth/ -p
htpasswd  -Bbn clsn 123456  > /opt/registry-var/auth/htpasswd

3、启动容器,在启动时传入认证参数

代码语言:javascript复制
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

4、使用验证用户测试

代码语言:javascript复制
# 登陆用户
[root@docker01 ~]# docker login 10.0.0.100:5000 
Username: clsn  
Password: 123456
Login Succeeded
# 推送镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox 
The push refers to repository [10.0.0.100:5000/clsn/busybox]
4febd3792a1f: Pushed 
1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527
#认证文件的保存位置
[root@docker01 ~]# cat .docker/config.json 
{
    "auths": {
        "10.0.0.100:5000": {
            "auth": "Y2xzbjoxMjM0NTY="
        },
        "https://index.docker.io/v1/": {
            "auth": "Y2xzbjpIenNAMTk5Ng=="
        }
    },
    "HttpHeaders": {
        "User-Agent": "Docker-Client/17.12.0-ce (linux)"
    }
}


至此,一个简单的docker镜像仓库搭建完成

docker-compose编排工具

安装docker-compose

安装docker-compose

代码语言:javascript复制
# 下载pip软件
yum install -y python2-pip
# 下载 docker-compose
pip install docker-compose

国内开启pip 下载加速:

代码语言:javascript复制
mkdir ~/.pip/
cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF

编排启动镜像

1、创建文件目录

代码语言:javascript复制
[root@docker01 ~]# mkdir /opt/my_wordpress/
[root@docker01 ~]# cd /opt/my_wordpress/

2、编写编排文件

代码语言:javascript复制
[root@docker01 my_wordpress]# vim docker-compose.yml
version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - /data/db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - /data/web_data:/var/www/html
     ports: 
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

3、启动

代码语言:javascript复制
[root@docker01 my_wordpress]# docker-compose up
  #启动方法:docker-compose up
  #后台启动方法:docker-compose up -d

4、浏览器上访问http://10.0.0.100:8000

进行wordpress的安装即可

haproxy代理后端docker容器

1、修改编排脚本

代码语言:javascript复制
[root@docker01 my_wordpress]# cat docker-compose.yml 
version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - /data/db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - /data/web_data:/var/www/html
     ports: 
       - "80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

2、同时启动两台wordpress

代码语言:javascript复制
[root@docker01 my_wordpress]# docker-compose scale wordpress=2 
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting mywordpress_wordpress_1 ... done
Creating mywordpress_wordpress_2 ... done

3、安装haproxy

代码语言:javascript复制
[root@docker01 ~]# yum install haproxy -y

4、修改haproxy配置文件

关于配置文件的详细说明,参考:

https://www.cnblogs.com/MacoLee/p/5853413.html

代码语言:javascript复制
[root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak}
[root@docker01 ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats level admin  #支持命令行控制
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
listen stats
    mode http
    bind 0.0.0.0:8888
    stats enable
    stats uri     /haproxy-status 
    stats auth    admin:123456
frontend frontend_www_example_com
    bind 10.0.0.100:8000
    mode http
    option httplog
    log global
    default_backend backend_www_example_com
backend backend_www_example_com
    option forwardfor header X-REAL-IP
    option httpchk HEAD / HTTP/1.0
    balance roundrobin
    server web-node1  10.0.0.100:32768 check inter 2000 rise 30 fall 15
    server web-node2  10.0.0.100:32769 check inter 2000 rise 30 fall 15

5、启动haproxy

代码语言:javascript复制
systemctl start haproxy
systemctl enable haproxy

6、使用浏览器访问hapeoxy监听的8000端口可以看到负载的情况

7、使用浏览器访问

http://10.0.0.100:8888/haproxy-status

可以看到后端节点的监控状况,

安装socat 直接操作socket控制haproxy

1、安装软件

代码语言:javascript复制
yum install socat.x86_64 -y

2、查看帮助

代码语言:javascript复制
[root@docker01 web_data]# echo "help"|socat stdio /var/lib/haproxy/stats

3、下线后端节点

代码语言:javascript复制
echo "disable server backend_www_example_com/web-node2"|socat stdio /var/lib/haproxy/stats

4、上线后端节点

代码语言:javascript复制
echo "enable server backend_www_example_com/web-node3"|socat stdio /var/lib/haproxy/stats

5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点

代码语言:javascript复制
[root@docker01 web_data]# vim check.php
<html>
    <head>
        <title>PHP测试</title>
    </head>
    <body>
        <?php  echo '<p>Hello World </p>'; ?>
        <?php  echo "访问的服务器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";
        echo"访问的服务器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";
        ?>
    </body>
</html>

重启docker服务,容器全部退出的解决办法

在启动是指定自动重启

代码语言:javascript复制
docker run  --restart=always

修改docker默认配置文件

代码语言:javascript复制
# 添加上下面这行
"live-restore": true

docker server配置文件 /etc/docker/daemon.json 参考

代码语言:javascript复制
[root@docker02 ~]# cat  /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "graph": "/opt/mydocker", # 修改数据的存放目录到/opt/mydocker/,原/var/lib/docker/
  "insecure-registries": ["10.0.0.100:5000"],
  "live-restore": true
}

重启生效,只对在此之后启动的容器生效

代码语言:javascript复制
[root@docker01 ~]# systemctl restart  docker.service

Docker网络类型

docker的网络类型

Bridge默认docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

不为容器配置网络功能

此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

代码语言:javascript复制
[root@docker01 ~]# docker run  -it --network none busybox:latest  /bin/sh 
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

与其他容器共享网络配置(Container)

此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

代码语言:javascript复制
[root@docker01 ~]# docker run  -it --network container:mywordpress_db_1  busybox:latest  /bin/sh 
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever


使用宿主机网络

此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

代码语言:javascript复制
[root@docker01 ~]# docker run  -it --network host  busybox:latest  /bin/sh

查看网络列表

代码语言:javascript复制
[root@docker01 ~]# docker network list 
NETWORK ID          NAME                  DRIVER              SCOPE
b15e8a720d3b        bridge                bridge              local
345d65b4c2a0        host                  host                local
bc5e2a32bb55        mywordpress_default   bridge              local
ebf76eea91bb        none                  null                local


用PIPEWORK为docker容器配置独立IP

  • 参考文档: blog.csdn.net/design321/article/details/48264825
  • 官方网站: github.com/jpetazzo/pipework
  • 宿主环境:centos7.2

1、安装pipework

代码语言:javascript复制
wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip 
cp pipework-master/pipework  /usr/local/bin/
chmod  x /usr/local/bin/pipework

2、配置桥接网卡

安装桥接工具

代码语言:javascript复制
yum install bridge-utils.x86_64 -y

修改网卡配置,实现桥接

代码语言:javascript复制
# 修改eth0配置,让br0实现桥接
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5
# 重启网络
[root@docker01 ~]# /etc/init.d/network restart

3、运行一个容器镜像测试:

代码语言:javascript复制
pipework br0 $(docker run -d -it -p 6880:80 --name  httpd_pw httpd) 10.0.0.220/24@10.0.0.254

在其他主机上测试端口及连通性

代码语言:javascript复制
[root@docker01 ~]# curl 10.0.0.220
<html><body><h1>It works!</h1></body></html>
[root@docker01 ~]# ping 10.0.0.220 -c 1
PING 10.0.0.220 (10.0.0.220) 56(84) bytes of data.
64 bytes from 10.0.0.220: icmp_seq=1 ttl=64 time=0.043 ms
代码语言:javascript复制
4、再运行一个容器,设置网路类型为none:
代码语言:javascript复制
pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/24@10.0.0.254

进行访问测试

代码语言:javascript复制
[root@docker01 ~]# curl 10.0.0.221
<html><body><h1>It works!</h1></body></html>

5、重启容器后需要再次指定:

代码语言:javascript复制
pipework br0 testduliip  172.16.146.113/24@172.16.146.1
pipework br0 testduliip01  172.16.146.112/24@172.16.146.1

Dcoker跨主机通信之overlay可以参考:

cnblogs.com/CloudMan6/p/7270551.html

Docker跨主机通信之macvlan

创建网络

代码语言:javascript复制
[root@docker01 ~]# docker network  create --driver macvlan  --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0  macvlan_1
33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca

设置网卡为混杂模式

代码语言:javascript复制
ip link set eth0 promisc on

创建使用macvlan网络容器

代码语言:javascript复制
[root@docker02 ~]# docker run  -it --network macvlan_1  --ip=10.1.0.222 busybox /b

docker企业级镜像仓库harbor

容器管理

代码语言:javascript复制
[root@docker01 harbor]# pwd
/opt/harbor
[root@docker01 harbor]# docker-compose stop

1、安装docker、docker-compose

下载 harbor

代码语言:javascript复制
cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xf harbor-offline-installer-v1.3.0.tgz

2、修改主机及web界面密码

代码语言:javascript复制
[root@docker01 harbor]# vim harbor.cfg 
    ···
    hostname = 10.0.0.100
    harbor_admin_password = Harbor12345
    ···

3、执行安装脚本

代码语言:javascript复制
[root@docker01 harbor]# ./install.sh

浏览器访问 http://10.0.0.11

添加一个项目

4、镜像推送到仓库的指定项目

代码语言:javascript复制
[root@docker02 ~]# docker  tag centos:6.8  10.0.0.100/clsn/centos6.8:1.0
[root@docker02 ~]#  
[root@docker02 ~]# docker images 
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
busybox                     latest              5b0d59026729        8 days ago          1.15MB
10.0.0.100/clsn/centos6.8   1.0                 6704d778b3ba        2 months ago        195MB
centos                      6.8                 6704d778b3ba        2 months ago        195MB
[root@docker02 ~]# docker login 10.0.0.100
Username: admin
Password: 
Login Succeeded

5、推送镜像

代码语言:javascript复制
[root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8 
The push refers to repository [10.0.0.100/clsn/centos6.8]
e00c9229b481: Pushing  13.53MB/194.5MB

6、在web界面里查看

使用容器的建议

1. 不要以拆分方式进行应用程序发布

2. 不要创建大型镜像

3. 不要在单个容器中运行多个进程

4. 不要再镜像内保存凭证,不要依赖IP地址

5. 以非root用户运行进程

6. 不要使用“最新”标签

7. 不要利用运行中的容器创建镜像

8. 不要使用单层镜像

9. 不要将数据存放在容器内

关于Docker容器的监控

容器的基本信息

  • 包括容器的数量、ID、名称、镜像、启动命令、端口等信息

容器的运行状态

  • 统计各状态的容器的数量,包括运行中、暂停、停止及异常退出

容器的用量信息

  • 统计容器的CPU使用率、内存使用量、块设备I/O使用量、网络使用情况等资源的使用情况

0 人点赞