摘要:容器訪問以為例,在原始的文件中,如下上面的配置,本地主機是無法訪問容器的,我們至少需要暴露出一個端口。查看,的默認端口其實是,而這里寫成也是有原因的。
任何事情的成功都需要掐準時間
上一節(jié)mongo EOF中,關(guān)于容器的配置,只是粗略的使用了Docker-Compose-MongoDB-Replica-Set項目提供好的docker-compose.yml文件。在使用過程中,我發(fā)現(xiàn)這個文件本身一些不如意的地方。首先,services中的creator服務(wù),entrypoint指令太長了,不美;其次,所有的service都沒有給容器外部暴露端口,導(dǎo)致外部無法訪問容器;再次,直接使用mongo repliSet的連接串進行訪問,無法正常訪問mongo服務(wù)。
在上一篇文章的基礎(chǔ)上,這篇文章對docker-compse.yml做了一些調(diào)整,并且也包含了docker使用的入門介紹。更新后的docker-compose.yml請訪問githubsi。
depends_onHowever, for startup Compose does not wait until a container is “ready” (whatever that means for your particular application) - only until it’s running. There’s a good reason for this.
在creator service中使用了該指令, 但是,實際中creator不會等到mongo1、mongo2、mongo3容器ready后再啟動,而是等到它們啟動就開始啟動。這也是我在setup腳本中執(zhí)行sleep操作的原因。
creator: build: context: . dockerfile: dockerfile entrypoint: ["/data/conf/setup.sh"] depends_on: - mongo1 - mongo2 - mongo3entrypoint
Entrypoint sets the command and parameters that will be executed first when a container is run.
entrypoint設(shè)置了容器啟動時執(zhí)行的命令和參數(shù),傳遞給docker run
命令的語法格式:
ENTRYPOINT ["executable" "param1" "param2"]
在修改后的docker-compose.yml中,entrypoint指令用于執(zhí)行shell腳本。按照規(guī)范來說,可執(zhí)行文件名稱中需要包含entrypoint字段,也就是將下列指令中的setup.sh重命名為setup-entrypoint.sh。但是,重命名之后的文件,容器執(zhí)行會報錯,所以,這里也并沒有使用這個規(guī)范。
entrypoint: ["/data/conf/setup.sh"]調(diào)整creator中的entrypoint指令
原始的文件如下所示,entrypoint指令的參數(shù)非常難看:
creator: build: creator entrypoint: ["mongo","--host","mongo1","--port","27017","--eval", "rs.initiate( { _id : "rs0",members: [{ _id: 0, host: "mongo1:27017" },{ _id: 1, host: "mongo2:27017" },{ _id: 2, host: "mongo3:27017" } ]})"] depends_on: - mongo1 - mongo2 - mongo3
如果將entrypoint的執(zhí)行命令提取到一個多帶帶的的腳本中,會讓整個頁面看起來更加簡潔。所以,新建一個setup.sh文件。其中的replicaSet.js用于執(zhí)行rs.initiate操作,詳情可以查看github項目。其中的sleep指令只是為了保證:在執(zhí)行initiate時mongo的3個服務(wù)都啟動了。
#! /bin/bash echo "******************************" echo Start the replica set echo `date` echo "******************************" sleep 20 | echo Sleeping echo `date` mongo mongodb://mongo1:37017 replicaSet.js
相應(yīng)的,我們需要調(diào)整creator的dockerfile文件,因為此時的容器內(nèi),并沒有我們需要的相關(guān)文件。我們需要在創(chuàng)建鏡像的時候,拷貝本地文件到容器。調(diào)整后的文件如下:
FROM mongo:4.0.4 MAINTAINER Yowko TsaiWORKDIR /data/conf COPY ./setup.sh /data/conf/setup.sh COPY ./replicaSet.js /data/conf/replicaSet.js CMD ["./setup.sh"]
在項目的目錄下,我們多帶帶編譯creator的dockerfile文件,已保證調(diào)整是有效的。
docker build . docker run容器訪問
以mongo1為例,在原始的文件中,docker-compose.yml如下:
mongo1: container_name: mongo1 image: mongo:4-xenial expose: - 27017 restart: always entrypoint: [ "mongod", "--bind_ip_all", "--replSet", "rs0" ]
上面的配置,本地主機是無法訪問容器的,我們至少需要暴露出一個端口。下面通過添加ports來指定容器外到容器內(nèi)的端口映射。在上一篇中已經(jīng)介紹過ports和expose的相關(guān)內(nèi)容,感興趣的可以去查看。之后,我們就可以通過37017端口來訪問容器內(nèi)的mongo1服務(wù)了。
mongo1: container_name: mongo1 image: mongo:4.0.4 expose: - 37017 ports: - "37017:37017" restart: always entrypoint: [ "mongod", "--port", "37017", "--bind_ip_all", "--replSet", "rs0" ]
查看Default MongoDB Port,mongod的默認端口其實是27017,而這里寫成37017也是有原因的。未修改之前mongod的端口映射,如下所示。每個容器中的mongo服務(wù)都使用默認的27017端口,通過暴露不通的宿主主機端口來達到區(qū)分容器服務(wù)的目的。
mongo1: container_name: mongo1 image: mongo:4.0.4 expose: - 27017 ports: - "27017:27017" restart: always entrypoint: [ "mongod", "--bind_ip_all", "--replSet", "rs0" ] mongo2: container_name: mongo2 image: mongo:4.0.4 expose: - 27017 ports: - "27018:27017" restart: always entrypoint: [ "mongod", "--bind_ip_all", "--replSet", "rs0" ] mongo3: container_name: mongo3 image: mongo:4.0.4 expose: - 27017 ports: - "27019:27017" restart: always entrypoint: [ "mongod", "--bind_ip_all", "--replSet", "rs0" ]
在多帶帶連接mongo服務(wù)的時候,這樣的配置是沒有任何問題的。我們在命令行輸入mongo,也會連接到其中任意一個mongo服務(wù)。如果恰好連接的不是PRIMARY節(jié)點,可以執(zhí)行rs.slaveOk()來執(zhí)行查詢。
但當(dāng)使用replicaSet連接串來訪問mongo服務(wù)時,連接卻會失敗。看看這個連接串,感覺不出任何問題。
mongo mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/admin?replicaSet=rs0
看了報錯信息,才明白:當(dāng)執(zhí)行連接的時候,mongo會拉取replica set 的配置信息,而通過host去訪問的時候失敗了。很明顯:docker-compose容器內(nèi)可以將server name當(dāng)作host來相互訪問,但在容器外通過server name是訪問不通的。
changing hosts to rs0/mongo1:27017,mongo2:27017,mongo3:27017 from rs0/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019
另外,你還可以在容器內(nèi)部打開/etc/hosts文件,查看容器內(nèi)映射的ip地址,容器外也是ping不通的。我們可以通過下面的指令進入容器查看:
docker exec -itbash less /etc/hosts
解決的辦法是,我們在本地主機上追加host。但這樣的話,rs0其實只有一個節(jié)點,因為都映射到了127.0.0.1:27017這個容器上。
# file: /etc/hosts 127.0.0.1 mongo1, mongo2, mongo3
基于這個原因,我們修改了容器內(nèi)外暴露的端口。同時,修改各個服務(wù)mongod啟動時的默認端口以及replica set的配置信息:
mongo1: container_name: mongo1 image: mongo:4.0.4 expose: - 37017 ports: - "37017:37017" restart: always entrypoint: [ "mongod", "--port", "37017", "--bind_ip_all", "--replSet", "rs0" ] mongo2: container_name: mongo2 image: mongo:4.0.4 expose: - 37018 ports: - "37018:37018" restart: always entrypoint: [ "mongod", "--port", "37018", "--bind_ip_all", "--replSet", "rs0" ] mongo3: container_name: mongo3 image: mongo:4.0.4 expose: - 37019 ports: - "37019:37019" restart: always entrypoint: [ "mongod", "--port", "37019", "--bind_ip_all", "--replSet", "rs0" ]
// file :replicaSet.js rsconf = { _id: "rs0", members: [ {_id: 0, host: "mongo1:37017"}, {_id: 1, host: "mongo2:37018"}, {_id: 2, host: "mongo3:37019"} ] } rs.initiate(rsconf); rs.conf();
做了這些修改,我們就可以正常訪問mongo服務(wù)了:
mongo mongodb://mongo1:37017,mongo2:37018,mongo3:37019/admin?replicaSet=rs0啟動服務(wù)
首先,我們看看鏡像能不能順利編譯過去:
docker-compose -f docker-compose.yml build
其次,我們啟動容器服務(wù):
docker-compose -f docker-compose.yml up
最后,關(guān)閉容器服務(wù)。這個命令相當(dāng)于依次執(zhí)行docker container stop、docker-compose down,很方便。
docker-compose -f docker-compose.yml down總結(jié)
執(zhí)行上一篇的測試用例,然后中途關(guān)閉一個節(jié)點,來查看執(zhí)行效果。
啟動容器:
docker-compose -f docker-compose.yml down
查看容器的運行情況:
docker ps
關(guān)閉其中一個容器:
docker container stop
服務(wù)短暫的輸出.no reachable servers錯誤信息后,由恢復(fù)正常了!
備注看到這里的人,必須關(guān)注公眾號了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/27842.html
摘要:所以在掃描次后,率先到達狀態(tài),那么此刻將停止掃描,進入到算分的階段。除了這條引發(fā)故障的之外,其他的字段命中索引數(shù)量都非常小,有的甚至只有一條。那這里很明顯在中只去根據(jù)中執(zhí)行計劃的相關(guān)索引來進行判斷是不合理的。 前段時間筆者遇到一個MongoBD Plan Cache的bug,于是深究了下MongoDB優(yōu)化器相關(guān)源碼。在這里分享給大家,一方面讓大家知道MongoDB優(yōu)化器工作原理,一方面...
摘要:負責(zé)讀取和記錄當(dāng)前代碼的位置,并把讀取到的代碼交給處理,其意義在于,當(dāng)傳遞給的代碼需要進行判讀猜測時,能夠記錄當(dāng)前讀取的位置,并在接下來的操作匯總回滾到之前的讀取位置,也能在發(fā)生語法錯誤時,準確指出錯誤發(fā)生在代碼段的第幾行第幾個字符。 上一篇(《如何編寫簡單的parser(基礎(chǔ)篇)》)中介紹了編寫一個parser所需具備的基礎(chǔ)知識,接下來,我們要動手實踐一個簡單的parser,既然是簡...
摘要:為此我首先需要創(chuàng)建一個針對的配置文件。的作用是指定基準鏡像。該以后面指定的鏡像為基礎(chǔ),在其上進行定制。存在一個特殊的鏡像,名為。它是一個虛擬的概念,表示一個空白的鏡像。直接使用會讓鏡像體積更加小巧。 什么是dockerfile?簡單的說就是一個文本格式的腳本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令負責(zé)描述鏡像的當(dāng)前層(Layer)如何構(gòu)建。 下面通過一個具體的...
摘要:本文將介紹如何在中使用。如果你是一名的初學(xué)者,那么你入門的第一件事就是安裝,但是安裝又不是一件簡單的事情,還需要自己配置一些服務(wù)。這時候,就能幫上大忙,它能夠讓你不需要本地安裝就能使用。下面讓我們來看看這是怎么實現(xiàn)的。 ??本文將介紹如何在docker中使用MongoDB。??如果你是一名MongoDB的初學(xué)者,那么你入門MongoDB的第一件事就是安裝MongoDB,但是安裝Mong...
閱讀 1734·2021-11-23 10:07
閱讀 2733·2019-08-30 11:10
閱讀 2911·2019-08-29 17:08
閱讀 1851·2019-08-29 15:42
閱讀 3247·2019-08-29 12:57
閱讀 2462·2019-08-28 18:06
閱讀 3629·2019-08-27 10:56
閱讀 444·2019-08-26 11:33