­

Docker 實戰—使用 Dockerfile 構建鏡像

  • 2019 年 11 月 3 日
  • 筆記

GitHub Page:http://blog.cloudli.top/posts/Docker實戰-使用-Dockerfile-構建鏡像/

Dockerfile 指令詳解請訪問:https://www.cnblogs.com/cloudfloating/p/11737447.html

使用 Alpine Linux 作為基礎鏡像

Alpine 是一個非常輕量的 Linux 鏡像,他只有大約 5MB 的大小,基於它構建鏡像,可以大大減少鏡像的體積。

Alpine 的 Docker Hub 頁面:https://hub.docker.com/_/alpine

docker pull alpine

Alpine 使用 apk 命令來安裝軟體包,支援的軟體包列表可以在官網查看:https://pkgs.alpinelinux.org/packages

這裡以安裝 Nginx 為例,學習鏡像的構建。另外 Nginx 本身有官方鏡像,pull 即可。

構建 Nginx 鏡像

編寫 Dockerfile

FROM alpine    RUN apk update       # 安裝 nginx      apk add --no-cache nginx       mkdir /run/nginx &&       # 清除快取      rm -rf /tmp/* /var/cache/apk/*    # 添加容器啟動命令,啟動 nginx,以前台方式運行  CMD [ "nginx", "-g", "daemon off;" ]

這裡有一個坑點,必須創建 /run/nginx 目錄,不然會報錯。

構建鏡像

使用 docker build 命令構建:

docker build -t nginx-alpine .

在 Dockerfile 目錄下執行以上命令即可構建鏡像。-t 參數指定了鏡像名稱為 nginx-alpine,最後的 . 表示構建上下文(. 表示當前目錄).

在使用 COPY 指令複製文件時,指令中的源路徑是相對於構建上下文的(如果指定上下文為 /home,那麼相當於所有的源路徑前面都加上了 /home/)。

如果你的 Dockerfile 文件名不是 「Dockerfile」,可以使用 -f 參數指定。

千萬不要將 Dockerfile 放在根目錄下構建,假如你將 Dockerfile 放在一個存放大量影片目錄下,並且構建上下文為當前目錄,那麼鏡像將會非常大(影片都被打包進去了)。最佳做法是將 Dockerfile 和需要用到的文件放在一個單獨的目錄下。

運行容器

使用構建的鏡像運行容器:

docker run --name my-nginx -p 80:80 -d nginx-apline
  • --name 指定容器的名稱,可以省略(後續只能通過容器 id 來操作);
  • -p 映射埠,宿主埠 -> 容器埠;
  • -d 後台運行。

運行後訪問 http://localhost/,會出現一個 nginx 的 404 頁面,說明已經運行成功了,因為這裡安裝的 Nginx 並沒有默認頁面,/etc/nginx/conf.d/default.conf 中的內容:

# This is a default site configuration which will simply return 404, preventing  # chance access to any other virtualhost.    server {          listen 80 default_server;          listen [::]:80 default_server;            # Everything is a 404          location / {                  return 404;          }  }

使用構建的 Nginx 鏡像運行一個靜態頁面

在一個空目錄下創建 Nginx 配置文件:

server {          listen 80 default_server;          listen [::]:80 default_server;            root /var/www;            location / {                  index index.html;          }  }

編寫一個靜態頁面:

<!DOCTYPE html>  <html>      <head>          <title>Index</title>      </head>      <body>          <h1>Hello, Docker!</h1>      </body>  </html>

使用之前構建的鏡像構建一個新的鏡像:

FROM nginx-alpine  # 拷貝配置文件,覆蓋默認的  COPY default.conf /etc/nginx/conf.d/  # 拷貝靜態頁面  COPY index.html /var/www

構建鏡像、運行容器:

docker build -t site .
docker run --name my-site -p 80:80 -d site

現在訪問 http://localhost/,就可以看到 Hello, Docker!