Docker 上開發 nodejs

參考 https://yeasy.gitbooks.io/doc...node

Docker介紹

Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,聽從了 Apache 2.0 協議,項目代碼在 GitHub上進行維護。python

Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。
下面的圖片比較了 Docker 和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化,直接複用本地主機的操做系統,而傳統方式則是在硬件層面實現。
Alt
Altgit

Docker的優點

做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。docker

首先,Docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。npm

容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。json

我理解的Docker

目前,我在使用docker的過程當中基本上是本地開發好項目以後,生成dist文件目錄,遷移到docker當中,至關於只在生產環境開發使用docker,緣由主要有如下幾點:centos

  1. 在開發環境使用docker感受仍是不是很舒服,每次修改都要從新build,以及run,比較麻煩,本地開發更加舒服;ruby

  2. docker實際上能夠看作是一個封閉的盒子,想作一些查看和操做仍是有點麻煩的的,交互性不是很好,感受比較適合生產環境。bash

Docker hub介紹

目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了超過 15,000 的鏡像,大部分需求,均可以經過在 Docker Hub 中直接下載鏡像來實現。app

登錄

能夠經過執行 docker login 命令來輸入用戶名、密碼和郵箱來完成註冊和登陸。 註冊成功後,本地用戶目錄的 .dockercfg 中將保存用戶的認證信息。

docker login --username=username --email=email@gmail.com

下載

根據是不是官方提供,可將鏡像資源分爲兩類。 一種是相似 centos 這樣的基礎鏡像,被稱爲基礎或根鏡像。這些基礎鏡像是由 Docker 公司建立、驗證、支持、提供。這樣的鏡像每每使用單個單詞做爲名字。 還有一種類型,好比 tianon/centos 鏡像,它是由 Docker 的用戶建立並維護的,每每帶有用戶名稱前綴。能夠經過前綴 user_name/ 來指定使用某個用戶提供的鏡像,好比 tianon 用戶。

docker pull apline
// or
docker pull mhart/alpine-node-auto

提交

修改當前鏡像以後須要提交修改後的鏡像,修改一次鏡像包括提交的過程以下:

先使用下載的鏡像啓動容器。

docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

注意:記住容器的 ID,稍後還會用到。
在容器中添加 json package(一個 ruby gem)。

root@0b2616b0e5a8:/# gem install json

當結束後,咱們使用 exit 來退出,如今咱們的容器已經被咱們改變了,使用 docker commit 命令來提交更新後的副本。

docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 來指定提交的說明信息,跟咱們使用的版本控制工具同樣;-a 能夠指定更新的用戶信息;以後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名和 tag 信息。建立成功後會返回這個鏡像的 ID 信息。

使用 docker images 來查看新建立的鏡像。

以後,可使用新的鏡像來啓動容器

$ docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

上傳

用戶能夠經過 docker push 命令,把本身建立的鏡像上傳到倉庫中來共享。例如,用戶在 Docker Hub 上完成註冊後,能夠推送本身的鏡像到倉庫中。

$ docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)

修改鏡像的標籤

用 docker tag 命令來修改鏡像的標籤。

$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
REPOSITORY          TAG     IMAGE ID      CREATED        VIRTUAL SIZE
ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB

利用 Dockerfile 來建立鏡像

使用 docker commit 來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。咱們可使用 docker build 來建立一個新的鏡像。爲此,首先須要建立一個 Dockerfile,包含一些如何建立鏡像的指令。

Dockerfile 中每一條指令都建立鏡像的一層,例如:

# Dockerfile.alpine
FROM mhart/alpine-node:latest
MAINTAINER zhanfang "fzhanxd@gmail.com"

# If you have native dependencies, you'll need extra tools
# RUN apk add --no-cache make gcc g++ python

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# If your project depends on many package, you can use cnpm instead of npm
# RUN npm install cnpm -g --registry=https://registry.npm.taobao.org

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install --registry=https://registry.npm.taobao.org

# Bundle app source
COPY . /usr/src/app

# Expose port
EXPOSE 3000

CMD [ "npm", "start" ]

編寫完成 Dockerfile 後可使用 docker build 來生成鏡像。

docker build -t alpine-koa2-startkit .

其中 -t 標記來添加 tag,指定新的鏡像的用戶信息。 「.」 是 Dockerfile 所在的路徑(當前目錄),也能夠替換爲一個具體的 Dockerfile 的路徑。

Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟以前介紹過的 docker commit 同樣)。當全部的指令都執行完畢以後,返回了最終的鏡像 id。全部的中間步驟所產生的容器都被刪除和清理了。

注意一個鏡像不能超過 127 層

完成一次鏡像的下載、修改和上傳

以alpine-node-auto鏡像爲基礎

  1. 下載基礎鏡像

    docker pull mhart/alpine-node-auto
  2. 編寫dockerfile

    # Dockerfile.alpine
    FROM mhart/alpine-node:latest
    MAINTAINER zhanfang "fzhanxd@gmail.com"
    
    # If you have native dependencies, you'll need extra tools
    # RUN apk add --no-cache make gcc g++ python
    
    # Create app directory
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    # If your project depends on many package, you can use cnpm instead of npm
    # RUN npm install cnpm -g --registry=https://registry.npm.taobao.org
    
    # Install app dependencies
    COPY package.json /usr/src/app/
    RUN npm install --registry=https://registry.npm.taobao.org
    
    # Bundle app source
    COPY . /usr/src/app
    
    # Expose port
    EXPOSE 3000
    
    CMD [ "npm", "start" ]
  3. 建立新的鏡像

    docker build -t=zhanfang/alpine-koa2-startkit:v1" .

    打上 alpine-koa2-startkit:v1 的 tag

  4. 運行一個容器實例

    docker run -t -i --name alpine-koa2-application zhanfang/alpine-koa2-startkit:v2
  5. 上傳鏡像(若是沒有登陸請登錄,使用login命令)

    docker push zhanfang/alpine-koa2-startkit
相關文章
相關標籤/搜索