1 mysql配置主从
先在宿主机上创建配置文件
cd /mydaata/mysql-master/conf
vim my.cnf
将下面的内容复制进去
[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
default_authentication_plugin='mysql_native_password' #不然从机在连接时会有误
主机容器启动配置
docker run -d \
--name mysql-master \
--privileged=true \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /mydata/mysql-master/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3307:3306 \
mysql:8.0
进入主机连接mysql,创建从机使用的账户
mysql -uroot -proot
create user 'nihao'@'%' identified by '123456';
grant replication slave,replication client on *.* to 'nihao'@'%';
flush privileges;
在宿主机上创建配置文件
cd /mydaata/mysql-slave/conf
vim my.cnf
将下面的内容复制进去
[mysqld]
server_id=102
binlog-ignore-db=mysql
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin
log_slave_updates=1
read_only=on
default_authentication_plugin='mysql_native_password' #不然从机在连接时会有误
从机容器启动配置
docker run -d \
--name mysql-slave \
--privileged=true \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /mydata/mysql-slave/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3308:3306 \
mysql:8.0
查询主机的状态,用于从机的配置:
show master staus;
进入从机连接mysql,配置主从配置
mysql -uroot -proot
change master to master_host='192.168.238.xxx', master_user='nihao', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000006', master_log_pos=848, master_connect_retry=30;
在从机上启动主从,并查询状态
start slave;
show slave status \G;
看到这两个yes则成功
2 Redis 3主3从集群搭建
创建6个redis docker实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
进入一个容器配置集群和主从
docker exec -it redis-node-1 bash
redis-cli --cluster create 192.168.238.100:6381 192.168.238.100:6382 192.168.238.100:6383 192.168.238.100:6384 192.168.238.100:6385 192.168.238.100:6386 --cluster-replicas 1
进入一个容器,查看主从配置的结果
docker exec -it redis-node-1 bash
redis-cli -p 6381
cluster node
配置好了之后,再连接redis的客户端就需要加-c参数
redis-cli -p 6381 -c
扩容至4主4从
新起两个容器
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
进入7号节点,进行配置
docker exec -it redis-node-7 bash
redis-cli --cluster add-node 192.168.238.100:6387 192.168.238.100:6381
#重新分配槽位
redis-cli --cluster reshard 192.168.238.100:6381
#之后按照rehash的步骤来
#结果是前三个匀给了他
#再把8号节点给他作为从节点
#id从redis-cli --cluster check 192.168.238.100:6381查询
redis-cli --cluster add-node 192.168.238.100:6388 192.168.238.100:6387 --cluster-slave --cluster-master-id 205c07477391ca43dafd637c6641224fec8b6eb8
缩容回3主3从
# 删除8号节点
redis-cli --cluster del-node 192.168.238.100:6388 df13a2f508cd9d5bcd71ab65a81b02abf00695eb
# 归还槽位
redis-cli --cluster reshard 192.168.238.100:6381
# 删除7号节点
redis-cli --cluster del-node 192.168.238.100:6387 205c07477391ca43dafd637c6641224fec8b6eb8
3 docker file
FROM #基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER #镜像维护者的姓名和邮箱地址
RUN #容器构建时需要运行的命令
EXPOSE #当前容器对外暴露出的端口
WORKDIR #指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER #指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV #用来在构建镜像过程中设置环境变量
ADD #将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY #拷贝文件和目录到镜像中
VOLUME #容器数据卷,用于数据保存和持久化工作
CMD #让用户指定容器默认启动命令,指定好的command可以被覆盖
ENTRYPOINT #让用户指定容器默认启动命令,指定好的command只可以通过--entrypoint进行显示的覆盖
go服务部署docker上
首先写一个简单的服务:
package main
import (
"fmt"
"log"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world")
}
func main() {
http.HandleFunc("/", sayHello)
log.Println("【默认项目】服务启动成功 监听端口 80")
er := http.ListenAndServe("0.0.0.0:80", nil)
if er != nil {
log.Fatal("ListenAndServe: ", er)
}
}
编译成一个可执行的二进制文件, 这里我的叫hello
然后拖进linux系统里面,写好执行脚本和Dockerfile,构成这样的文件目录
Dockefile如下:
FROM golang
MAINTAINER tl
WORKDIR /go/src/
COPY . .
EXPOSE 80
CMD ["/bin/bash", "/go/src/script/build.sh"]
build.sh如下:
#!/usr/bin/env bash
cd /go/src/app/ && ./hello
构建镜像,执行镜像
docker build -t go-hello:1.0 .
docker run -d -p 80:80 go-hello:1.0
访问结果
4 docker网络
bridge模式
host模式
container模式
自定义网络
默认也是桥接模式,能够自动维护容器名和ip的对应关系
常用指令
#查看网络
docker network ls
#创建自定义网络
docker netword create XXX网络名字
#删除网络
docker network rm XXX网络名字
5 Compose
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
安装
https://docs.docker.com/compose/install/
常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
实战
假设go服务需要用到mysql和redis,现在要先起mysql和redis才能启动我们的go服务
编写docker-compose.yml文件:
version: "3"
services:
container_name: ms01
image: go-hello:1.0
ports:
- "80:80"
volumes:
- ./app/go/hello:/go/src/app:rw
networks:
- haha
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- haha
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'zzyy'
MYSQL_PASSWORD: 'zzyy123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
haha
这么编写完后,在go里面写的连接mysql,redis的配置,可以不用具体ip,而使用mysql, redis这样的服务名来替代
#之后先检查配置文件是否有错误
docker-compose config -q
#运行
docker-compose up -d
#关停
docke-compose stop