1 PostgreSql

1.1 docker

  1. 拉取镜像

docker pull postgres
  1. 运行容器

docker run --name postgres -e POSTGRES_PASSWORD=Abc1234% -p 5432:5432 -v /home/dockerdata/postgresql:/var/lib/postgresql/data -u 1000:1000 --net mynet --ip 192.168.0.6 -d postgres
  • --name postgres:指定容器的名称;

  • -e POSTGRES_PASSWORD=Abc1234%:设置环境变量,这里为设定PostgreSQL数据库的密码;

  • -p 5432:5432:指定端口映射,前者为宿主机访问端口,后者为容器内端口。如果不指定端口映射,只有在容器内可以访问数据库,外部是无法访问的;

  • -v /home/dockerdata/postgresql:/var/lib/postgresql/data:v是volume的简写,即绑定一个卷,冒号前的路径为宿主机的路径(如果指定路径不存在会自动创建目录),冒号后为容器内路径。容器会把宿主机的目录映射到容器内的路径,这样容器运行中生成的数据实际上就是写到了宿主机的指定路径上,即使容器删除了,此路径的文件也不会删除,这样就做到了数据库的持久化存储。还可以通过docker volume提供的相关命令显式地创建volume,然后再挂载到容器上

  • -d:表示后台运行容器;

  • postgres:表示镜像的名称,docker基于上步拉取的镜像创建出容器;

  • -u 指定所属用户,前者为宿主机用户,后台为容器内用户.容器公用宿主机用户

  • --net 执行网络,保证和其他应用在一个网段,可以互相访问

  • --ip 指定ip,保证每次启动都时一个ip

2 redis

2.1 docker-Cluster集群

2.1.1 准备工作

1:拉取镜像

docker pull redis

2:配置网络

redis集群内部需要可以相互访问,所以需要配置在一个网段.目前已有网络配置:mynet 192.168.0.0/24 192.168.0.1

docker network inspect mynet
----
[
    {
        "Name": "mynet",
        "Id": "186dc9f1954f8c86be84349c50a555deee1ba36afd476b4e14bd92eefe4a0e38",
        "Created": "2023-07-25T16:36:43.191667995+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "76733ba5fdd1cf2a1bdffc3817727ac158b2f5297ea69200f7b3c0eae2b0f74d": {
                "Name": "redis",
                "EndpointID": "62058f3d1ebb2aa3f95e596a1e7d3b34b05996e68a900deb9bda3fd118afb788",
                "MacAddress": "02:42:c0:a8:00:06",
                "IPv4Address": "192.168.0.2/24",
                "IPv6Address": ""
            },
            .......
        },
        "Options": {},
        "Labels": {}
    }
]

3: 配置文件

使用shell批量创建配置文件.

这里集群数量设置为6个.内网ip为192.168.10~192.168.15

这里密码需要一致,方便结点间通信

#!/bin/bash

for port in $(seq 0 5)
do

mkdir -p /home/dockerdata/redis/node-700${port}/conf
touch /home/dockerdata/redis/node-700${port}/conf/redis.conf
cat  << EOF > /home/dockerdata/redis/node-700${port}/conf/redis.conf
port 6379
requirepass 1234
masterauth 1234
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
EOF
done

命令解释:😊

  • port:节点端口

  • requirepass:设置密码,访问时需要验证

  • masterauth:结点间访问密码

  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;

  • daemonize:是否以守护线程的方式启动(后台启动),默认 no

  • appendonly:是否开启 AOF 持久化模式,默认 no

  • cluster-enabled:是否开启集群模式,默认 no

  • cluster-config-file:集群节点信息文件

  • cluster-node-timeout:集群节点连接超时时间;

  • cluster-announce-ip:集群节点 IP

  • cluster-announce-port:集群节点映射端口;

  • cluster-announce-bus-port:集群节点总线端口。用于结点与结点之间交互数据

redis配置文件详细说明

2.2.2 启动容器

1: 启动redis容器

启动依旧采用shlle脚本启动.应该使用docker-comple更好

#!/bin/bash
for port in $(seq 0 5); \
do \
   docker run -d -p 700${port}:6379 -p 1700${port}:16379 \
  --privileged=true -v /home/dockerdata/redis/node-700${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  --privileged=true -v /home/dockerdata/redis/node-700${port}/data:/data \
  --restart always --name redis-700${port} --net mynet --ip 192.168.0.1${port}\
  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done

解释:🤑

  • -it:交互

  • -d:后台运行,容器启动完成后打印容器

  • –privileged:拥有root权限的操作,主要用于aof的写入

  • -p :端口映射

  • -v:文件挂载

  • –sysctl参数来设置系统参数,通过这些参数来调整系统性能

  • –restart always:在容器退出时总是重启容器

  • –name :给容器取名

  • –net myredis :使用我们创建的虚拟网卡 (想详细了解,可以去看看Docker 网络方面知识)

2: 创建Redis Cluster集群

## 进入主结点
docker exec -it redis-7000 /bin/bash

## 创建集群
redis-cli -a 1234 --cluster create 192.168.0.10:6379 192.168.0.11:6379 192.168.0.12:6379 192.168.0.13:6379 192.168.0.14:6379 192.168.0.10:6379 --cluster-replicas 1


## 进入redis
redis -cli -c -a 密码

## 查看集群信息
cluster info
cluster nodes

2.2.3 其他

批量停止

#!/bin/bash
for port in $(seq 0 5); \
do \
   docker stop redis-700${port}
done

批量删除

#!/bin/bash
for port in $(seq 0 5); \
do \
   docker rm redis-700${port}
done