Docker 精通之微服務

Docker 精通系列

  • Docker 精通之入門
  • Docker 精通之微服務
  • Docker 精通之常用命令
  • Docker 精通之 Dockerfile
    Docker 是一個容器工具,提供虛擬環境。很多人認為,它改變了我們對軟件的認識。

站在 Docker 的角度,軟件就是容器的組合:業務邏輯容器、數據庫容器、儲存容器、隊列容器......Docker 使得軟件可以拆分成若干個標準化容器,然后像搭積木一樣組合起來。

這正是微服務(microservices)的思想:軟件把任務外包出去,讓各種外部服務完成這些任務,軟件本身只是底層服務的調度中心和組裝層。

微服務很適合用 Docker 容器實現,每個容器承載一個服務。一臺計算機同時運行多個容器,從而就能很輕松地模擬出復雜的微服務架構。

上一篇介紹了 Docker 的概念和基本用法,本文接著往下介紹,如何在一臺計算機上實現多個服務,讓它們互相配合,組合出一個應用程序。

本文選擇的示例軟件是?WordPress。它是一個常用軟件,全世界用戶據說超過幾千萬。同時它又非常簡單,只要兩個容器就夠了(業務容器 + 數據庫容器),很適合教學。而且,這種"業務 + 數據庫"的容器架構,具有通用性,許多應用程序都可以復用。

為了加深讀者理解,本文采用三種方法,演示如何架設 WordPress 網站。

  • 方法 A:自建 WordPress 容器
  • 方法 B:采用官方的 WordPress 容器
  • 方法 C:采用 Docker Compose 工具

一、預備工作:image 倉庫的鏡像網址

本教程需要從倉庫下載 image 文件,但是國內訪問 Docker 的官方倉庫很慢,還經常斷線,所以要把倉庫網址改成國內的鏡像站。這里推薦使用官方鏡像 registry.docker-cn.com 。下面是我的 Debian 系統的默認倉庫修改方法,其他系統的修改方法參考官方文檔。

打開/etc/default/docker文件(需要sudo權限),在文件的底部加上一行。

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

當你下載安裝的Docker Version不低于1.10時,可能會找不到上述文件,建議直接通過daemon config進行配置。?

使用配置文件 /etc/docker/daemon.json(沒有時新建該文件)

{"registry-mirrors": ["https://registry.docker-cn.com"]}

然后,重啟 Docker 服務。

$ sudo service docker restart

現在就會自動從鏡像倉庫下載 image 文件了。

二、方法 A:自建 WordPress 容器

前面說過,本文會用三種方法演示 WordPress 的安裝。第一種方法就是自建 WordPress 容器。

2.1 官方 的 PHP image

首先,新建一個工作目錄,并進入該目錄。

$ mkdir docker-demo && cd docker-demo

然后,執行下面的命令。

$ docker container run --rm --name wordpress --volume "$PWD/":/var/www/html php:5.6-apache

上面的命令基于php的 image 文件新建一個容器,并且運行該容器。php的標簽是5.6-apache,說明裝的是 PHP 5.6,并且自帶 Apache 服務器。該命令的三個參數含義如下。

  • --rm:停止運行后,自動刪除容器文件。
  • --name wordpress:容器的名字叫做wordpress。
  • --volume "$PWD/":/var/www/html:將當前目錄($PWD)映射到容器的/var/www/html(Apache 對外訪問的默認目錄)。因此,當前目錄的任何修改,都會反映到容器里面,進而被外部訪問到。

運行上面的命令以后,如果一切正常,命令行會提示容器對外的 IP 地址,請記下這個地址,我們要用它來訪問容器。我分配到的 IP 地址是 172.17.0.2。

打開瀏覽器,訪問 172.17.0.2,你會看到下面的提示。

Forbidden
You don't have permission to access / on this server.

這是因為容器的/var/www/html目錄(也就是本機的docker-demo目錄)下面什么也沒有,無法提供可以訪問的內容。

請在本機的docker-demo目錄下面,添加一個最簡單的 PHP 文件index.php

<?php 
phpinfo();
?>

保存以后,瀏覽器刷新172.17.0.2,應該就會看到熟悉的phpinfo頁面了。

2.2 拷貝 WordPress 安裝包

既然本地的docker-demo目錄可以映射到容器里面,那么把 WordPress 安裝包拷貝到docker-demo目錄下,不就可以通過容器訪問到 WordPress 的安裝界面了嗎?

首先,在docker-demo目錄下,執行下面的命令,抓取并解壓 WordPress 安裝包。

$ wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz 
$ tar -xvf wordpress-4.9.4-zh_CN.tar.gz

解壓以后,WordPress 的安裝文件會在docker-demo/wordpress目錄下。

這時瀏覽器訪問http://172.17.0.2/wordpress,就能看到 WordPress 的安裝提示了。

2.3 官方的 MySQL 容器

WordPress 必須有數據庫才能安裝,所以必須新建 MySQL 容器。打開一個新的命令行窗口,執行下面的命令。

$ docker container run \-d \--rm \--name wordpressdb \--env MYSQL_ROOT_PASSWORD=123456 \--env MYSQL_DATABASE=wordpress \mysql:5.7

上面的命令會基于 MySQL 的 image 文件(5.7版本)新建一個容器。該命令的五個命令行參數的含義如下。

  • -d:容器啟動后,在后臺運行。
  • --rm:容器終止運行后,自動刪除容器文件。
  • --name wordpressdb:容器的名字叫做wordpressdb
  • --env MYSQL_ROOT_PASSWORD=123456:向容器進程傳入一個環境變量MYSQL_ROOT_PASSWORD,該變量會被用作 MySQL 的根密碼。
  • --env MYSQL_DATABASE=wordpress:向容器進程傳入一個環境變量MYSQL_DATABASE,容器里面的 MySQL 會根據該變量創建一個同名數據庫(本例是WordPress)。

運行上面的命令以后,正常情況下,命令行會顯示一行字符串,這是容器的 ID,表示已經新建成功了。

這時,使用下面的命令查看正在運行的容器,你應該看到wordpresswordpressdb兩個容器正在運行。

$ docker container ls

其中,wordpressdb是后臺運行的,前臺看不見它的輸出,必須使用下面的命令查看。

$ docker container logs wordpressdb

2.4 定制 PHP 容器

現在 WordPress 容器和 MySQL 容器都已經有了。接下來,要把 WordPress 容器連接到 MySQL 容器了。但是,PHP 的官方 image 不帶有mysql擴展,必須自己新建 image 文件。

首先,停掉 WordPress 容器。

$ docker container stop wordpress

停掉以后,由于--rm參數的作用,該容器文件會被自動刪除。然后,在docker-demo目錄里面,新建一個Dockerfile文件,寫入下面的內容。

FROM php:5.6-apache
RUN docker-php-ext-install mysqli
CMD apache2-foreground

上面代碼的意思,就是在原來 PHP 的 image 基礎上,安裝mysqli的擴展。然后,啟動 Apache。

基于這個 Dockerfile 文件,新建一個名為phpwithmysql的 image 文件。

$ docker build -t phpwithmysql .

2.5 Wordpress 容器連接 MySQL

現在基于 phpwithmysql image,重新新建一個 WordPress 容器。

$ docker container run \--rm \--name wordpress \--volume "$PWD/":/var/www/html \--link wordpressdb:mysql \phpwithmysql

跟上一次相比,上面的命令多了一個參數--link wordpressdb:mysql,表示 WordPress 容器要連到wordpressdb容器,冒號表示該容器的別名是mysql

這時還要改一下wordpress目錄的權限,讓容器可以將配置信息寫入這個目錄(容器內部寫入的/var/www/html目錄,會映射到這個目錄)。

$ chmod -R 777 wordpress

接著,回到瀏覽器的http://172.17.0.2/wordpress頁面,點擊"現在就開始!"按鈕,開始安裝。

WordPress 提示要輸入數據庫參數。輸入的參數如下。

  • 數據庫名:wordpress
  • 用戶名:root
  • 密碼:123456
  • 數據庫主機:mysql
  • 表前綴:wp_(不變)

點擊"下一步"按鈕,如果 Wordpress 連接數據庫成功,就會出現下面的頁面,這就表示可以安裝了。

至此,自建 WordPress 容器的演示完畢,可以把正在運行的兩個容器關閉了(容器文件會自動刪除)。

$ docker container stop wordpress wordpressdb

三、方法 B:Wordpress 官方鏡像

上一部分的自建 WordPress 容器,還是挺麻煩的。其實不用這么麻煩,Docker 已經提供了官方?WordPress?image,直接用那個就可以了。有了上一部分的基礎,下面的操作就很容易理解了。

3.1 基本用法

首先,新建并啟動 MySQL 容器。

$ docker container run \-d \--rm \--name wordpressdb \--env MYSQL_ROOT_PASSWORD=123456 \--env MYSQL_DATABASE=wordpress \mysql:5.7

然后,基于官方的 WordPress image,新建并啟動 WordPress 容器。

$ docker container run \-d \--rm \--name wordpress \--env WORDPRESS_DB_PASSWORD=123456 \--link wordpressdb:mysql \wordpress

上面命令中,各個參數的含義前面都解釋過了,其中環境變量WORDPRESS_DB_PASSWORD是 MySQL 容器的根密碼。

上面命令指定wordpress容器在后臺運行,導致前臺看不見輸出,使用下面的命令查出wordpress容器的 IP 地址。

$ docker container inspect wordpress

上面命令運行以后,會輸出很多內容,找到IPAddress字段即可。我的機器返回的 IP 地址是172.17.0.3

瀏覽器訪問172.17.0.3,就會看到 WordPress 的安裝提示。

3.2 WordPress 容器的定制

到了上一步,官方 WordPress 容器的安裝就已經成功了。但是,這種方法有兩個很不方便的地方。

  • 每次新建容器,返回的 IP 地址不能保證相同,導致要更換 IP 地址訪問 WordPress。
  • WordPress 安裝在容器里面,本地無法修改文件。

解決這兩個問題很容易,只要新建容器的時候,加兩個命令行參數就可以了。

先把剛才啟動的 WordPress 容器終止(容器文件會自動刪除)。

$ docker container stop wordpress

然后,使用下面的命令新建并啟動 WordPress 容器。

 $ docker container run \-d \-p 127.0.0.2:8080:80 \--rm \--name wordpress \--env WORDPRESS_DB_PASSWORD=123456 \--link wordpressdb:mysql \--volume "$PWD/wordpress":/var/www/html \wordpress

上面的命令跟前面相比,命令行參數只多出了兩個。

  • -p 127.0.0.2:8080:80:將容器的 80 端口映射到127.0.0.28080端口。
  • --volume "$PWD/wordpress":/var/www/html:將容器的/var/www/html目錄映射到當前目錄的wordpress子目錄。

瀏覽器訪問127.0.0.2:8080:80就能看到 WordPress 的安裝提示了。而且,你在wordpress子目錄下的每次修改,都會反映到容器里面。最后,終止這兩個容器(容器文件會自動刪除)。

$ docker container stop wordpress wordpressdb

四、方法 C:Docker Compose 工具

上面的方法 B 已經挺簡單了,但是必須自己分別啟動兩個容器,啟動的時候,還要在命令行提供容器之間的連接信息。因此,Docker 提供了一種更簡單的方法,來管理多個容器的聯動。

4.1 Docker Compose 簡介

Compose?是 Docker 公司推出的一個工具軟件,可以管理多個 Docker 容器組成一個應用。你需要定義一個?YAML格式的配置文件docker-compose.yml,寫好多個容器之間的調用關系。然后,只要一個命令,就能同時啟動/關閉這些容器。

# 啟動所有服務
$ docker-compose up
# 關閉所有服務
$ docker-compose stop

4.2 Docker Compose 的安裝

Mac 和 Windows 在安裝 docker 的時候,會一起安裝 docker compose。Linux 系統下的安裝參考官方文檔。

安裝完成后,運行下面的命令。

$ docker-compose --version

4.3 WordPress 示例

docker-demo目錄下,新建docker-compose.yml文件,寫入下面的內容。

mysql:image: mysql:5.7environment:- MYSQL_ROOT_PASSWORD=123456- MYSQL_DATABASE=wordpress
web:image: wordpresslinks:- mysqlenvironment:- WORDPRESS_DB_PASSWORD=123456ports:- "127.0.0.3:8080:80"working_dir: /var/www/htmlvolumes:- wordpress:/var/www/html

上面代碼中,兩個頂層標簽表示有兩個容器mysqlweb。每個容器的具體設置,前面都已經講解過了,還是挺容易理解的。

啟動兩個容器。

$ docker-compose up

瀏覽器訪問 http://127.0.0.3:8080,應該就能看到 WordPress 的安裝界面。

現在關閉兩個容器。

$ docker-compose stop

關閉以后,這兩個容器文件還是存在的,寫在里面的數據不會丟失。下次啟動的時候,還可以復用。下面的命令可以把這兩個容器文件刪除(容器必須已經停止運行)。

$ docker-compose rm

五、參考鏈接

  • How to Manually Build Docker Containers for WordPress, by Aleksander Koko
  • How to Use the Official Docker WordPress Image, by Aleksander Koko
  • Deploying WordPress with Docker, by Aleksander Koko

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

苦逼的程序員怎么發展

今天組長開會時跟我談話了&#xff0c;說的意思是我更適合另外一個組&#xff0c;我現在這個組沒有什么技術含量&#xff0c;另外一個組技術含量可能更深些。 苦逼啊&#xff0c;這世界缺少的都是耐心&#xff0c;老是用一成不變的模式看人&#xff0c;我是那么還和以前一樣沉…

php根據瀏覽器調用支付_Android通過外部瀏覽器調用微信H5支付,Android+PHP詳解

看了好多關于講解微信H5支付開發的文章&#xff0c;大多數都是通過微信內部瀏覽器來調用支付接口(其實就是公眾號支付)&#xff0c;可能是因為H5支付接口剛開放不久吧。微信官方體驗鏈接&#xff1a;http://wxpay.wxutil.com/mch/pay/h5.v2.php&#xff0c;請在微信外瀏覽器打開…

秒殺系統架構分析與實戰

0 系列目錄 秒殺系統架構 秒殺系統架構分析與實戰1 秒殺業務分析 正常電子商務流程 &#xff08;1&#xff09;查詢商品&#xff1b;&#xff08;2&#xff09;創建訂單&#xff1b;&#xff08;3&#xff09;扣減庫存&#xff1b;&#xff08;4&#xff09;更新訂單&#xff1…

Docker 精通之常用命令

Docker 精通系列 Docker 精通之入門Docker 精通之微服務Docker 精通之常用命令Docker 精通之 Dockerfile 配置文件路徑 /etc/sysconfig/docker docker鏡像及容器目錄 主目錄&#xff1a;/var/lib/docker 容器存放目錄&#xff1a;/var/lib/docker/containers/ 鏡像存放目…

世界500強面試題(經典)

本書中的問題&#xff0c;是軟件業人士在面試時常問的&#xff0c;其中大多數出自微軟公司&#xff0c;也有一些來自世界500強公司中的其 他公司。其實道理是相通的&#xff0c;認真領會&#xff0c;加以變通&#xff0c;當你讀完全書時&#xff0c;你會發現你已經找到了一塊進…

php 獲取字符串中的url,php使用正則表達式獲取字符串中的URL

今天寫一個問答系統上線之后發現有很多人發鏈接了,由于業務部門要我們過濾掉網站地址了,下面我給大家分享一個提取字符串url地址函數,代碼如下:$str 本文實例講述了php匹配字符串里所有URL地址的方法。http://www.manongjc.com 分享給大家供大家參考;preg_match_all("/htt…

如何提高安卓代碼的質量和語法

本文講的是如何提高安卓代碼的質量和語法&#xff0c;在這篇文章中&#xff0c;我會介紹幾種不同的方式&#xff0c;讓你通過自動化工具提高你的Android代碼質量&#xff0c;包括 Checkstyle&#xff0c; Findbugs&#xff0c;PMD&#xff0c; 當然&#xff0c;還有我們最熟悉的…

洛谷 U3357 C2-走樓梯

https://www.luogu.org/problem/show?pidU3357 題目背景 在你成功地解決了上一個問題之后&#xff0c;方方方不禁有些氣惱&#xff0c;于是他在樓梯上跳來跳去&#xff0c;想要你求出他跳的方案數。.. 題目描述 方方方站在一個n階樓梯下面&#xff0c;他每次可以往上跳一步或兩…

Liunx 系統調優

Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數&#xff0e;如果想使參數長期保存&#xff0c;可以通過編輯/etc/sysctl.conf文件來實現。 命令格式&#xff1a;sysctl [-n] [-e]-w # 臨時改變某個指定參數的值&#xff0c;如sysctl -w net.ipv4.ip_forward1-a # 顯示…

php多文件上傳存儲到表,PHP 實現一種多文件上傳的方法

搜索熱詞之前在實現表單中file類型input選擇多圖片的時候找到一種方式 也許不是最好的但親測可行且支持ie7以上以及chrome瀏覽器在表單中使用正常多文件選擇multiple屬性PHP;">然后使用AjaxFileUpload或其他方式提交將對應命名的file文件 $file[‘image] 轉化為 json打…

CentOS7設置自定義開機啟動,添加自定義系統服務

Centos 系統服務腳本目錄&#xff1a; /usr/lib/systemd/ 有系統&#xff08;system&#xff09;和用戶&#xff08;user&#xff09;之分&#xff0c;如需要開機沒有登陸情況下就能運行的程序&#xff0c;存在系統服務&#xff08;system&#xff09;里&#xff0c;即&#xf…

成功應聘Intel的真實經歷

編者按&#xff1a;INTEL&#xff08;英特爾&#xff09;公司創建于1968年&#xff0c;是全球最大的芯片制造商&#xff0c;Intel研究中心更是匯聚了全球無數的精英&#xff0c;一批年輕人抱著夢想走入了這里&#xff0c;過去我們談到了太多關于Intel技術與市場方面&#xff0c…

Kotlin學習記錄1

參考我的博客&#xff1a;http://www.isedwardtang.com/2017/09/02/kotlin-primer-1/轉載于:https://www.cnblogs.com/EdwardTang/p/7476787.html

Keepalived配置文件詳解

keepalivedkeepalived是集群管理中保證集群高可用的一個服務軟件&#xff0c;其功能類似于heartbeat&#xff0c;用來防止單點故障。keepalived工作原理keepalived是以VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;即虛擬路由冗余協議&#xff09;協議為實現…

php高等數學,中國大學《高等數學(四)》期末答案高校邦《PHP語言程序設計》見面課答案...

參考答案如下Conversation 2Pretco-A12.9-10.mp3:9、中國 A) Some shoes are missing. B) Itsdelivery is delayed.C) The order is cancelled. D) Some packages are damaged.10、中國 A) Giving an additional discount. B) Renewing the contract.C) Sending the goods by a…

深入剖析ThreadLocal實現原理以及內存泄漏問題

關于ThreadLocalMap<ThreadLocal, Object>弱引用問題&#xff1a; 當線程沒有結束&#xff0c;但是ThreadLocal已經被回收&#xff0c;則可能導致線程中存在ThreadLocalMap<null, Object>的鍵值對&#xff0c;造成內存泄露。&#xff08;ThreadLocal被回收&#xf…

解讀《普通大學應屆畢業生如何成功應聘微軟》

《普通大學應屆畢業生如何成功應聘微軟》這篇文章很有實踐性&#xff0c;我所要提的&#xff0c;是最后一道面試&#xff0c;也就是唐駿本人對作者的面試&#xff0c;這一輪看似平常的面試大有門道。仔細想想&#xff0c;為什么這些問題由唐駿本人來問&#xff0c;他為什么要這…

grep 命令的 12 個實例

2019獨角獸企業重金招聘Python工程師標準>>> 你是否遇到過需要在文件中查找一個特定的字符串或者樣式&#xff0c;但是不知道從哪兒開始&#xff1f;那么,就請grep來幫你吧。 grep是每個Linux發行版都預裝的一個強有力的文件模式搜索工具。無論何種原因&#xff0c;…

php 怎么從memcache緩存數據中統計某一字段總數,php和memcache統計在線人數的方法...

$mc new Memcache ();// 連接memcache$mc->connect("127.0.0.1", 11211);// 獲取 在線用戶 IP 和 在線時間數據$online_members $mc->get(online_members);// 如果為空&#xff0c;初始化數據if (!$online_members) {$online_members array();}// 獲取用戶i…

ubuntu之ufw防火墻

UFW是Ubuntu下的一個主機端的iptables類防火墻配置工具(底層調用iptables來處理)。這個工具的目的是提供給用戶一個可以輕松駕馭的界面&#xff0c;就像包集成和動態檢測開放的端口一樣。雖然功能較簡單&#xff0c;但對桌面型應用來說比較實用&#xff0c;基本常用功能都有&am…