容器间的互联
在运行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使用量、网络使用情况等资源的使用情况