目标需求:
密码登录+容器数据共享,主从复制
1.配置启动
添加配置文件夹,组织容器命令。
a.官方“未提供”相关信息
从测试容器中匹配搜索得到 mongod.conf.orig,设置可以启动,网上查找配置项反不能启动,原因是配置是yaml格式!好像听说过。百度查询得到:官方配置说明,网站卡得出奇。
b.启动配置
[]:~/tmp/dk/mongodb# docker run --rm --name mg1 -d mongo
#默认数据目录
root@199665dc0d08:/# ls /data/db -lh
total 268K
-rw------- 1 mongodb mongodb 45 Jun 29 23:39 WiredTiger
-rw------- 1 mongodb mongodb 21 Jun 29 23:39 WiredTiger.lock
... ...
# mongod.conf 删除了一些注释选项
# Where and how to store data.
storage:
#数据库数据存放目录
dbPath: /data/db
#启用日志文件,默认启用
journal:
enabled: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
#数据库日志存放目录
path: /var/log/mongodb/mongod.log
#静默模式,过滤掉一些无用的日志信息
quiet: true
# network interfaces
net:
port: 27017
bindIp: 192.168.0.4
security:
登录认证
authorization: "enable"
测试过程中主要错误有:
#对应命令 docker run -itd --name mg2 \
-e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v /root/tmp/dk/mongodb/mongod.conf:/etc/mongod.conf \
-v /root/tmp/dk/mongodb/mongod.log:/var/log/mongod.log \
-v /root/tmp/dk/mongodb/data:/data/db \
-d mongo --auth --config /etc/mongod.conf
Error saving history file: FileOpenFailed: Unable to open() file /home/mongodb/.dbshell: Unknown error
#对应命令 ...-d mongo [mongod ]--config (/etc/mongod.conf|空白46)
[main] ***** SERVER RESTARTED *****
[main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
killing process with pid: 30
这里mongod是处理参数的,没有不行,去掉d也不行,类似mysqld,结果正常的也就-d mongo mongod –auth结尾的。
其他还有无故错误可能是.conf配置的文件路径有问题,如:从上面得到的默认日志路径上级文件夹不存在(??bug),官方说明不清不楚,解决问题以减少配置为主,减少启动参数(逐个测试增加)。
c.运行容器
“意外的”官方参考地址,多次尝试命令(最终):
[]:~/tmp/dk/mongodb# docker stop mg2 && docker rm mg2 && rm -rf /root/tmp/dk/mongodb/data/* && \
docker run -itd --name mg2 \
-e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v /root/tmp/dk/mongodb/initdb:/home/mongodb/ \
-v /root/tmp/dk/mongodb/mongod.conf:/etc/mongod.conf \
-v /root/tmp/dk/mongodb/data:/data/db \
-d mongo mongod --auth
无法运行,带–config项时run后是exited状态,修改配置没反应(日志无报错、退出)。遂去除启动–config项。但这一切其实只是初始化而已。
后来测试发现是日志看多了,…-d mongo mongod –config /etc/mongod.conf结尾启动正常。
2.运行处理
a.加密数据、主从复制配置
这里只做简单配置(还有密钥文件认证),注意yaml双引号,添加:
security:
enableEncryption: true
#开启时默认如下
#encryptionCipherMode: "AES256-CBC"
replication:
oplogSizeMB: 20 #同步复制的日志大小设置,单位MB
#All hosts in the replica set must have the same set name.
replSetName: "repl"
#secondaryIndexPrefetch: "all"
#enableMajorityReadConcern: ture
sharding:
#shardsvr:a shard. The instance starts on port 27018 by default
#configsvr:a config server. The instance starts on port 27019 by default.
clusterRole: "shardsvr" #shardsvr|configsvr选一
#archiveMovedChunks: false
b.编写脚本添加
–权限:这边如果不是root登录的,要考虑对宿主机用户、容器用户使用的相关文件/夹进行授权。这里添加上面配置后容器反终止了,测试后,可以:先运行、再编辑配置文件、执行docker restart。数据库的关联操作同mysql,而比mysql更多的在命令交互界面执行。
#!/bin/bash
docker stop mg1 && docker rm mg1
docker stop mg2 && docker rm mg2
docker stop mg3 && docker rm mg3
cp -f mongodb/mongod.conf mongodb.a/mongod.conf && cp -f mongodb/mongod.conf mongodb.b/mongod.conf
#!!莫名其妙坑爹的问题
chmod 777 /root/tmp/dk/mongodb/mongod.log /root/tmp/dk/mongodb.a/mongod.log /root/tmp/dk/mongodb.b/mongod.log
rm -rf /root/tmp/dk/mongodb/data/* #&& echo ''>/root/tmp/dk/mongodb/mongod.log
docker run --name mg1 \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v /root/tmp/dk/mongodb/mongod.conf:/etc/mongod.conf \
-v /root/tmp/dk/mongodb/mongod.log:/var/log/mongod.log \
-v /root/tmp/dk/mongodb/data:/data/db \
-d mongo mongod --config /etc/mongod.conf
rm -rf /root/tmp/dk/mongodb.a/data/* #&& echo ''>/root/tmp/dk/mongodb.a/mongod.log
docker run --name mg2 \
-p 27018:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v /root/tmp/dk/mongodb.a/mongod.conf:/etc/mongod.conf \
-v /root/tmp/dk/mongodb.a/mongod.log:/var/log/mongod.log \
-v /root/tmp/dk/mongodb.a/data:/data/db \
-d mongo mongod --config /etc/mongod.conf
rm -rf /root/tmp/dk/mongodb.b/data/* #&& echo ''>/root/tmp/dk/mongodb.b/mongod.log
docker run --name mg3 \
-p 27019:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v /root/tmp/dk/mongodb.b/mongod.conf:/etc/mongod.conf \
-v /root/tmp/dk/mongodb.b/mongod.log:/var/log/mongod.log \
-v /root/tmp/dk/mongodb.b/data:/data/db \
-d mongo mongod --config /etc/mongod.conf
3.memcached、php镜像
a.memcached容器完善
— memcached容器:使用官方镜像说明地址,不作配置。
[]:~# docker run --name mc1 -p 11211:11211 -d memcached memcached -m 64
b.目前容器整体情况:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab0d148468aa memcached "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:11211->11211/tcp mc1
531976d71fab mongo "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:27019->27017/tcp mg3
4e60c4ef93eb mongo "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:27018->27017/tcp mg2
4319ec04a69a mongo "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:27017->27017/tcp mg1
2d65770f1e6c openresty/openresty "/usr/bin/openresty …" 21 hours ago Up 21 hours 0.0.0.0:82->80/tcp n2
2f0f0357aa69 openresty/openresty "/usr/bin/openresty …" 21 hours ago Up 21 hours 0.0.0.0:80->80/tcp n1
1c906a7afeba cffycls/redis5:1.6 "redis-server /etc/r…" 21 hours ago Up 21 hours 0.0.0.0:6381->6379/tcp rs
5c71dcc1ab36 cffycls/redis5:1.6 "redis-server /etc/r…" 21 hours ago Up 21 hours 0.0.0.0:6379->6379/tcp rm
2b4c57614d22 mysql:8.0 "docker-entrypoint.s…" 2 days ago Up 31 hours 33060/tcp, 0.0.0.0:3308->3306/tcp ms
2635980cf576 mysql:8.0 "docker-entrypoint.s…" 2 days ago Up 31 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mm
mysql、redis是主从,mongodb3个相同、memcached一个。个人主要是测试,这里不过多配置了。
— php容器:php7镜像后续简化对php(fpm版)的镜像进行了优化,提交到cffycls/php7,到1.0版+:带自定义扩展的比官网镜像小。后续运行的容器数视情况而定。
c.连接php-nginx
docker容器间的连接方式有:
–虚拟名称连接 –link=xx 的运行参数
–默认虚拟ip连接 容器之间要在一个网段,可以是默认
–自建虚拟ip [默认重启时ip可能会变化,采取自建加入、固定ip的方式]
这里运行连接比较复杂,单独拿出来。
4.运行php-nginx容器并连接
这里由于web目录对于容器来讲是固定的,所以php、nginx所对应容器的html目录都统一映射到/root/tmp/dk/html这个公共目录。
a.php运行
这里重新修改了php的dockerfile,固定ip方便代理。
— php容器,建立脚本如下:
[注意php-fpm.d/www.conf中监听端口设为:0.0.0.0,其他可默认]
#docker network create mybridge --subnet=172.1.0.0/16
docker stop p1 p2 p3 && docker rm p1 p2 p3
docker run --name p1 --network=mybridge --ip=172.1.1.11 \
-v /root/tmp/dk/php.a/config:/usr/local/php/etc \
-v /root/tmp/dk/php.a/fpm.log:/usr/local/php/var/log/php-fpm.log \
-v /root/tmp/dk/html:/var/www/html \
-itd cffycls/php7:1.6
docker run --name p2 --network=mybridge --ip=172.1.1.12 \
-v /root/tmp/dk/php.b/config:/usr/local/php/etc \
-v /root/tmp/dk/php.b/fpm.log:/usr/local/php/var/log/php-fpm.log \
-v /root/tmp/dk/html:/var/www/html \
-itd cffycls/php7:1.6
docker run --name p3 --network=mybridge --ip=172.1.1.13 \
-v /root/tmp/dk/php.c/config:/usr/local/php/etc \
-v /root/tmp/dk/html:/var/www/html \
-v /root/tmp/dk/php.c/fpm.log:/usr/local/php/var/log/php-fpm.log \
-itd cffycls/php7:1.6
b.nginx运行
openresty脚本
docker stop n1 n2 && docker rm n1 n2
#--privileged=true 容器内root权限运行
docker run -itd --name n1 -p 8080:80 --network=mybridge \
--privileged=true \
-v /root/tmp/dk/openresty.a/conf:/usr/local/openresty/nginx/conf \
-v /root/tmp/dk/openresty.a/logs:/usr/local/openresty/nginx/logs \
-v /root/tmp/dk/html:/usr/local/openresty/nginx/html openresty/openresty
docker run -itd --name n2 -p 8082:80 --network=mybridge \
--privileged=true \
-v /root/tmp/dk/openresty.b/conf:/usr/local/openresty/nginx/conf \
-v /root/tmp/dk/openresty.b/logs:/usr/local/openresty/nginx/logs \
-v /root/tmp/dk/html:/usr/local/openresty/nginx/html openresty/openresty
nginx配置部分:
http {
upstream fpm_pool{
server 172.1.1.11:9000 weight=5;
server 172.1.1.12:9000 weight=2;
server 172.1.1.13:9000 weight=2;
}
...
location ~ \.php$ {
#proxy_pass http://192.168.0.4:9000; 协议不对,不是tcp转发
root html;
fastcgi_index index.php;
fastcgi_pass fpm_pool;
# --php-fpm 的工作目录,对应到共享到容器中的目录 !!
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
...
}
c.打印phpinfo
上面已经把相应的php-fpm日志,nginx访问日志映射到主机,供调试修改运行参数。
直到看到phpinfo的结果页面,环境完成。
接下来计划针对,一些实际应用场景进行实践验证。