摘要:原文來(lái)自前中本專欄已經(jīng)介紹過(guò)的基礎(chǔ)知識(shí),本文開(kāi)始進(jìn)行實(shí)戰(zhàn)手動(dòng)使用構(gòu)建容器。構(gòu)建的容器有多種方法,本文將會(huì)介紹手動(dòng)構(gòu)建容器。表示使用本目錄的。有了官方鏡像,我們手動(dòng)構(gòu)建的鏡像其實(shí)意義不大了。
原文來(lái)自 How to Manually Build Docker Containers for WordPress
前中本專欄已經(jīng)介紹過(guò) Docker 的基礎(chǔ)知識(shí),本文開(kāi)始進(jìn)行 Docker 實(shí)戰(zhàn):手動(dòng)使用 Docker 構(gòu)建 WordPress 容器。同時(shí)介紹一下 Docker 官方 MySQL 鏡像的爬坑方法,同時(shí)演示 Docker 生產(chǎn)中常見(jiàn)的問(wèn)題以及解決辦法。
在我以前的文章中,我們已經(jīng)介紹了 Docker 的基礎(chǔ)知識(shí)和基礎(chǔ)命令。當(dāng)然,雖然我們已經(jīng)介紹了這些知識(shí),我們還沒(méi)有使用它們做出有價(jià)值的東西。構(gòu)建 WordPress 的 Docker 容器有多種方法,本文將會(huì)介紹手動(dòng)構(gòu)建容器。如果你還沒(méi)有認(rèn)識(shí) Docker,可以戳這里。
設(shè)置 MySQL數(shù)據(jù)庫(kù)是 WordPress 的基礎(chǔ),本文使用 Docker Hub 來(lái)獲取 MySQL 鏡像。
Docker 官方已經(jīng)構(gòu)建了 MySQL 鏡像。在使用 MySQL 鏡像之前,請(qǐng)先讀鏡像手冊(cè)。在寫本文時(shí),鏡像的最新版本是 5.7。
按照通常的方法,使用 MySQL 鏡像的方法如下:
docker run --name wordpressdb -d mysql:5.7
執(zhí)行這條命令的時(shí)候,如果本機(jī)沒(méi)有 MySQL 鏡像,那么 Docker 會(huì)從 Docker Pull 先下載鏡像。使用 --name 參數(shù)指定容器運(yùn)行時(shí)的名字,使用 -d 參數(shù)指定再后臺(tái)運(yùn)行。
使用 docker ps 命令可以發(fā)現(xiàn),并沒(méi)有名叫 wordpressdb 的容器在后臺(tái)運(yùn)行,但是不應(yīng)該這樣啊。使用 docker logs wordpressdb 查看鏡像日志:
error: database is uninitialized and MYSQL_ROOT_PASSWORD not set Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?
那么問(wèn)題出在哪兒?
我們運(yùn)行了 MySQL,但是沒(méi)有指明數(shù)據(jù)庫(kù)的 root 密碼,所以容器并不能運(yùn)行。所以為了修正這個(gè)錯(cuò)誤,我們需要?jiǎng)h除容器 wordpressdb,然后重新建立容器。Docker 不允許兩個(gè)容器使用相同的名字。
再次運(yùn)行容器的時(shí)候我們用 -e 參數(shù)指定容器內(nèi)的環(huán)境變量MYSQL_ROOT_PASSWORD:
docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7
再次運(yùn)行 docker logs wordpressdb 的時(shí)候,我們會(huì)看到非常長(zhǎng)的信息。實(shí)際上 MySQL 容器已經(jīng)在后臺(tái)運(yùn)行了,運(yùn)行 docker ps 也可以看到正在運(yùn)行的容器 wordpressdb。
當(dāng)然你也可以使用 MYSQL_DATABASE 參數(shù)指定運(yùn)行容器之前就創(chuàng)建名為 wordpress 的數(shù)據(jù)庫(kù):
docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql:5.7
當(dāng)然,MySQL 數(shù)據(jù)庫(kù)還有其他的參數(shù),例如指定創(chuàng)建用戶和密碼。當(dāng)然,更多的用法就需要參考他們 官方的文檔 了。
容器的 IP 會(huì)隨啟動(dòng)而變化,需要使用 docker inspect --format="{{.NetworkSettings.IPAddress}}" wordpressdb 獲取容器的 IP。
當(dāng)然,Dockerfile 中有很多的容器構(gòu)建信息。MySQL 基于 debian wheezy 鏡像構(gòu)建,然后啟動(dòng) mysqld 命令。當(dāng)使用這個(gè)容器的時(shí)候,其實(shí)只啟動(dòng)了 mysqld 命令。
現(xiàn)在我們已經(jīng)有了 MySQL 容器,用戶名 root,密碼 password,數(shù)據(jù)庫(kù)名稱 wordpress。下一步就是構(gòu)建 WordPress 了。
構(gòu)建 WorePress 容器這一步我們使用PHP 鏡像,PHP 鏡像鏡像也有很多,我們使用官方提供的帶有 Apache 的 php 鏡像。
docker run --name wordpress php:5.6-apache
不加 -d 參數(shù),容器便會(huì)在前臺(tái)運(yùn)行,也能看到應(yīng)該由 docker logs 輸出的數(shù)據(jù)。
使用 docker inspect --format="{{.NetworkSettings.IPAddress}}" wordpress 命令獲取 wordpress 容器的 IP。本文是 172.17.0.35。
如果你直接訪問(wèn)這個(gè) IP,會(huì)得到一個(gè) 403 的錯(cuò)誤。因?yàn)槿萜髦械木W(wǎng)站目錄在 /var/www/html,但是實(shí)際上目錄中沒(méi)有東西,所以 403 forbidden。
那么怎么將文件放入容器的那個(gè)文件夾?
第一步:宿主機(jī)創(chuàng)建文件夾,然后進(jìn)入文件夾。
第二部:進(jìn)入這個(gè)文件夾,創(chuàng)建 index.php 文件,文件內(nèi)容是
第三部:使用命令啟動(dòng)容器:docker run --name wordpress -v "$PWD/":/var/www/html php:5.6-apache。
這樣訪問(wèn) wordpress 容器的 IP(因?yàn)槭切氯萜?,所?IP 有變化),便會(huì)得到經(jīng)典的 phpinfo 頁(yè)面。
測(cè)試完成,我們的容器可以執(zhí)行 php 文件。
將 wordpress 文件放入本文件夾,chmod 777,然后重新啟動(dòng) wordpress 容器,但是會(huì)這么提示:
您的PHP似乎沒(méi)有安裝運(yùn)行WordPress所必需的MySQL擴(kuò)展。
官方 php 鏡像并未提供 mysql 擴(kuò)展,所以我們必須要自己手動(dòng)寫 Dockerfile 安裝擴(kuò)展:
FROM php:5.6-apache # 使用 php:5.6-apache 鏡像 RUN docker-php-ext-install mysqli # 使用 docker-php-ext-install 命令安裝 mysqli 擴(kuò)展 CMD ["apache2-foreground"] # 默認(rèn)啟動(dòng) apache2-foreground 命令
然后我們構(gòu)建這個(gè)鏡像,鏡像名為 phpwithmysql。
docker build -t phpwithmysql .
-t 參數(shù)指定構(gòu)建出的鏡像的名稱。. 表示使用本目錄的 Dockerfile。
構(gòu)建完成,便會(huì)得 phpwithmysql 鏡像,tag 名為 latest。
再次啟動(dòng) WordPress:
docker run --name wordpress -v "$PWD/":/var/www/html phpwithmysql
這次再使用 IP 訪問(wèn)你的 wordpress:
走到這一步,大部分的事情我們都做的差不多了,只有一個(gè)問(wèn)題:
萬(wàn)一重啟 wordpressdb 容器,數(shù)據(jù)庫(kù)容器的 IP 變了怎么辦?
Docker 提供了連接參數(shù),讓我們可以將一個(gè)容器連接到另一個(gè)容器。
docker run --name wordpress --link wordpressdb:mysql -v "$PWD/":/var/www/html phpwithmysql
新參數(shù)是 --link,作用是將 wordpressdb 連接到 wordpress 容器內(nèi),具體為在 wordpress 容器內(nèi)的 hosts 文件中增加 mysql 172.17.0.X。
172.17.0.X 為 wordpressdb 的 IP。
除此之外,還會(huì)修改 wordpress 的環(huán)境變量。
因此,安裝的時(shí)候只需指定數(shù)據(jù)庫(kù)主機(jī)為 mysql 即可。
但是還有點(diǎn)蛋疼的問(wèn)題:
wordpress 并不能上傳文件,也不能安裝主題。因?yàn)?wordpress 容器內(nèi)的 apache 對(duì)文件系統(tǒng)沒(méi)有寫權(quán)限,所以我們還得調(diào)整 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"]
接下來(lái)創(chuàng)建 encrypting.sh 文件:
#!/bin/bash chown -R www-data:www-data . exec "$@"
這是官方 WordPress 鏡像構(gòu)建方法的簡(jiǎn)化版,但是已經(jīng)解決了文件系統(tǒng)的寫權(quán)限問(wèn)題。
現(xiàn)在構(gòu)建新的鏡像:
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 文件。
這一次訪問(wèn) wordpress 的 IP,重新安裝 WordPress,便可構(gòu)建完成。
構(gòu)建過(guò)程可能有些麻煩,所以 WordPress 有官方的各種語(yǔ)言的 Docker 鏡像。Docker 不允許容器內(nèi)的應(yīng)用對(duì)宿主機(jī)文件系統(tǒng)有寫權(quán)限,這到底是好是壞?我覺(jué)得應(yīng)該是好事。我們可以創(chuàng)立一個(gè)數(shù)據(jù)容器專門負(fù)責(zé)放文件,這樣可以實(shí)現(xiàn)架構(gòu)的多樣化。但是對(duì)于現(xiàn)有架構(gòu)的應(yīng)用例如 WordPress,我們只能如此變通。
最終調(diào)整最后一步大概很多人猜得到,就是萬(wàn)一關(guān)機(jī)了怎么辦?wordpress 容器 IP 變化了怎么辦?要知道,WordPress 沒(méi)有配置的情況下愛(ài),是使用 IP 保存站點(diǎn) URL 的,所以我們必須要這樣修改 wp-config.php 文件:
define("WP_HOME",$_SERVER["SERVER_ADDR"]); define("WP_SITEURL",$_SERVER["SERVER_ADDR"]);
要注意的是,在 wp-config.php 文件中改變的設(shè)置,是無(wú)法再在 WordPress 的儀表盤中再改動(dòng)的。
結(jié)論本文中我們手動(dòng)使用 Docker 構(gòu)建了 WordPress 鏡像,但是使用了一個(gè)非常曲折的方法。當(dāng)然,還有更簡(jiǎn)便的方法,因?yàn)?Docker 官方已經(jīng)構(gòu)建了 WordPress 鏡像。有了官方鏡像,我們手動(dòng)構(gòu)建的鏡像其實(shí)意義不大了。不過(guò),通過(guò)調(diào)試,我們演示了 Docker 可能出現(xiàn)的常見(jiàn)問(wèn)題,例如 IP 變化,以及解決辦法(--link)等。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26406.html
摘要:我并沒(méi)有直接在另外一個(gè)容器中安裝客戶端,而是直接在服務(wù)器上安裝之前的代碼是用來(lái)獲取指派給數(shù)據(jù)庫(kù)服務(wù)容器的地址,以便連接。現(xiàn)在我們需要添加配置到現(xiàn)在我們可以啟動(dòng)我們的新服務(wù)。原文鏈接譯文原文和的完美配合,一起來(lái)辯翻譯鐘最龍校對(duì)李穎杰 看到一篇不錯(cuò)的文章,收藏一下: 【編者的話】本文作者介紹了如何在單機(jī)上將Dokku和Docker結(jié)合。Dokku是一個(gè)小型的PaaS平臺(tái),只需使用Git將...
摘要:用于系統(tǒng)引導(dǎo)的文件系統(tǒng),包括和容器啟動(dòng)完成后會(huì)被卸載以節(jié)約內(nèi)存資源位于之上,表現(xiàn)為容器的根文件系統(tǒng)鏡像原理鏡像的文件系統(tǒng)被設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。分層存儲(chǔ)的特征使得鏡像的復(fù)用,定制變得更加容易。 docker鏡像概述 操作系統(tǒng)分為內(nèi)核kernel和用戶空間。對(duì)于Linux而言,內(nèi)核(bootfs)啟動(dòng)后會(huì)掛載root文件系統(tǒng)為其提供用戶空間支持。而docker鏡像,就相當(dāng)于是一個(gè)root...
摘要:為了能只使用一個(gè)文件就能快速部署環(huán)境,我們把及環(huán)境的相關(guān)配置保存到阿里云的代碼托管,然后使用阿里云的鏡像倉(cāng)庫(kù)從拉取自動(dòng)構(gòu)建鏡像。編寫以上在阿里云創(chuàng)建的鏡像到本地,在此項(xiàng)目中創(chuàng)建然后在目錄分別創(chuàng)建目錄,用于存放它們各自及配置文件。 Docker基于LXC實(shí)現(xiàn)了把軟件封裝到一個(gè)完整的文件系統(tǒng),可以在docker容器中運(yùn)行所需的一切代碼,運(yùn)行環(huán)境,系統(tǒng)工具和系統(tǒng)庫(kù)。由于docker使用獨(dú)立于...
閱讀 893·2021-11-23 09:51
閱讀 1107·2021-11-15 17:57
閱讀 1674·2021-09-22 15:24
閱讀 820·2021-09-07 09:59
閱讀 2234·2019-08-29 15:10
閱讀 1857·2019-08-29 12:47
閱讀 760·2019-08-29 12:30
閱讀 3381·2019-08-26 13:51