Docker入門教程

Docker的前世此生:環境配置的難題->虛擬機->Linux容器->Docker

環境配置的難題

不一樣軟件和不一樣硬件的配合度不一,致使【"它在個人機器能夠跑了"(It works on my machine)】困境的存在。java

這就要求【操做系統的設置】和【各類庫和組件的安裝】都要正確。node

軟件是否能夠帶環境安裝?git

虛擬機

環境配置難題的一個解決方案,可是有問題:docker

資源佔用多、啓動慢、冗餘步驟多。npm

Linux容器(Linux Containers,縮寫爲 LXC)

考慮虛擬機技術的缺點,Linux 發展出了另外一種虛擬化技術:Linux 容器。瀏覽器

Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來講,它接觸到的各類資源都是虛擬的,從而實現與底層系統的隔離。bash

因爲容器是進程級別的,相比虛擬機有不少優點:服務器

體積小、啓動快、佔用資源少。網絡

Docker 是什麼:0.解決環境配置的難題;1.Linux容器的一種解決方案;2.能夠將程序與該程序的依賴打包在一個文件裏面(image)

Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案架構

Docker 將應用程序與該程序的依賴,打包在一個文件裏面運行這個文件,就會生成一個虛擬容器程序在這個虛擬容器裏運行,就好像在真實的物理機上運行同樣。有了 Docker,就不用擔憂環境問題。

整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。

Docker能夠組建微服務架構。經過多個容器,一臺機器能夠跑多個服務,所以在本機就能夠模擬出微服務架構

Docker 的安裝

Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫爲 CE)和企業版(Enterprise Edition,縮寫爲 EE)。企業版包含了一些收費服務,我的開發者通常用不到。

具體安裝請參考官網和文檔《★2.Docker實踐-安裝》。

安裝完成後,運行下面的命令,驗證是否安裝成功。【Win7下】

執行

docker version

命令

Docker 是服務器----客戶端架構。命令行運行docker命令的時候,須要本機有 Docker 服務。若是這項服務沒有啓動,能夠用下面的命令啓動

鏡像文件(image)、hello world、容器文件(container)

鏡像文件(image):容器(container)的模板,能夠生成多個同時運行的Docker容器實例

image的理解

Docker 把應用程序及其依賴,打包在 image 文件裏面。

image文件能夠生成Docker容器,能夠看作是容器的模板。image是靜態的,容器的動態的。

同一個image文件能夠生成多個同時運行的容器。

image的套路

image 是二進制文件。實際開發中,一個 image 文件每每經過繼承另外一個 image 文件,加上一些個性化設置而生成。舉例來講,你能夠在 Ubuntu 的 image 基礎上,往裏面加入 Apache 服務器,造成你的 image。

image 文件是通用的(相似於java中的.class文件)

image 文件是通用的,一臺機器的 image 文件拷貝到另外一臺機器,照樣可使用。

爲了節省時間應該儘可能使用別人製做好的 image 文件,而不是本身製做。即便要定製,也應該基於別人的 image 文件進行加工,而不是從零開始製做。

image現實中的使用

爲方便共享,image 文件製做完成後,能夠上傳到網上的倉庫。Docker 的官方倉庫 Docker Hub 是最重要、最經常使用的 image 倉庫。此外,出售本身製做的 image 文件也是能夠的。

image相關的命令

我本身系統中運行的實例

hello world實例

雙擊Docker Quickstart Terminal進入Docker Toolbox進行操做

將 image 文件從倉庫抓取到本地

$ docker image pull library/hello-world

上面代碼中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在倉庫裏面的位置,其中library是 image 文件所在的組,hello-world是 image 文件的名字

library組是Docker 官方提供的 image 文件的默認組,能夠省略。所以,上面的命令能夠寫成下面這樣。

$ docker image pull hello-world

抓取成功之後,就能夠在本機看到這個 image 文件了。

$ docker image ls

運行 image 文件

$ docker container run hello-world

docker container run命令會從 image 文件,生成一個正在運行的容器實例。

注意,docker container run命令具備自動抓取 image 文件的功能。若是發現本地沒有指定的 image 文件,就會從倉庫自動抓取。所以,前面的docker image pull命令並非必需的步驟。

運行成功後,hello world就會中止運行,容器自動終止。

對於那些不會自動終止的容器,必須使用docker container kill 命令手動終止

對於那些不會自動終止的容器,必須使用docker container kill 命令手動終止。

$ docker container kill [containID]

容器文件(container)

容器文件說明

image 文件生成的容器實例,自己也是一個文件,稱爲容器文件。也就是說,一旦容器生成,就會同時存在兩個文件: image 文件和容器文件。並且關閉容器並不會刪除容器文件,只是容器中止運行而已。

列出本機正在運行的容器 $ docker container ls  & 列出本機全部容器,包括終止運行的容器 $ docker container ls --all

上面命令的輸出結果之中,包括容器的 ID。不少地方都須要提供這個 ID,好比終止容器運行的docker container kill命令。

容器文件進一步的說明

終止運行的容器文件,依然會佔據硬盤空間,可使用docker container rm命令刪除。

$ docker container rm [containerID]

運行上面的命令以後,再使用docker container ls --all命令,就會發現被刪除的容器文件已經消失了。

★image命令總結

★★格式:docker image action [imageName] [other param]

列出本機的全部 image 文件:docker image ls

$ docker image ls

將 image 文件從倉庫抓取到本地:docker image pull hello-world

$ docker image pull library/hello-world

刪除 image 文件:docker image rm [imageName]

$ docker image rm [imageName]

爲本地的 image 標註用戶名和版本(打tag):docker image tag [imageName] [username]/[repository]:[tag]

$ docker image tag [imageName] [username]/[repository]:[tag]

# 實例

$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

構建 image 文件:docker image build -t [username]/[repository]:[tag]

$ docker image build -t [username]/[repository]:[tag] .

發佈 image 文件:docker image push [username]/[repository]:[tag]

$ docker image push [username]/[repository]:[tag]

★container命令總結

★★格式:docker container action [imageName]/[containerID]

列出本機正在運行的容器:docker container ls

$ docker container ls  

列出本機全部容器,包括終止運行的容器:docker container ls --all

$ docker container ls --all

運行 image 文件:docker container run [imageName]

$ docker container run [imageName]

終止容器:docker container kill [containerID]

$ docker container kill [containerID]

刪除容器文件:docker container rm [containerID]

$ docker container rm [containerID]

Dockerfile 文件:幫助生成/製做image 文件

一個文本文件,用來配置 image。Docker 根據 該文件生成二進制的 image 文件。

實例:製做本身的 Docker 容器

以 koa-demos 項目爲例,介紹怎麼寫 Dockerfile 文件,實現讓用戶在 Docker 容器裏面運行 Koa 框架。

  1. 編寫 Dockerfile 文件

排除不須要的路徑

在項目的根目錄下,新建一個文本文件.dockerignore,寫入下面的內容。

.git

node_modules

npm-debug.log

上面代碼表示,這三個路徑要排除,不要打包進入 image 文件。若是沒有路徑要排除,這個文件能夠不新建。

新建一個文本文件 Dockerfile

在項目的根目錄下,新建一個文本文件 Dockerfile,寫入下面的內容:

FROM node:8.4

COPY . /app

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org

EXPOSE 3000

上面代碼一共五行,含義以下

FROM node:8.4:該 image 文件繼承官方的 node image,冒號表示標籤,這裏標籤是8.4,即8.4版本的 node。

COPY . /app:將當前目錄下的全部文件(除了.dockerignore排除的路徑),都拷貝進入 image 文件的/app目錄。

WORKDIR /app:指定接下來的工做路徑爲/app。

RUN npm install:在/app目錄下,運行npm install命令安裝依賴。注意,安裝後全部的依賴,都將打包進入 image 文件。

EXPOSE 3000:將容器 3000 端口暴露出來,容許外部鏈接這個端口。

  1. 建立 image 文件

有了 Dockerfile 文件之後,就可使用docker image build命令建立 image 文件了。

$ docker image build -t koa-demo .

# 或者

$ docker image build -t koa-demo:0.0.1 .

上面代碼中,-t參數用來指定 image 文件的名字,後面還能夠用冒號指定標籤。若是不指定,默認的標籤就是latest。最後的那個點表示 Dockerfile 文件所在的路徑,上例是當前路徑,因此是一個點

若是運行成功,就能夠看到新生成的 image 文件koa-demo了。

$ docker image ls

  1. 生成容器

docker container run命令會從 image 文件生成容器。

$ docker container run -p 8000:3000 -it koa-demo /bin/bash

# 或者

$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

上面命令的各個參數含義以下

-p參數:容器的 3000 端口映射到本機的 8000 端口。

-it參數:容器的 Shell 映射到當前的 Shell,而後你在本機窗口輸入的命令,就會傳入容器。

koa-demo:0.0.1:image 文件的名字(若是有標籤,還須要提供標籤,默認是 latest 標籤)。

/bin/bash:容器啓動之後,內部第一個執行的命令。這裏是啓動 Bash,保證用戶可使用 Shell。

若是一切正常,運行上面的命令之後,就會返回一個命令行提示符。

root@66d80f4aaf1e:/app#

這表示你已經在容器裏面了,返回的提示符就是容器內部的 Shell 提示符。執行下面的命令。

root@66d80f4aaf1e:/app# node demos/01.js

這時,Koa 框架已經運行起來了。打開本機的瀏覽器,訪問 http://127.0.0.1:8000,網頁顯示"Not Found",這是由於這個 demo 沒有寫路由。

這個例子中,Node 進程運行在 Docker 容器的虛擬環境裏面,進程接觸到的文件系統和網絡接口都是虛擬的,與本機的文件系統和網絡接口是隔離的,所以須要定義容器與物理機的端口映射(map)

如今,在容器的命令行,按下 Ctrl + c 中止 Node 進程,而後按下 Ctrl + d (或者輸入 exit)退出容器。此外,也能夠用docker container kill終止容器運行。

    # 在本機的另外一個終端窗口,查出容器的 ID

    $ docker container ls

    # 中止指定的容器運行

    $ docker container kill [containerID]

容器中止運行以後,並不會消失,用下面的命令刪除容器文件。

    # 查出容器的 ID

    $ docker container ls --all

    # 刪除指定的容器文件

    $ docker container rm [containerID]

也可使用docker container run命令的--rm參數,在容器終止運行後自動刪除容器文件。

$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash

  1. CMD 命令

容器啓動之後,須要手動輸入命令node demos/01.js。咱們能夠把這個命令寫在 Dockerfile 裏面,這樣容器啓動之後,這個命令就已經執行了,不用再手動輸入了。

FROM node:8.4

COPY . /app

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org

EXPOSE 3000

CMD node demos/01.js

上面的 Dockerfile 裏面,多了最後一行CMD node demos/01.js,它表示容器啓動後自動執行node demos/01.js。

RUN命令與CMD命令的區別在哪裏?簡單說,RUN命令在 image 文件的構建階段執行,執行結果都會打包進入 image 文件CMD命令則是在容器啓動後執行。另外,一個 Dockerfile 能夠包含多個RUN命令,可是隻能有一個CMD命令

注意,指定了CMD命令之後,docker container run命令就不能附加命令了(好比前面的/bin/bash),不然它會覆蓋CMD命令。如今,啓動容器可使用下面的命令。

$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1

五、發佈 image 文件:【打tag】和【發佈】

容器運行成功後,就確認了 image 文件的有效性。能夠考慮把 image 文件分享到網上,讓其餘人使用。

註冊docker hub並登陸

首先,去 hub.docker.com 或 cloud.docker.com 註冊一個帳戶。而後,用下面的命令登陸。

$ docker login

爲本地的 image 標註用戶名和版本

$ docker image tag [imageName] [username]/[repository]:[tag]

# 實例

$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

也能夠不標註用戶名,從新構建一下 image 文件

$ docker image build -t [username]/[repository]:[tag] .

發佈 image 文件

$ docker image push [username]/[repository]:[tag]

發佈成功之後,登陸 hub.docker.com,就能夠看到已經發布的 image 文件。

★命令總結

登陸hub.docker.com:docker login(必須有註冊帳號和密碼)

相關文章
相關標籤/搜索