製作一個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] .