1. 程式人生 > >製作一個docker例項

製作一個docker例項

下面我以 koa-demos 專案為例,介紹怎麼寫 Dockerfile 檔案,實現讓使用者在 Docker 容器裡面執行 Koa 框架。

作為準備工作,請先下載原始碼


$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos

1 編寫 Dockerfile 檔案

首先,在專案的根目錄下,新建一個文字檔案.dockerignore,寫入下面的內容


.git
node_modules
npm-debug.log

上面程式碼表示,這三個路徑要排除,不要打包進入 image 檔案

。如果你沒有路徑要排除,這個檔案可以不新建。

然後,在專案的根目錄下,新建一個文字檔案 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 埠暴露出來, 允許外部連線這個埠。

2 建立 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

10.3 生成容器

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。

如果一切正常,執行上面的命令以後,就會返回一個命令列提示符。


[email protected]1e:/app#

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


[email protected]1e:/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

4 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

5 釋出 image 檔案

容器執行成功後,就確認了 image 檔案的有效性。這時,我們就可以考慮把 image 檔案分享到網上,讓其他人使用。

首先,去 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 檔案。

十一、其他有用的命令

docker 的主要用法就是上面這些,此外還有幾個命令,也非常有用。

(1)docker container start

前面的docker container run命令是新建容器,每執行一次,就會新建一個容器。同樣的命令執行兩次,就會生成兩個一模一樣的容器檔案。如果希望重複使用容器,就要使用docker container start命令,它用來啟動已經生成、已經停止執行的容器檔案。


$ docker container start [containerID]

(2)docker container stop

前面的docker container kill命令終止容器執行,相當於向容器裡面的主程序發出 SIGKILL 訊號。而docker container stop命令也是用來終止容器執行,相當於向容器裡面的主程序發出 SIGTERM 訊號,然後過一段時間再發出 SIGKILL 訊號。


$ bash container stop [containerID]

這兩個訊號的差別是,應用程式收到 SIGTERM 訊號以後,可以自行進行收尾清理工作,但也可以不理會這個訊號。如果收到 SIGKILL 訊號,就會強行立即終止,那些正在進行中的操作會全部丟失。

(3)docker container logs

docker container logs命令用來檢視 docker 容器的輸出,即容器裡面 Shell 的標準輸出。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令檢視輸出。


$ docker container logs [containerID]

(4)docker container exec

docker container exec命令用於進入一個正在執行的 docker 容器。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。


$ docker container exec -it [containerID] /bin/bash

(5)docker container cp

docker container cp命令用於從正在執行的 Docker 容器裡面,將檔案拷貝到本機。下面是拷貝到當前目錄的寫法。


$ docker container cp [containID]:[/path/to/file] .