成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

mongo EOF(二)

dreambei / 3273人閱讀

摘要:容器訪問以為例,在原始的文件中,如下上面的配置,本地主機是無法訪問容器的,我們至少需要暴露出一個端口。查看,的默認端口其實是,而這里寫成也是有原因的。

任何事情的成功都需要掐準時間

上一節(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_on
However, 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
      - mongo3
entrypoint
Entrypoint sets the command and parameters that will be executed first when a container is run.

entrypoint設(shè)置了容器啟動時執(zhí)行的命令和參數(shù),傳遞給docker run 的參數(shù)都將追加到entrypoint命令之后,并且會覆蓋CMD命令。比如,docker run bash 將會追加bashentrypoint命令末尾。

命令的語法格式:

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í)行initiatemongo的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)整creatordockerfile文件,因為此時的容器內(nèi),并沒有我們需要的相關(guān)文件。我們需要在創(chuàng)建鏡像的時候,拷貝本地文件到容器。調(diào)整后的文件如下:

FROM mongo:4.0.4

MAINTAINER Yowko Tsai 

WORKDIR /data/conf

COPY ./setup.sh /data/conf/setup.sh
COPY ./replicaSet.js /data/conf/replicaSet.js

CMD ["./setup.sh"]

在項目的目錄下,我們多帶帶編譯creatordockerfile文件,已保證調(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)介紹過portsexpose的相關(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 -it  bash 
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

相關(guān)文章

  • 深入解析 MongoDB Plan Cache

    摘要:所以在掃描次后,率先到達狀態(tài),那么此刻將停止掃描,進入到算分的階段。除了這條引發(fā)故障的之外,其他的字段命中索引數(shù)量都非常小,有的甚至只有一條。那這里很明顯在中只去根據(jù)中執(zhí)行計劃的相關(guān)索引來進行判斷是不合理的。 前段時間筆者遇到一個MongoBD Plan Cache的bug,于是深究了下MongoDB優(yōu)化器相關(guān)源碼。在這里分享給大家,一方面讓大家知道MongoDB優(yōu)化器工作原理,一方面...

    Pluser 評論0 收藏0
  • 如何編寫簡單的parser(實踐篇)

    摘要:負責(zé)讀取和記錄當(dāng)前代碼的位置,并把讀取到的代碼交給處理,其意義在于,當(dāng)傳遞給的代碼需要進行判讀猜測時,能夠記錄當(dāng)前讀取的位置,并在接下來的操作匯總回滾到之前的讀取位置,也能在發(fā)生語法錯誤時,準確指出錯誤發(fā)生在代碼段的第幾行第幾個字符。 上一篇(《如何編寫簡單的parser(基礎(chǔ)篇)》)中介紹了編寫一個parser所需具備的基礎(chǔ)知識,接下來,我們要動手實踐一個簡單的parser,既然是簡...

    shaonbean 評論0 收藏0
  • 最簡單的dockerfile使用教程 - 創(chuàng)建一個支持SSL的Nginx鏡像

    摘要:為此我首先需要創(chuàng)建一個針對的配置文件。的作用是指定基準鏡像。該以后面指定的鏡像為基礎(chǔ),在其上進行定制。存在一個特殊的鏡像,名為。它是一個虛擬的概念,表示一個空白的鏡像。直接使用會讓鏡像體積更加小巧。 什么是dockerfile?簡單的說就是一個文本格式的腳本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令負責(zé)描述鏡像的當(dāng)前層(Layer)如何構(gòu)建。 下面通過一個具體的...

    xiaolinbang 評論0 收藏0
  • Docker入門()在docker使用MongoDB

    摘要:本文將介紹如何在中使用。如果你是一名的初學(xué)者,那么你入門的第一件事就是安裝,但是安裝又不是一件簡單的事情,還需要自己配置一些服務(wù)。這時候,就能幫上大忙,它能夠讓你不需要本地安裝就能使用。下面讓我們來看看這是怎么實現(xiàn)的。 ??本文將介紹如何在docker中使用MongoDB。??如果你是一名MongoDB的初學(xué)者,那么你入門MongoDB的第一件事就是安裝MongoDB,但是安裝Mong...

    gaomysion 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<