Moving to Docker(二)搭建一個私有registry服務

DockerOne 9年前發布 | 20K 次閱讀 Docker

本文轉自http://dockerone.com/article/174
【編者的話】本文是《Moving to Docker》系列的第二篇,這個系列的文章講述了創業公司如何把基礎服務遷移到Docker上,以及遷移過程中的經驗教訓。本文主要介紹了如何安裝、測試和使用私有registry服務,其中也包含了從DigitalOcean選VPS和注冊Amazon S3服務。


這是遷移到Docker系列的第二篇,整個系列都是介紹我們公司是如何把基礎設施從PaaS遷移到Docker的。

  • 第一篇:我會介紹在使用Docker之前我們的處理過程。
  • 第三篇:我會介紹如何自動化構建整個鏡像的過程以及如何用Docker部署Rails應用。
  • </ul>
    為什么我們想要搭建一個私有的registry?對于初學者,Docker Hub只允許你有一個免費的私有庫。雖然其他公司也開始提供類似的服務,但是價格也都不便宜。并且,如果你需要部署基于Docker的生產環境,你也不想將這些鏡像發布到公開的Docker Hub。

    這是一個非常務實的方法來處理搭建私有Docker registry的復雜過程。在這個教程中,我們會用一個512M的DigitalOcean機器。你需要具備Docker的基礎知識,因為我會引入一些復雜的東西。

    本地搭建

    首先,你需要安裝boot2dockerdocker CLI。如果你已經安裝了Docker的環境并運行著,可以跳過這一節了。

    從終端運行下面的命令:

    brew install boot2docker docker

    如果這一步安裝成功,就可以啟動一個供Docker運行的虛擬機,命令如下:

    boot2docker up

    根據說明,使用export命令,boot2docker會在終端輸出。如果你現在運行docker ps,你就可以看到下面的結果:

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

    現在,Docker已經安裝好了,下一步我們開始安裝registry。

    創建服務器

    登錄你的DigitalOcean賬號,并創建一個預安裝了Docker鏡像的Droplet,如下圖:

    s1.png

    你會在email中收到root用戶的登錄憑證。登陸并運行docker ps來確認機器可以正常工作。

    創建一個亞馬遜AWS S3

    我們準備去使用亞馬遜的簡單存儲服務(S3)作為我們registry的物理存儲。下面我們需要創建一個Bucket和用戶憑證來讓Docker容器使用它。

    登陸AWS賬號(如果你沒有,可以在http://aws.amazon.com/注冊一個),然后選擇S3服務,如下圖:

    s2.png


    點擊創建Bucket,輸入該Bucket的唯一碼(記下來,后面還要用到),然后點擊生成,如下圖:

    s3.png


    我們已經完成了創建存儲的部分。

    安裝AWS登陸憑證

    接下來我們將創建一個新用戶。回到AWS的控制臺界面,選擇IAM(Identity & Access Management)。

    s4.png


    你會看到下面這個界面:

    s5.png


    用戶需要授權密鑰來啟用通過REST或者Query協議來連接AWS的服務API。如果需要連接AWS的管理終端,在完成這個向導(下面這段英文)之后在用戶面板創建一個密碼就行。

    Enter a name for your user (e.g. docker-registry) and click on Create. Write down (or download the csv file with) your Access Key and Secret Access Key that we'll need when running the Docker container. Go back to your users list and select the one you just created.


    Under the Permission section, click on Attach User Policy. In the next screen, you will be presented with multiple choices: select Custom Policy.

    設置權限

    選擇一個策略模板,創建一個策略或者自定義一個策略。策略是一個文檔,它包含一個或者多個權限,可以通過下面這個界面來修改策略或者通過用戶、組和角色頁面來修改。

    s7.png


    下面是一個自定義的策略:

    {
        "Version": "2012-10-17",
        "Statement": [
        {
        "Sid": "SomeStatement",
        "Effect": "Allow",
        "Action": [
            "s3:*"
            ],
        "Resource": [
            "arn:aws:s3:::docker-registry-bucket-name/*",       
            "arn:aws:s3:::docker-registry-bucket-name"
            ]
        }
    ]
    }

    這樣可以允許用戶(例如:registry)在Bucket上操作(當創建AWS S3之前確認bucket已經創建完成)。簡而言之:當你要準備把Docker鏡像從本地機器發布到自己的庫里時,服務器將會把它們保存在S3上。

    安裝registry

    接下來,用SSH連接到DigitalOcean的虛擬機上。我們準備使用官方提供的registry鏡像

    用下面的命令啟動registry:

    docker run \  
         -e SETTINGS_FLAVOR=s3 \
         -e AWS_BUCKET=bucket-name \
         -e STORAGE_PATH=/registry \
         -e AWS_KEY=your_aws_key \
         -e AWS_SECRET=your_aws_secret \
         -e SEARCH_BACKEND=sqlalchemy \
         -p 5000:5000 \
         --name registry \
         -d \
         registry

    Docker會從Docker Hub上下載相應的fs層并啟動守護進程容器。

    測試registry

    如果前面都順利的話,接下來可以通過ping測試registry的服務并搜索它內部的內容(盡管現在它還是空的)。

    我們的registry是個非常基本的安裝,它并不提供任何權限上的控制。因為添加權限的方法都比較麻煩(至少我沒有發現哪個方法可以容易的實現并確認權限控制),我決定用最簡單的方法來查詢、下載和發布來使用registry,那就是利用ssh在HTTP協議上做一個不加密的隧道連接。

    通過下面的命令可以從你的機器創建一個隧道:

    ssh -N -L 5000:localhost:5000 root@your_registry.com  

    這條命令使得服務器(就是剛才docker run啟動的那個機器)的5000端口到本地的5000端口之間通過SSH協議做了一個隧道。

    如果你通過http://localhost:5000/v1/_ping來請求,你會得到一個簡單結果:

    {}

    這說明你的registry已經正常工作了。通過http://localhost:5000/v1/search可以列出整個registry中的內容,如下:

    {
        "num_results": 2,
        "query": "",
        "results": [
            {
                "description": "",
                "name": "username/first-repo"
            },
            {
      "description": "",
      "name": "username/second-repo"
            }
        ]
    }

    創建一個鏡像

    下面我們嘗試創建一個非常簡單的鏡像來測試我們的registry服務。在本地機器上創建如下內容的Dockerfile:

    # Base image with ruby 2.2.0
    FROM ruby:2.2.0
    MAINTAINER Michelangelo Chasseur <michelangelo.chasseur@touchwa.re>  

    然后創建它

    docker build -t localhost:5000/username/repo-name .  

    其中localhost:5000部分非常重要:一個Docker鏡像的第一部分是告訴docker push應該把鏡像發布到哪兒。在我們的例子中,因為我們通過SSH連接了我們的私有registy到本地的5000端口,于是localhost:5000就是指代我們的registry。

    如果運行的正常,當這個命令返回結果后,你可以通過docker images來查看新創建的鏡像了,請自己嘗試一下。

    發布到registry

    接下來介紹一些技巧。我也花了一些時間來弄明白自己要介紹的東西,所以如果你第一次沒看懂,請保持耐心并嘗試。我知道這些東西看起來很復雜(如果你沒有自動化這個過程,它確實很復雜),但是我保證它們都是有意義的。接下來的一篇,我會展示一堆shell腳本和Rake任務,它們將把整個過程自動化,方便你用一條簡單的命令來部署一個Rails應用到你的registry。

    你從本地終端運行的docker命令確實是用boot2docker虛擬機來運行容器并且做了所有的操作。于是我們運行一條像docker push some_repo的命令時,就是boot2docker 虛擬機在連接registry而不是我們本地的。

    這是非常重要的一點:為了發布Docker鏡像到遠端私有registry,SSH隧道需要被boot2docker虛擬機創建而不是從給你的本機。

    這里有幾種方法來實現它,我會介紹最簡潔的一種(它并不是最容易理解的,卻是它可以幫助我們通過shell腳本來自動化這個過程)。

    建立SSH

    先來添加boot2docker的SSH密鑰到遠端registry服務器的known hosts.我們可以通過ssh-copy-id功能,它可以用如下命令來安裝:

    brew install ssh-copy-id

    然后運行:

    ssh-copy-id -i /Users/username/.ssh/id_boot2docker root@your-registry.com  

    請確保/Users/username/.ssh/id_boot2docker是你的ssh密鑰的正確路徑。

    然后我們來測試一下:

    boot2docker ssh "ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re &" &  
    解釋下:

    • boot2docker ssh可以讓你傳遞一條命令作為參數讓boot2docker虛擬機來執行
    • 最后的&來保證我們的命令在后臺運行
    • ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re &才是虛擬機真正執行的。

      • -o 'StrictHostKeyChecking no'部分可以確保不用回答設置的安全問題
      • -i /Users/michelangelo/.ssh/id_boot2docker來說明我們希望虛擬機使用的授權SSH密鑰(這個需要是在上一步添加給遠端registry服務的那個密鑰)。
      • 最后我們打開了一個隧道來連接遠端5000端口和本地的5000端口
      • </ul> </li> </ul>

        從別的服務器下載

        現在你可以通過下面的命令來實現從遠端registry服務發布鏡像:

        docker push localhost:5000/username/repo_name  

        在接下來的本系列第三篇,我會介紹如何自動化這些步驟并且我們會把一個實際Rails應用容器化。
        請保持關注!

        P.S. 請留言關于我的教程中的任何不一致或者錯誤的地方。希望你會喜歡。

        1. 前提是你也在用OS X系統
        2. 請參考http://boot2docker.io/中完整的說明來安裝你的docker環境和相關的依賴。
        3. 本文的環境選擇是Image>Applications>Docker 1.4.1 on 14.04
        4. 參考https://github.com/docker/docker-registry/
        5. 這只是一小部分,下一篇我會介紹你如何把一個Rails應用打包進一個Docker容器。
 本文由用戶 DockerOne 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!