Thursday, 27 July 2017

Hyperledger fabric 1.0 note

2017.7.25
   為了學 Hyperledger fabric 1.0
     開始學習 1. ubuntu  2. GOlang 3.Docker 4.vagrant

也看這個影片
https://www.youtube.com/channel/UC90Kw63c-FzGulDb_w2GFzw


        Docker intruction

        list all images
           - docker images

Dockerfile 是一個指令文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。


volume 容器運行時應該盡量保持容器存儲層不發生寫操作,對於數據庫類需要保存動態數據的應用,其數據庫文件應該保存於卷(volume)中

USER 指令和 WORKDIR 相似,都是改變環境狀態並影響以後的層。WORKDIR 是改變工作目錄,USER 則是改變之後層的執行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份。


如果要刪除本地的鏡像,可以使用 docker rmi 命令,其格式為:

       -    docker rmi [選項] <鏡像1> [<鏡像2> ...]

模板


在 config_sample.yml 文件中,可以看到一些現成的模板段:

common:基礎配置
local:存儲數據到本地文件系統
s3:存儲數據到 AWS S3 中
dev:使用 local 模板的基本配置
test:單元測試使用
prod:生產環境配置(基本上跟s3配置類似)
gcs:存儲數據到 Google 的雲存儲
swift:存儲數據到 OpenStack Swift 服務
glance:存儲數據到 OpenStack Glance 服務,本地文件系統為後備
glance-swift:存儲數據到 OpenStack Glance 服務,Swift 為後備
elliptics:存儲數據到 Elliptics key/value 存儲
用戶也可以添加自定義的模版段。

默認情況下使用的模板是 dev,要使用某個模板作為默認值,可以添加 SETTINGS_FLAVOR 到環境變量中,例如

export SETTINGS_FLAVOR=dev
另外,配置文件中支持從環境變量中加載值,語法格式為 _env:VARIABLENAME[:DEFAULT]。

示例配置

common:
    loglevel: info
    search_backend: "_env:SEARCH_BACKEND:"
    sqlalchemy_index_database:
        "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"

prod:
    loglevel: warn
    storage: s3
    s3_access_key: _env:AWS_S3_ACCESS_KEY
    s3_secret_key: _env:AWS_S3_SECRET_KEY
    s3_bucket: _env:AWS_S3_BUCKET
    boto_bucket: _env:AWS_S3_BUCKET
    storage_path: /srv/docker
    smtp_host: localhost
    from_addr: docker@myself.com
    to_addr: my@myself.com

dev:
    loglevel: debug
    storage: local
    storage_path: /home/myself/docker

test:
    storage: local
    storage_path: /tmp/tmpdockertmp


外部網絡


容器要想訪問外部網絡,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。

$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果為 0,說明沒有開啟轉發,則需要手動打開。

$sysctl -w net.ipv4.ip_forward=1
如果在啟動 Docker 服務的時候設定 --ip-forward=true, Docker 就會自動設定系統的 ip_forward 參數為 1。


容器之間訪問


容器之間相互訪問,需要兩方面的支持。

容器的網絡拓撲是否已經互聯。默認情況下,所有容器都會被連接到 docker0 網橋上。
本地系統的防火墻軟件 -- iptables 是否允許通過。

Docker 創建一個容器的時候,會執行如下操作:


創建一對虛擬接口,分別放到本地主機和新容器中;
本地主機一端橋接到默認的 docker0 或指定網橋上,並具有一個唯一的名字,如 veth65f9;
容器一端放到新容器中,並修改名字作為 eth0,這個接口只在容器的命名空間可見;
從網橋可用地址段中獲取一個空閑地址分配給容器的 eth0,並配置默認路由到橋接網卡 veth65f9。
完成這些之後,容器就可以使用 eth0 虛擬網卡來連接其他容器和其他網絡。

可以在 docker run 的時候通過 --net 參數來指定容器的網絡配置,有4個可選值:

--net=bridge 這個是默認值,連接到默認的網橋。
--net=host 告訴 Docker 不要將容器網絡放到隔離的命名空間中,即不要容器化容器內的網絡。此時容器使用本地主機的網絡,它擁有完全的本地主機接口訪問權限。容器進程可以跟主機其它 root 進程一樣可以打開低範圍的端口,可以訪問本地網絡服務比如 D-bus,還可以讓容器做一些影響整個主機系統的事情,比如重啟主機。因此使用這個選項的時候要非常小心。如果進一步的使用 --privileged=true,容器會被允許直接配置主機的網絡堆棧。
--net=container:NAME_or_ID 讓 Docker 將新建容器的進程放到一個已存在容器的網絡棧中,新容器進程有自己的文件系統、進程列表和資源限制,但會和已存在的容器共享 IP 地址和端口等網絡資源,兩者進程可以直接通過 lo 環回接口通信。
--net=none 讓 Docker 將新容器放到隔離的網絡棧中,但是不進行網絡配置。之後,用戶可以自己進行配置。

No comments:

Post a Comment

how-to-recursively-create-subfolder-in-each-folder-of-a-directory-in-cmd

test.cmd: @echo off setlocal for /f "usebackq tokens=*" %%a in (`dir /b /a:d`) do ( rem enter the directory pushd %%a echo...