Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
使用Docker的步骤:
1)、安装Docker
2)、去Docker仓库找到这个软件对应的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;
4)、对容器的启动停止就是对软件的启动停止;
1)、VMWare、VirtualBox(安装);
2)、导入虚拟机文件;
3)、双击启动linux虚拟机;使用 root/ 123456登陆
4)、使用客户端连接linux服务器进行命令操作;
5)、设置虚拟机网络;
桥接网络=选好网卡==接入网线;
6)、设置好网络以后使用命令重启虚拟机的网络
service network restart
7)、查看linux的ip地址
ip addr
8)、使用客户端连接linux;
一、配置阿里云yum源(提高docker软件下载速度): 参考连接
1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成新的缓存
yum clean all
yum makecache
yum update
二、安装docker步骤:
1、检查内核版本,必须是3.10及以上
uname -r
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
yum update
3、卸载旧版本(如果安装过旧版本的话)
$ yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
7、安装docker
$ yum install docker-ce-17.12.0.ce #由于repo中默认只开启stable仓库,这里安装的是稳定版17.12.0
8、启动docker
[root@localhost ~] systemctl start docker
[root@localhost ~] docker -v
Docker version 1.12.6, build 3e8e77d/1.12.6
9、开机启动docker
[root@localhost ~] systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
10、停止docker
systemctl stop docker
操作 | 命令 | 说明 |
---|---|---|
检索 | docker search 关键字 eg:docker search redis | 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 |
拉取 | docker pull 镜像名:tag | :tag是可选的,tag表示标签,多为软件的版本,默认是latest |
列表 | docker images | 查看所有本地镜像 |
删除 | docker rmi image-id | 删除指定的本地镜像 |
镜像查找: https://hub.docker.com/(包含具体镜像的操作命令)
docker改国内官方镜像(提升镜像pull速度):
编辑文件/etc/docker/daemon.json,没有就新建。加入以下项目
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
本身daemon.json文件已经有项目,就额外增加registry-mirrors项
重启docker daemon
systemctl restart docker
软件镜像(QQ安装程序)----运行镜像----产生一个容器(正在运行的软件,运行的QQ);
步骤:
1、搜索镜像
[root@localhost ~] docker search tomcat
2、拉取镜像
[root@localhost ~] docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
4、docker ps
查看运行中的容器
5、 停止运行中的容器
docker stop 容器的id
6、查看所有的容器(包括没有运行的)
docker ps -a
7、启动容器
docker start 容器id
8、删除一个容器
docker rm 容器id
9、启动一个做了端口映射的tomcat
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
10、为了演示简单关闭了linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
11、查看容器的日志
docker logs container-name/container-id
更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/
可以参考每一个镜像的文档
docker pull mysql:5.7
正确的启动:做了端口映射
[root@localhost ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad10e4bc5c6a mysql "docker-entrypoint.sh" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql02
几个其他的高级操作
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
指定mysql的一些配置参数
docker安装mysql后外部无法访问,解决办法:
使用bash窗口
docker exec -it mysqlDB bash
登陆mysql
mysql -uroot -p123456;
修改权限
> use mysql;
> update user set authentication_string = password('123456') where user = 'root';
> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
> flush privileges;
> exit;
docker pull redis:5.0.7
正确的启动:做了端口映射
[root@localhost ~] docker run -d -p 6381:6379 --name myredis redis:5.0.7 --requirepass "123456"
# --requirepass "123456" 设置密码
# -p 6381:6379:映射容器服务的 6379 端口到宿主机的 681 端口。外部可以直接通过宿主机ip:6381 访问到 Redis 的服务
[root@localhost ~] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dff3d4e7ef6b redis:5.0.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:6381->6379/tcp myredis
[root@localhost ~] docker exec -it myredis bash
#docker exec -it xxx bash 这个命令是表示进入容器的,xxx是服务名称也可以是容器的id
几个其他的高级操作
# docker run -p 6382:6379 --name myredis -v $PWD/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis:5.0.7 redis-server /etc/redis/redis.conf --appendonly yes
命令说明:
--name myredis : 指定容器名称,这个最好加上,不然在看docker进程的时候会很尴尬。
-p 6699:6379 : 端口映射,默认redis启动的是6379,至于外部端口,随便玩吧,不冲突就行。
-v $PWD/redis.conf:/etc/redis/redis.conf : 将主机中当前目录下的redis.conf配置文件映射。
-v $PWD/data:/data -d redis:3.2 : 将主机中当前目录下的data挂载到容器的/data
--redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置\
docker安装redis后外部无法访问,解决办法: 记得开启阿里云相应的端口号.
参考文章:https://blog.csdn.net/qq_32101993/article/details/100021002
拉取镜像:
docker pull elasticsearch:tag(6.8.5)
启动:
[root@localhost ~] docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 --name ES01 elasticsearch:版本号(如果是latest则不写)
[root@localhost ~] docker ps
# 查看是否成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3f23945d1ed elasticsearch:6.8.5 "/usr/local/bin/dock…" 6 minutes ago Up 53 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp ES01
此时已经可以正常外部访问网址:域名:端口号
配置跨域:
1.首先进入容器
docker exec -it ES01 /bin/bash
2.安装vim
yum -y install vim*
3.编辑/config/elasticsearch.ym
vim elasticsearch.yml
4.添加内容
cluster.name: "qfcwx-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
5.exit
6.重启
docker restart ES01(容器id或者name)
参考文章:https://www.cnblogs.com/yufeng218/p/9452621.html
拉取镜像:选择带有mangement的版本(包含web管理页面)
docker pull rabbitmq:management
启动:
[root@localhost ~] docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 6bd1749b8197
[root@izlnxqoeytyh4fz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6575d289410 6bd1749b8197 "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, 0.0.0.0:15673->5672/tcp rabbitmq
# 进入控制台
docker exec -it rabbitmq /bin/bash
此时已经可以正常外部访问网址:域名:端口号
参考官方安装方法
拉取镜像:
# docker官方的已经不推荐,故选择Jenkins提供的
docker pull jenkins/jenkins
启动:
[root@localhost ~] docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins
# 进入控制台
docker exec -it jenkins/jenkins /bin/bash
docker pull percona/percona-xtradb-cluster:5.7
docker tag percona/percona-xtradb-cluster:5.7 pxc
# 删除
docker rmi percona/percona-xtradb-cluster:5.7
docker network create --subnet=172.18.0.0/24 net1
执行成功后,执行如下命令 查看net1详细信息:
docker inspect net1
输出如下:
[
{
"Name": "net1",
"Id": "68c2a6f28da4bcc841b2caac3d414c66c5017f71a5050f84d26d023d98253452",
"Created": "2019-12-25T19:15:07.837735721+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/24"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
说明: –subnet=172.18.0.0/24 自定义网段172.18.0.0,24是指24位子网掩码 net1 网段名称。
4. 创建docker卷
说明: docker容器的运行规则:通过目录映射的方法,将业务数据写入到宿主机中。好处是如果容器故障,只需将容器删除,重新启用一个容器即可,这样就不会丢失原来的数据。
由于PXC较为特殊,无法直接使用映射目录的方法做映射(使用后会闪退),故使用docker卷。
docker volume create --name v1
# 执行成功后,想查看映射的地址,可通过如下命令进行查看:
docker inspect v1
# 执行上面命令输出:
[
{
"CreatedAt": "2019-12-25T19:15:41+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/v1/_data",
"Name": "v1",
"Options": {},
"Scope": "local"
}
]
可以看到Mountpoint字段 就是映射在宿主机的路径。
用于后续会在不同容器中一使用不同的docker卷,故再这预先执行以下命令:
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
说明:
-d 默认在后台运行
-p 3306(宿主):3306(容器) 端口映射,将容器3306端口映射到宿主3306坤口
-v 目录映射,将第四步创建的v1映射到容器/var/lib/mysql
-e MYSQL_ROOT_PASSROWD 创建的用户实例的密码,默认实例root
-e CLUSTER_NAME 集群名称
-e XTRABACKUP_PASSWORD 数据库之间同步使用的密码
--privileged 权限.给予最高权限
--name 给容器容命名
--net 使用内部网段
--ip 内部网段分到的地址
pxc 指的是镜像
说明: 在创建第一个容器时 初始化数据库需要一点时间(两分钟左右),不可过快执行创建下方容器命令。是由于第一个mysql还未初始化启动完成,无法找到对应节点造成闪退。
创建其余容器:
docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSROWD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
# 查看日志
docker logs node1
# 错误日志
[ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
集群本身无问题,只是非正常关闭。
修改想第一个启动节点的grastate.dat文件,将safe_to_bootstrap: 0 改为 1
#查看v1位置
docker inspect v1
# 执行上面命令输出:
[
{
"CreatedAt": "2019-12-25T19:15:41+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/v1/_data",
"Name": "v1",
"Options": {},
"Scope": "local"
}
]
cd /var/lib/docker/volumes/v1/_data
vi grastate.dat
# docker 删除网关net1
docker network rm net1
#docker 删除docker卷v1
docker volume rm v1
docker pull haproxy
# 确保路径上文件夹已经创建了
vi /home/guest/haproxy.cfg
配置文件内容:
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/guest/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.21 haproxy
docker run -it -d -p 4011:8888 -p 4012:3306 -v /home/guest/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.22 haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
# mysql创建账号(前面配置文件haproxy.cfg提到--Haproxy使用这个账户对MySQL数据库心跳检测)
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
访问http://ip:4001/dbs(/dbs 在前面配置文件设置haproxy.cfg)
接下来创建好haproxy数据连接,就可以在该haproxy数据库连接中进行数据库操作,haproxy会帮你将操作按照haproxy配置的策略分发到各个容器(node1,node2,node3,node4,node5)的数据库中,从而实现负载均衡。
vi pxc.sh
chmod +x pxc.sh
sh pxc.sh
pxc.sh
rm -f /var/lib/docker/volumes/v1/_data/grastate.dat
docker start node1
docker start node2
docker start node3
docker start node4
docker start node5
docker start h1
docker start h2
安装步骤
安装步骤
keepalived.conf配置详解
mycat
先创建宿主机的keepalived.conf:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
#进入h1容器
docker exec -it h1 bash
#更新软件包
apt-get update
#安装Keepalived
apt-get install keepalived
#打开另一个终端,宿主机下拷贝配置文件到h1容器
docker cp keepalived.conf h1:/etc/keepalived/
#在容器中启动Keepalived
service keepalived start
#在宿主机执行ping命令
ping 172.18.8.11
在容器中查看你刚刚添加的虚拟网络172.168.0.201是否出现
能ping通就说明搭建成功了,即在h1 里面装好了keepalived。
我们还要在h2装keepalived,操作跟上面的一样。
#安装软件
yum install -y keepalived
# 配置文件
vim /etc/keepalived/keepalived.conf
# 启动
systemctl start keepalived
#查看状态
systemctl status keepalived
#开机启动
systemctl enable keepalived.service
配置文件
vrrp_instance VI_1 {
state MASTER
interface ens33 #注意的地方:使用ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.246
}
}
virtual_server 192.168.31.246 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.31.246 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
到这里我们的5节点pxc集群就真正意义上的达到了高可用,有任何一个node挂掉都不影响客户访问其他数据库,就算有一个haproxy挂掉的话我们还有一个haproxy来实现负载均衡,还有keepalived来热备。之后我将更新搭载mycat实现高性能以及一些其它的方案。
redis的三种集群方式
安装文章参考
参考文章
docker pull redis:5.0.7
docker network create redis-net
docker network ls
docker network inspect redis-net
mkdir -p /home/redis-cluster
cd /home/redis-cluster
vi redis-cluster.tmpl
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.37.128
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
protected-mode no
192.168.37.128 虚拟机IP(容器宿主机IP)
各节点解释如下所示:
port:节点端口,即对外提供通信的端口
cluster-enabled:是否启用集群
cluster-config-file:集群配置文件
cluster-node-timeout:连接超时时间
cluster-announce-ip:集群各节点IP地址
cluster-announce-port:集群节点映射端口
cluster-announce-bus-port:集群总线端口
appendonly:持久化模式
cluster-announce-ip: 这个IP需要特别注意一下,如果要对外提供访问功能,需要填写宿主机的IP,如果填写docker分配的IP(172.x.x.x),可能会导致部分集群节点在跳转时失败。
for port in $(seq 8010 8015); \
do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
for port in $(seq 8010 8015); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis:5.0.7 redis-server /usr/local/etc/redis/redis.conf; \
done
#关闭防火墙
systemctl stop firewalld
#开机关闭防火墙
sytemctl disable firewalld
docker exec -it redis-8010 bash
#进入容器
cd /usr/local/bin/
# 出现选择提示信息,输入yes
redis-cli --cluster create 192.168.37.128:8010 192.168.37.128:8011 192.168.37.128:8012 192.168.37.128:8013 192.168.37.128:8014 192.168.37.128:8015 --cluster-replicas 1
redis-cli -c -h 192.168.37.128 -p 8010
#查看集群状态
info replication
cluster info
application.properties
# database name
spring.redis.database=0
# server host1
#spring.redis.host=47.112.4.110
spring.redis.cluster.nodes=192.168.37.128:8010,192.168.37.128:8011,192.168.37.128:8012,192.168.37.128:8013,192.168.37.128:8014,192.168.37.128:8015
# server password
spring.redis.password=123456
#connection port
# spring.redis.port=6379
# pool settings ...
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1
1:S 28 Dec 2019 02:20:21.672 * Connecting to MASTER 192.168.37.128:8012
1:S 28 Dec 2019 02:20:21.672 * MASTER <-> REPLICA sync started
1:S 28 Dec 2019 02:20:24.677 # Error condition on socket for SYNC: No route to host
解决方法:
# 关闭防火墙
systemctl stop firewalld
# 停止并禁用开机启动
sytemctl disable firewalld