使用docker-compose首先需要先安装 docker和docker-compose
# step 0:卸载旧版本 没有装的可以直接跳过
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# Step 5: 安装校验
docker version
# Step 0:拉取镜像(国内镜像源拉取)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# Step 1:赋权,运行一个命令试试是否安装成功
docker-compose
常用docker-compose指令:
1、查看配置命令:docker-compose config
2、后台启动:docker-compose up -d
3、构建镜像:docker-compose bulid
4、下载镜像:docker-compose pull
5、查看运行的镜像:docker-compose ps
6、查看进程:docker-compose top
7、启动已存在的容器命令:docker-compose start
8、停止正在运行的容器命令:docker-compose stop
9、查看服务日志输出:docker-compose logs
配置文件详解:
1、keyfile:MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集,且副本集所有成员的keyFile内容必须相同。
2、volumes :主要是挂载的文件地址;
3、 chown 999:999 /data/mongodb.key 999用户是容器中的mongod用户,通过chown修改文件用户权限
4、 mongod --replSet mongos --keyFile /data/mongodb.key 启动命令, --replSet mongos 以副本集形式启动并将副本集名字命名为 mongos , --keyFile /data/mongodb.key 设置keyFile,用于副本集通信,文件通过 volumes 映射到容器内
5、networks 创建容器在同一局域网下,容器之间通信;
6、environment:配置环境变量,mongo的账号密码
7、image:拉取的mongo镜像,如果没有提前拉取,再执行docker-compose文件会自动去拉取镜像
生成keyfile命令
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
docker-compose.yml:
version: '3.1'
services:
mongodb1:
image: mongo:latest
restart: always
container_name: mongo1
volumes:
- ./db/mongo1:/data/db
- ./db/mongo1/conf/mongo1.conf:/etc/mongod.conf.orig
- ./mongodb.key:/data/mongodb.key
ports:
- 27017:27017
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
networks:
- mongoNetwork
command: mongod --replSet mongos --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongodb2:
image: mongo:latest
restart: always
container_name: mongo2
volumes:
- ./db/mongo2:/data/db
- ./db/mongo2/conf/mongo2.conf:/etc/mongod.conf.orig
- ./mongodb.key:/data/mongodb.key
ports:
- 27018:27017
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
networks:
- mongoNetwork
command: mongod --replSet mongos --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
mongodb3:
image: mongo:latest
restart: always
container_name: mongo3
volumes:
- ./db/mongo3:/data/db
- ./mongodb.key:/data/mongodb.key
- ./db/mongo3/conf/mongo3.conf:/etc/mongod.conf.orig
ports:
- 27019:27017
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
networks:
- mongoNetwork
command: mongod --replSet mongos --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
networks:
mongoNetwork:
driver: bridge
PS:挂载的目录最好提前先创建好,注意创建的文件是文件夹还是文件(例如:mongo1.conf是文件而不是文件夹)
切换到docker-compose.yml所在目录,执行命令docker-compose up -d启动数据库,-d 表示后台启动并运行所有的容器。
2、通过命令 docker exec -it mongo1 /bin/bash 进入容器进行配置;
3、通过 Shell 连接 MongoDB 然后就可以执行mongo中的相应命令 :mongosh -u root -p root;
4、配置副本集,使用 rs.initiate() 触发选举,并选举出一个成员作为primary。
rs.initiate({
_id: "mongos",
members: [
{ _id : 0, host : "192.168.0.1:27017" },
{ _id : 1, host : "192.168.0.1:27018" },
{ _id : 2, host : "192.168.0.1:27019" }
]
});
5、执行rs.status()就可查看到成员信息
能看到members就代表初始化成功
新建mongodb连接
问题1:
"errmsg" : "no replset config has been received", "code" : 94,
错误原因:未初始化副本集群;
解决方案:使用初始化方法 rs.initiate()
问题2
MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string
错误原因:默认不允许从从节点读取数据,需要做一个配置才可以读取
解决方案:在从节点 执行 rs.secondaryOk()
问题3
ERROR: for mongo1 Cannot start service mongodb1: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/data/db/mongo1/conf/mongo1.conf" to rootfs at "/etc/mongod.conf.orig": mount /data/db/mongo1/conf/mongo1.conf:/etc/mongod.conf.oRecreating mongo2 ... error
xists and is the expected type
错误原因:在/data/db/mongo1/conf/mongo1.conf目录下创建的mongo1.conf是文件夹而不是.conf文件;