【docker專欄4】使用docker安裝nginx提供web服務

2022-07-11 21:01:11

一般學習一項技術,會先用一個最簡單的例子或最典型的例子來向大家講解入門內容,所以此文為大家介紹使用docker安裝nginx容器服務。從基礎使用的角度來講,此文幾乎涵蓋了docker最核心的內容:映象拉取、容器執行、埠對映、檔案對映,雖然基礎但很重要,所以建議認真學習。

一、拉取映象

docker pull命令用於拉取應用映象,docker pull nginx命令用於拉取最新版本的nginx映象。下文為拉取映象過程的響應結果:

# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c229119241af: Pull complete 
2215908dc0a2: Pull complete 
08c3cb2073f1: Pull complete 
18f38162c0ce: Pull complete 
10e2168f148a: Pull complete 
c4ffe9532b5f: Pull complete 
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

從上文我們可以看出nginx映象是從docker.io這個網址拉取下來的。

使用docker images命令可以檢視當前作業系統中下載了哪些映象檔案。

# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    12766a6745ee   33 hours ago   142MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
  • REPOSITORY映象倉庫及映象名稱,如果不顯示映象倉庫,預設就是docker.io
  • TAG映象的版本或者是里程碑標籤,latest表示最新版本
  • IMAGE ID 映象的唯一標識
  • CREATED 這個映象被建立的時間
  • SIZE表示映象檔案的大小

二、執行映象啟動容器

通過docker run命令啟動一個容器,容器名稱為nginx-zimug。

# docker run -d --name nginx-zimug -p  80:80  nginx
81bb1211144bc0991a789f860458548643c60b5459466c14d0604be9a4ccbfd7
  • -d表示容器在後臺執行
  • --name為容器起一個名字
  • -p埠對映,格式為宿主機埠:容器埠,上文中含義是將容器中的埠80對映到宿主機的埠80,對外提供存取服務。
  • 最後一個欄位為映象名稱

瀏覽器HTTP協定存取宿主機的80埠,如果是80埠可以省略。得到的存取結果如下,說明我們的nginx服務已經啟動成功了。

通過docker ps可以檢視正在執行中的容器,如下所示:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
81bb1211144b   nginx     "/docker-entrypoint.…"   11 minutes ago   Up 11 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-zimug

三、檔案對映

首先明確的是容器中的檔案內容是可以被修改的,但是一旦容器重啟,所有寫入到容器中的,針對資料檔案、組態檔的修改都將丟失。所以為了儲存容器的執行狀態,執行結果,我們需要將容器內的一些重要的資料檔案、紀錄檔檔案、組態檔對映到宿主機上。
以nginx為例,nginx有三個重要的檔案目錄:

容器中路徑 宿主機中自定義對映路徑
儲存網站網頁的目錄 /usr/share/nginx/html /root/nginx/html
紀錄檔目錄 /etc/nginx/nginx.conf /root/nginx/conf/nginx.conf
nginx組態檔目錄 /var/log/nginx /root/nginx/logs

在宿主機中新建檔案目錄

mkdir -p  /root/nginx/logs  /root/nginx/html  /root/nginx/conf;

將容器中的檔案copy到宿主機中
將nginx組態檔copy到宿主機中

docker cp nginx-zimug:/etc/nginx/nginx.conf /root/nginx/conf;

將一個模擬的html檔案放入html目錄
將下面的檔案儲存為index.html放入宿主機的/root/nginx/html目錄,因為存在對映關係,實際上也是放入了容器的/usr/share/nginx/html目錄。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用docker搭建nginx web服務</title>
</head>
<body>
    <h1>存取成功</h1>
    <p>厲害了!</p>
</body>
</html>

四、再次啟動容器服務

-v參數列達了宿主機檔案與容器中檔案的對映關係,格式為-v 宿主機目錄:容器檔案系統目錄。啟動一個新的容器,容器的名字叫做nginx-prod

docker run -d -p 80:80 \
--name nginx-prod \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/logs:/var/log/nginx  nginx

在啟動新容器之前,將nginx-zimug舊的容器刪掉。如果不刪除舊的容器,新容器的埠與舊容器埠會發生衝突。使用如下命令刪除容器:

docker stop nginx-zimug;
docker rm nginx-zimug;

執行上面的docker run命令,啟動新的容器。啟動後通過瀏覽器存取宿主機80埠,響應結果如下證明nginx正常提供web服務了。

同時可以在宿主機上修改nginx設定,也可以檢視執行時紀錄檔檔案。修改結果會影響容器nginx服務的執行,因為宿主機的組態檔與容器內的組態檔存在對映關係。

歡迎關注我的公告號:字母哥雜談(側邊欄掃碼關注),回覆003贈送本文所在專欄《docker修煉之道》的PDF版本,30餘篇精品docker文章。字母哥部落格:zimug.com