国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

手動構建 WordPress 的 Docker 容器

UsherChen / 2420人閱讀

摘要:原文來自前中本專欄已經介紹過的基礎知識,本文開始進行實戰手動使用構建容器。構建的容器有多種方法,本文將會介紹手動構建容器。表示使用本目錄的。有了官方鏡像,我們手動構建的鏡像其實意義不大了。

  

原文來自 How to Manually Build Docker Containers for WordPress

前中本專欄已經介紹過 Docker 的基礎知識,本文開始進行 Docker 實戰:手動使用 Docker 構建 WordPress 容器。同時介紹一下 Docker 官方 MySQL 鏡像的爬坑方法,同時演示 Docker 生產中常見的問題以及解決辦法。

在我以前的文章中,我們已經介紹了 Docker 的基礎知識和基礎命令。當然,雖然我們已經介紹了這些知識,我們還沒有使用它們做出有價值的東西。構建 WordPress 的 Docker 容器有多種方法,本文將會介紹手動構建容器。如果你還沒有認識 Docker,可以戳這里。

設置 MySQL

數據庫是 WordPress 的基礎,本文使用 Docker Hub 來獲取 MySQL 鏡像。

Docker 官方已經構建了 MySQL 鏡像。在使用 MySQL 鏡像之前,請先讀鏡像手冊。在寫本文時,鏡像的最新版本是 5.7。

按照通常的方法,使用 MySQL 鏡像的方法如下:

docker run --name wordpressdb -d mysql:5.7

執行這條命令的時候,如果本機沒有 MySQL 鏡像,那么 Docker 會從 Docker Pull 先下載鏡像。使用 --name 參數指定容器運行時的名字,使用 -d 參數指定再后臺運行。

使用 docker ps 命令可以發現,并沒有名叫 wordpressdb 的容器在后臺運行,但是不應該這樣啊。使用 docker logs wordpressdb 查看鏡像日志:

error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
  Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?

那么問題出在哪兒?

我們運行了 MySQL,但是沒有指明數據庫的 root 密碼,所以容器并不能運行。所以為了修正這個錯誤,我們需要刪除容器 wordpressdb,然后重新建立容器。Docker 不允許兩個容器使用相同的名字。

再次運行容器的時候我們用 -e 參數指定容器內的環境變量MYSQL_ROOT_PASSWORD:

docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7

再次運行 docker logs wordpressdb 的時候,我們會看到非常長的信息。實際上 MySQL 容器已經在后臺運行了,運行 docker ps 也可以看到正在運行的容器 wordpressdb

當然你也可以使用 MYSQL_DATABASE 參數指定運行容器之前就創建名為 wordpress 的數據庫:

docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql:5.7

當然,MySQL 數據庫還有其他的參數,例如指定創建用戶和密碼。當然,更多的用法就需要參考他們 官方的文檔 了。

容器的 IP 會隨啟動而變化,需要使用 docker inspect --format="{{.NetworkSettings.IPAddress}}" wordpressdb 獲取容器的 IP。

當然,Dockerfile 中有很多的容器構建信息。MySQL 基于 debian wheezy 鏡像構建,然后啟動 mysqld 命令。當使用這個容器的時候,其實只啟動了 mysqld 命令。

現在我們已經有了 MySQL 容器,用戶名 root,密碼 password,數據庫名稱 wordpress。下一步就是構建 WordPress 了。

構建 WorePress 容器

這一步我們使用PHP 鏡像,PHP 鏡像鏡像也有很多,我們使用官方提供的帶有 Apache 的 php 鏡像。

docker run --name wordpress php:5.6-apache

不加 -d 參數,容器便會在前臺運行,也能看到應該由 docker logs 輸出的數據。

使用 docker inspect --format="{{.NetworkSettings.IPAddress}}" wordpress 命令獲取 wordpress 容器的 IP。本文是 172.17.0.35

如果你直接訪問這個 IP,會得到一個 403 的錯誤。因為容器中的網站目錄在 /var/www/html,但是實際上目錄中沒有東西,所以 403 forbidden。

那么怎么將文件放入容器的那個文件夾?
第一步:宿主機創建文件夾,然后進入文件夾。
第二部:進入這個文件夾,創建 index.php 文件,文件內容是
第三部:使用命令啟動容器:docker run --name wordpress -v "$PWD/":/var/www/html php:5.6-apache

這樣訪問 wordpress 容器的 IP(因為是新容器,所以 IP 有變化),便會得到經典的 phpinfo 頁面。

測試完成,我們的容器可以執行 php 文件。

將 wordpress 文件放入本文件夾,chmod 777,然后重新啟動 wordpress 容器,但是會這么提示:

您的PHP似乎沒有安裝運行WordPress所必需的MySQL擴展。

官方 php 鏡像并未提供 mysql 擴展,所以我們必須要自己手動寫 Dockerfile 安裝擴展:

FROM php:5.6-apache
# 使用 php:5.6-apache 鏡像
RUN docker-php-ext-install mysqli
# 使用 docker-php-ext-install 命令安裝 mysqli 擴展
CMD ["apache2-foreground"]
# 默認啟動 apache2-foreground 命令

然后我們構建這個鏡像,鏡像名為 phpwithmysql。

docker build -t phpwithmysql .

-t 參數指定構建出的鏡像的名稱。. 表示使用本目錄的 Dockerfile

構建完成,便會得 phpwithmysql 鏡像,tag 名為 latest。

再次啟動 WordPress:

docker run --name wordpress -v "$PWD/":/var/www/html phpwithmysql

這次再使用 IP 訪問你的 wordpress:

走到這一步,大部分的事情我們都做的差不多了,只有一個問題:
萬一重啟 wordpressdb 容器,數據庫容器的 IP 變了怎么辦?

Docker 提供了連接參數,讓我們可以將一個容器連接到另一個容器。

docker run --name wordpress --link wordpressdb:mysql -v "$PWD/":/var/www/html phpwithmysql

新參數是 --link,作用是將 wordpressdb 連接到 wordpress 容器內,具體為在 wordpress 容器內的 hosts 文件中增加 mysql 172.17.0.X
172.17.0.Xwordpressdb 的 IP。
除此之外,還會修改 wordpress 的環境變量。

因此,安裝的時候只需指定數據庫主機為 mysql 即可。

但是還有點蛋疼的問題:

wordpress 并不能上傳文件,也不能安裝主題。因為 wordpress 容器內的 apache 對文件系統沒有寫權限,所以我們還得調整 phpwithmysql 鏡像的 Dockerfile:

FROM php:5.6-apache
RUN docker-php-ext-install mysqli
COPY entrypoint.sh /entrypoint.sh 
RUN chmod 777 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]

接下來創建 encrypting.sh 文件:

#!/bin/bash
chown -R www-data:www-data .
exec "$@"

這是官方 WordPress 鏡像構建方法的簡化版,但是已經解決了文件系統的寫權限問題。
現在構建新的鏡像:

docker build -t phpwithmysql:v2 .

刪除舊容器并重啟:

docker rm -f wordpress
docker rm -f wordpressdb
docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql:5.7
docker run --name wordpress --link wordpressdb:mysql -v "$PWD/":/var/www/html phpwithmysql:v2

最后,刪除 wp-config.php 文件。

這一次訪問 wordpress 的 IP,重新安裝 WordPress,便可構建完成。

構建過程可能有些麻煩,所以 WordPress 有官方的各種語言的 Docker 鏡像。Docker 不允許容器內的應用對宿主機文件系統有寫權限,這到底是好是壞?我覺得應該是好事。我們可以創立一個數據容器專門負責放文件,這樣可以實現架構的多樣化。但是對于現有架構的應用例如 WordPress,我們只能如此變通。

最終調整

最后一步大概很多人猜得到,就是萬一關機了怎么辦?wordpress 容器 IP 變化了怎么辦?要知道,WordPress 沒有配置的情況下愛,是使用 IP 保存站點 URL 的,所以我們必須要這樣修改 wp-config.php 文件:

define("WP_HOME",$_SERVER["SERVER_ADDR"]);
define("WP_SITEURL",$_SERVER["SERVER_ADDR"]);

要注意的是,在 wp-config.php 文件中改變的設置,是無法再在 WordPress 的儀表盤中再改動的。

結論

本文中我們手動使用 Docker 構建了 WordPress 鏡像,但是使用了一個非常曲折的方法。當然,還有更簡便的方法,因為 Docker 官方已經構建了 WordPress 鏡像。有了官方鏡像,我們手動構建的鏡像其實意義不大了。不過,通過調試,我們演示了 Docker 可能出現的常見問題,例如 IP 變化,以及解決辦法(--link)等。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26406.html

相關文章

  • Dokku和Docker完美配合

    摘要:我并沒有直接在另外一個容器中安裝客戶端,而是直接在服務器上安裝之前的代碼是用來獲取指派給數據庫服務容器的地址,以便連接。現在我們需要添加配置到現在我們可以啟動我們的新服務。原文鏈接譯文原文和的完美配合,一起來辯翻譯鐘最龍校對李穎杰 看到一篇不錯的文章,收藏一下: 【編者的話】本文作者介紹了如何在單機上將Dokku和Docker結合。Dokku是一個小型的PaaS平臺,只需使用Git將...

    Aldous 評論0 收藏0
  • Linux運維:docker(2)-鏡像與容器

    摘要:用于系統引導的文件系統,包括和容器啟動完成后會被卸載以節約內存資源位于之上,表現為容器的根文件系統鏡像原理鏡像的文件系統被設計為分層存儲的架構。分層存儲的特征使得鏡像的復用,定制變得更加容易。 docker鏡像概述 操作系統分為內核kernel和用戶空間。對于Linux而言,內核(bootfs)啟動后會掛載root文件系統為其提供用戶空間支持。而docker鏡像,就相當于是一個root...

    wuyumin 評論0 收藏0
  • Docker部署WordPress LNMP(Nginx PHP MySQL)環境實踐

    摘要:為了能只使用一個文件就能快速部署環境,我們把及環境的相關配置保存到阿里云的代碼托管,然后使用阿里云的鏡像倉庫從拉取自動構建鏡像。編寫以上在阿里云創建的鏡像到本地,在此項目中創建然后在目錄分別創建目錄,用于存放它們各自及配置文件。 Docker基于LXC實現了把軟件封裝到一個完整的文件系統,可以在docker容器中運行所需的一切代碼,運行環境,系統工具和系統庫。由于docker使用獨立于...

    Aklman 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<