????????軟件開發最大的麻煩事之一,就是環境配置。用戶必須保證操作系統的設置,各種庫和組件的安裝,只有它們都正確,軟件才能運行。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
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
????????如果一切正常,運行上面的命令以后,就會返回一個命令行提示符。
root@66d80f4aaf1e:/app#
????????這表示你已經在容器里面了,返回的提示符就是容器內部的 Shell 提示符。執行下面的命令。
root@66d80f4aaf1e:/app# node demos/01.js
????????這時,Koa 框架已經運行起來了。打開本機的瀏覽器,訪問 http://127.0.0.1:8000,網頁顯示"Not Found",這是因為這個?demo?沒有寫路由。
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 # 容器啟動后執行命令,一個容器只能有一個CMD命令.
????????上面的 Dockerfile 里面,多了最后一行CMD node demos/01.js,它表示容器啟動后自動執行node demos/01.js。
????????注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。現在,啟動容器可以使用下面的命令。
docker container run --rm -p 8000:3000 -it koa-demo:0.0.1
5、測試demo
????????在ubuntu 21.04最小系統上,運行hello.sh文件,運行方式./hello.sh,文件內容:
#hello.sh
echo "hello docker"????????
????????Dockerfile基本結構:
FROM ubuntu:21.04
ADD hello.sh /
CMD ["./hello.sh"]
????????鏡像的構建,-t:tag指定鏡像名稱和版本:
docker image build -t hello.sh:1.0 .
????????構建過程截圖: