密碼登陸+容器數據共享,主從複製php
添加配置文件夾,組織容器命令。html
從測試容器中匹配搜索獲得 mongod.conf.orig,設置能夠啓動,網上查找配置項反不能啓動,緣由是配置是yaml格式!好像據說過。百度查詢獲得:官方配置說明,網站卡得出奇。mysql
[]:~/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"
測試過程當中主要錯誤有:nginx
#對應命令 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),官方說明不清不楚,解決問題以減小配置爲主,減小啓動參數(逐個測試增長)。git
「意外的」官方參考地址,屢次嘗試命令(最終):github
[]:~/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結尾啓動正常。web
這裏只作簡單配置(還有密鑰文件認證),注意yaml雙引號,添加:redis
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
--權限:這邊若是不是root登陸的,要考慮對宿主機用戶、容器用戶使用的相關文件/夾進行受權。這裏添加上面配置後容器反終止了,測試後,能夠:先運行、再編輯配置文件、執行docker restart。數據庫的關聯操做同mysql,而比mysql更多的在命令交互界面執行。sql
#!/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
-- memcached容器:使用官方鏡像說明地址,不做配置。mongodb
[]:~# docker run --name mc1 -p 11211:11211 -d memcached memcached -m 64
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版+:帶自定義擴展的比官網鏡像小。後續運行的容器數視狀況而定。
docker容器間的鏈接方式有:
--虛擬名稱鏈接 --link=xx 的運行參數
--默認虛擬ip鏈接 容器之間要在一個網段,能夠是默認
--自建虛擬ip [默認重啓時ip可能會變化,採起自建加入、固定ip的方式]
這裏運行鏈接比較複雜,單獨拿出來。
這裏因爲web目錄對於容器來說是固定的,因此php、nginx所對應容器的html目錄都統一映射到/root/tmp/dk/html這個公共目錄。
這裏從新修改了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
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; } ... }
上面已經把相應的php-fpm日誌,nginx訪問日誌映射到主機,供調試修改運行參數。
直到看到phpinfo的結果頁面,環境完成。
接下來計劃針對,一些實際應用場景進行實踐驗證。