Docker
一、Docker的基本命令
# docker启动
$ systemctl start docker
$ service docker start
# 重启docker服务
$ systemctl restart docker
$ sudo service docker restart
# 关闭docker
$ systemctl stop docker
$ service docker stop
# 查看是否启动成功
$ docker ps -a
$ docker ps # 查看所有正在运行容器
$ docker stop containerId # containerId 是容器的ID
$ docker ps -a # 查看所有容器
$ docker ps -a -q # 查看所有容器ID
$ docker stop $(docker ps -a -q) # stop停止所有容器
$ docker rm $(docker ps -a -q) # remove删除所有容器
查询当前容器:docker container ls -all
删除当前容器:docker container rm mycentos(提示: 这一步要确定删除容器没问题的情况下, 才可以做)
二、docker安装
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker
通过 uname -r 命令查看你当前的内核版本
uname -r
2、使用 root
权限登录 Centos。确保 yum 包更新到最新。
sudo yum update
3、卸载旧版本(如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo 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
sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce
8、启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
三、Docker安装MySQL
1、在dockerhub上查找镜像
2、拉取镜像
这里我们拉取官网最新8.0镜像
[root@e2ab0x9jme3furrd ~]# docker pull mysql
3、查看镜像
在镜像列表中我们可以看到刚刚拉取的镜像
[root@e2ab0x9jme3furrd ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest b05128b000dd 10 days ago 516MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
centos latest 5d0da3dc9764 2 months ago 231MB
4、创建数据目录和配置文件
4.1、在宿主机创建mysql的配置文件的目录和数据目录
$ mkdir -p /usr/mysql/conf /usr/mysql/data
4.2、创建配置文件
在配置文件目录下创建MySQL的配置文件my.cnf
$ vim /usr/mysql/conf/my.cnf
4.3、添加配置文件信息
[client]
#socket = /usr/mysql/mysqld.sock
default-character-set = utf8mb4
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
#socket = /usr/mysql/mysqld.sock
#pid-file = /usr/mysql/mysqld.pid
datadir = /usr/mysql/data
character_set_server = utf8mb4
collation_server = utf8mb4_bin
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
5、创建容器
[root@e2ab0x9jme3furrd ~]# docker run --restart=unless-stopped -d --name mysql01 -v /usr/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/mysql/data:/var/lib/mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
参数解释:
-v : 挂载宿主机目录和 docker容器中的目录,前面是宿主机目录,后面是容器内部目录
-d : 后台运行容器
-p 映射容器端口号和宿主机端口号
-e 环境参数,MYSQL_ROOT_PASSWORD设置root用户的密码
6、查看容器启动情况
[root@e2ab0x9jme3furrd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e364ef1e8a4f mysql "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql01
** 问题:虽然已经安装好了mysql,但是无法使用navicat工具进行连接时报错,即无法远程连接。**
7、解决问题
7.1、进入容器内部
[root@e2ab0x9jme3furrd ~]# docker exec -it mysql01 /bin/bash
7.2、连接mysql
root@e364ef1e8a4f:/# mysql -uroot -p
Enter password:
7.3、修改访问主机以及密码,设置所有主机可访问
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> alter user 'root'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)
7.4、刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
至此,通过Docker方式安装Mysql成功!!!
四、docker上安装MySQL的主从一致
当单台 MYSQL 服务器无法满足当前网站流量时的优化方案。需要搭建 mysql 集群技术。
1、复制功能
- 数据分布
- 负载均衡(读)
- 备份
- 高可用和故障切换
- MySQL升级测试
2、复制方式
- 主–从复制
- 主–主复制
- 半同步复制
3、复制原理
Mysql 中有一种日志叫做 bin 日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,create/alter/drop table, grant 等等)。
主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
复制流程图:
复制过程:
主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。
复制中线程的作用:
从节点:
I/O Thread: 从 Master 节点请求二进制日志事件,并保存于中继日志中。
Sql Thread: 从Relay log 中读取日志事件并在本地完成重放。
主节点:
Dump Thread:为每个 Slave 的 I/O Thread 启动一个 dump 线程,用于向从节点发送二进制事件。
**思考:**从节点需要建立二进制日志文件吗?
看情况,如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件。
4、Mysql复制特点
1、异步复制:主节点中一个用户请求一个写操作时,主节点不需要把写的数据在本地操作完成同时发送给从服务器并等待从服务器反馈写入完成,再响应用户。主节点只需要把写入操作在本地完成,就响应用户。但是,从节点中的数据有可能会落后主节点,可以使用(很多软件来检查是否落后)
2、主从数据不一致。
5、主从复制配置过程
主节点:
-
启用二进制日志。
-
为当前节点设置一个全局唯一的server_id。
-
创建有复制权限的用户账号 REPLIACTION SLAVE ,REPLIATION CLIENT。
从节点:
- 启动中继日志。
- 为当前节点设置一个全局唯一的server_id。
- 使用有复制权限的用户账号连接至主节点,并启动复制线程。
配置演示:
测试环境:
主节点:192.168.0.196
从节点:192.168.0.198
mysql版本:mysql-8.0
linux:centos7
-
启动docker
-
前面已经把docker中的MySQL的配置文件和数据目录链接到本地了,所以只需要修改本地的配置文件即可
-
修改主节点的配置文件
vim /etc/my.cnf
-
添加主节点配置文件
log-bin = master-bin server-id =101
-
如果要让从节点链接主节点MySQL的其他用户,用一下命令、否则跳过这一步
create user 'robin'@'%' IDENTIFIED BY '1234abcD'; grant file on *.* to 'robin'@'%'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'robin'@'%'; alter user 'robin'@'%' identified with mysql_native_password by '1234abcD'; flush privileges;
-
查看主节点的信息
show master logs
-
修改从节点的配置文件
log-bin = slave-bin server-id =102
-
从节点执行命令
change master to master_host='192.168.234.133',master_port=13306,master_user='root',master_password='1234abcD',master_log_file='master-bin.000004',master_log_pos=5989;
-
开启从节点
start slave;
-
关闭从节点
stop slave;
五、dockers安装redis
1、拉取镜像
docker pull redis
2、创建文件夹
mkdir -p /opt/module/docker/redis/conf /opt/module/docker/redis/data
3、启动redis
docker run -p 6379:6379 --name redis -v /opt/module/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /opt/module/docker/redis/data/:/data -d redis redis-server /etc/redis/redis.conf --appendonly ye
六、Docker安装redis的哨兵和集群
Sentinel的作用:
1)、Master 状态监测
2)、如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave
3)、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
Sentinel的工作方式:
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
启动redis-sentinel 程序, 可以用redis提供的命令来启动:./redis-sentinel sentinel-26380.conf &
启动之后可以看到日志信息,每个哨兵都能去监控到对应的redis master,并能够自动发现对应的slave,哨兵之间,互相会自动进行发现,用的就是之前说的pub/sub,消息发布和订阅channel消息系统和机制
1、安装docker-compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
#测试安装结果
docker-compose --version
2、目录结构
参考链接:https://www.cnblogs.com/alinainai/p/14086960.html
首先先创建下面的目录和文件
3、Sentinel配置
如果哨兵是在docker配置的,那么他们的端口都要不一样;如果哨兵是在不同的服务器上配置的,那么就可以一样
Sentinel配置文件路径:
/opt/module/docker/redisms/sentinel
3.1、redis-sentinel-1.conf的配置(192.168.233.133服务器)
三个哨兵都监控主节点即可,主从节点,不同哨兵之间都能互相知道
#不同节点的端口号都要设置为不一样的
port 26381
#密码
requirepass 123456
# 格式是sentinel monitor 要监控主节点的名称 主服务器的地址 主服务器的端口 几个节点判定下线,那么这个节点就被下线
sentinel monitor redis-server-master 192.168.234.133 6301 2
sentinel auth-pass redis-server-master 123456
sentinel down-after-milliseconds redis-server-master 30000
3.2、redis-sentinel-2.conf的配置(192.168.233.134服务器)
port 26382
requirepass 123456
sentinel monitor redis-server-slave-1 192.168.234.133 6302 2
sentinel auth-pass redis-server-slave-1 123456
sentinel down-after-milliseconds redis-server-slave-1 30000
3.3、redis-sentinel-3.conf的配置(192.168.233.131服务器)
port 26383
requirepass 123456
sentinel monitor redis-server-slave-2 193.168.234.133 6303 2
sentinel auth-pass redis-server-slave-2 123456
sentinel down-after-milliseconds redis-server-slave-2 30000
3.4、docker-compose.yml的配置
注意:
- 下面的volumes要设置对应的conf的位置
---
version: '3'
services:
redis-sentinel-1:
image: redis
container_name: redis-sentinel-1
restart: always
network_mode: host
volumes:
- /opt/module/docker/redisms/sentinel/redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel-1.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel-1.conf"]
redis-sentinel-2:
image: redis
container_name: redis-sentinel-2
restart: always
network_mode: host
volumes:
- /opt/module/docker/redisms/sentinel/redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel-2.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel-2.conf"]
redis-sentinel-3:
image: redis
container_name: redis-sentinel-3
restart: always
network_mode: host
volumes:
- /opt/module/docker/redisms/sentinel/redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel-3.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel-3.conf"]
4、Server的配置
4.1、redis-master.conf的配置(192.168.233.133服务器)
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6301
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
4.1、redis-slave-1.conf的配置(192.168.233.134服务器)
从节点要设置主节点的服务器的ip和portslaveof 192.168.234.133 6301
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6302
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 192.168.234.133 6301
# 设定连接主节点所使用的密码
masterauth "123456"
4.1、redis-slave-2.conf的配置(192.168.233.131服务器)
从节点要设置主节点的服务器的ip和portslaveof 192.168.234.133 6301
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6303
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 192.168.234.133 6301
# 设定连接主节点所使用的密码
masterauth "123456"
4.1、docker-compose.yml的配置
修改下面的配置文件的路径以及映射到docker中的文件路径
---
version: '3'
services:
# 主节点的容器
redis-server-master:
image: redis
container_name: redis-server-master
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- /opt/module/docker/redisms/server/redis-master.conf:/usr/local/etc/redis/redis.conf
- /opt/module/docker/redisms/server/redis-master/data:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点1的容器
redis-server-slave-1:
image: redis
container_name: redis-server-slave-1
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- /opt/module/docker/redisms/server/redis-slave-1.conf:/usr/local/etc/redis/redis.conf
- /opt/module/docker/redisms/server/redis-slave-1/data:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点2的容器
redis-server-slave-2:
image: redis
container_name: redis-server-slave-2
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- /opt/module/docker/redisms/server/redis-slave-2.conf:/usr/local/etc/redis/redis.conf
- /opt/module/docker/redisms/server/redis-slave-2/data:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
5、启动配置好的主从集群和哨兵集群
再相应的yml文件下,使用命令docker-compose up
;停止的命令是docker-compose down
相关的docker-compose的命令可以自行去了解https://blog.csdn.net/lvjianzhaoa/article/details/103859619?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.queryctrv2&spm=1001.2101.3001.4242.1&utm_relevant_index=3
七、docker安装elasticsearchd集群
参考链接:https://blog.csdn.net/Jamel_LiToo/article/details/110070741
启动
docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9201:9201 -p 9301:9301 -e ES_MIN_MEM=128m -e ES_MAX_MEM=824m -v /opt/module/docker/elasticsearch/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/module/docker/elasticsearch/config/data1/:/usr/share/elasticsearch/data/ -v /opt/module/docker/elasticsearch/plugins/plugins1/:/usr/share/elasticsearch/plugins --restart=always --name ES01 elasticsearch:7.4.2
docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9202:9202 -p 9302:9302 -e ES_MIN_MEM=128m -e ES_MAX_MEM=824m -v /opt/module/docker/elasticsearch/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/module/docker/elasticsearch/config/data2/:/usr/share/elasticsearch/data/ -v /opt/module/docker/elasticsearch/plugins/plugins2/:/usr/share/elasticsearch/plugins --restart=always --name ES02 elasticsearch:7.4.2
docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9203:9203 -p 9303:9303 -e ES_MIN_MEM=128m -e ES_MAX_MEM=824m -v /opt/module/docker/elasticsearch/config/es3.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/module/docker/elasticsearch/config/data3/:/usr/share/elasticsearch/data/ -v /opt/module/docker/elasticsearch/plugins/plugins3/:/usr/share/elasticsearch/plugins --restart=always --name ES03 elasticsearch:7.4.2
firewall-cmd --add-port=9301/tcp
firewall-cmd --add-port=9302/tcp
firewall-cmd --add-port=9303/tcp
firewall-cmd --add-port=9200/tcp
firewall-cmd --add-port=9201/tcp
firewall-cmd --add-port=9202/tcp
firewall-cmd --add-port=9203/tcp
firewall-cmd --complete-reload
防火墙设置
通过systemctl status firewalld查看firewalld状态,发现当前是dead状态,即防火墙未开启。
通过systemctl start firewalld开启防火墙,没有任何提示即开启成功。