深入淺出Docker
本文是一篇Docker入門文章,作者介紹了Docker相關的基礎知識,包括Docker鏡像、Dockerfile、Docker容器、Docker Hub。然后作者使用Docker搭建了一個WordPress應用,基礎架構包含一個Nginx服務器來路由/代理請求、WordPress應用服務器 來部署應用以及MySQL數據庫來提供存儲。初學Docker的同學可以看看。
在持續集成這樣新的開發方法論流行的今天,軟件工程師只是將代碼推送出去并且祈禱代碼能在另外的環境里成功運行的日子已經一去不復返了。開發、測 試和運維之間的傳統高墻正在逐漸瓦解,并且這些職責會互相滲透,從而造就了新型工程師。DevOps在業界流行,項目開發團隊越來越敏捷高效,并且能夠迅 速響應變化。這樣的轉變使得新工具和框架隨之興起,幫助我們自動化地部署、測試和標準化基礎架構。
轉型浪潮的前端工具之一就是Docker,Docker是一個開放的平臺,幫助開發人員和系統管理員構建、發布并運行分布式應用。在進一步深入探討實際經驗之前,推薦大家閱讀這篇文章: 《什么是Docker》。
在開始操作之前,你需要先安裝Docker,我在Mac上用Boot2Docker來安裝,更為詳細的適合你的平臺的安裝指南請參考 Docker安裝介紹。另外,可以使用云服務商來運行Docker主機,Digital Ocean提供運行在云端,并且可以使用Docker的服務器,只需要花費每小時0.007美元,要是你受限于帶寬或資源的話,這是個很好的解決方法。
基礎知識
Docker鏡像
Docker鏡像是一個只讀容器,例如Ubuntu操作系統或者CentOS操作系統鏡像。在Docker里運行的每個容器都需要基于某個Docker鏡像。Dockerfile
Dockerfile其實就是一些代碼指令,它告訴Docker應該如何構建Docker鏡像。Docker鏡像是分層的,易于擴展,支持在已有的基礎鏡像上增加額外的功能。常用的基礎鏡像是ubuntu:latest,這是Ubuntu版本的基礎鏡像。Docker容器
Docker容器可以看成是運行著Linux系統(通常精簡過的Linux系統)的虛擬機的輕量級自包含實例,可以迅速啟動和停止。Docker容器可以通過Docker鏡像無限復制,它們是無狀態/短暫的資源。Docker Hub
Docker Hub給系統基礎框架引入了軟件工程DRY的原則,它是存儲Dockerfile和鏡像的全局倉庫。目前Docker Hub已經有很多的可用鏡像,比如Ubuntu、RedHat、RabbitMQ、MongoDB、Nginx。深入Docker
讓我們直接深入Docker,我們要構建一個簡單的基礎框架,其上運行一個WordPress的自包含實 例,WordPress是被全世界很多公司和作家使用的流行博客工具。這個基礎架構包含一個Nginx服務器來路由/代理請求,WordPress應用服 務器來部署應用以及MySQL數據庫來提供存儲。最終的架構類似于:數據庫容器
現在開始創建MySQL數據庫容器,很幸運的是MySQL已經被Docker化了,我們可以從Docker Hub上直接下載,默認配置就很好,因此不需要寫自己的Dockerfile或者構建新的鏡像。可以使用docker run命令行來啟動新容器。第一次運行需要一些時間,因為需要下載鏡像,下載一次之后就會緩存,后續的構建可以直接使用緩存。
docker run --name wordpress-db -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
上面的命令是讓Docker使用MySQL基礎鏡像運行一個新容器,各個參數意義如下:
- -name表示分配給新容器的名字(或者標簽)
- -e設置容器的環境變量,指定MySQL實例的密碼,已有配置文檔可以在MySQL Docker Hub中找到。
- -d指定Docker在后臺運行容器。
- mysql指定要使用的Docker鏡像的名字,這是從Docker Hub下載下來的。
注意:為了維護跨容器的數據,必須配置一個 VOLUME來確保數據一致性。為了簡單起見我們忽略了這個標志,但是要記住涉及狀態的部署必須考慮到數據跨容器生命周期的持續性。
應用容器
下面我們需要運行WordPress應用容器,這個也已經被Docker化并放在Docker Hub上了: WordPress倉庫。docker run --name wordpress-app --link wordpress-db:mysql -d wordpress
-link wordpress-db:mysql這個參數告訴Docker創建網絡連接到wordpress-db容器(之前創建出來的),使得兩個容器間能夠網絡通信。這個值分為兩部分,左邊部分指定想要連接的容器(wordpress-db),右邊部分指定這個容器的主機別名(mysql)。
用docker ps查看一下正在運行的容器:
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c39600354fcb wordpress:latest "/entrypoint.sh apac About a minute ago Up About a minute 80/tcp wordpress-app 20e66802e914 mysql:latest "/entrypoint.sh mysq About a minute ago Up About a minute 3306/tcp wordpress-db </pre>
可以看到有兩個容器正在運行,一個在80端口,一個在3306端口。可以ssh進wordpress-app容器,驗證可以連接到wordpress-db:docker exec -i -t wordpress-app bash ping mysql 64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.085 ms 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.127 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.108 ms
非常好,wordpress-app容器可以連接到wordpress-db容器。退出bash會話,如果需要也可以查看運行著的容器的日志。
docker logs wordpress-app
很好,一切看起來都不錯。
Nginx容器
Web應用之前通常有HTTP Web代理。這樣做有很多好處,比如控制請求路由、審查、安全、日志、緩存、負載均衡、存放靜態內容等。Nginx是常用的HTTP Web代理服務器。因為需要創建自定義的Nginx,所以需要一個新Dockerfile來定義包含自定義Nginx配置的新鏡像:
mkdir wordpress-nginx cd wordpress-nginx vi default.confserver { listen 80; server_name localhost;
error_log /var/log/nginx/error.log warn;
location / { proxy_pass http://wordpress-app:80/; proxy_redirect http://server_name http://wordpress-app:80/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }</pre>
注意我們將到達的請求路由到80端口的wordpress-app容器。接下來創建Dockerfile,定義如何構建Nginx容器鏡像:vi DockerfileFROM nginx COPY default.conf /etc/nginx/conf.d/default.conf</pre>
FROM nginx命令中的FROM指令告訴Docker從DockerHub上下載 Nginx基礎鏡像。
COPY default.conf /etc/nginx/conf.d/default.conf這個命令從當前目錄得到default.conf,并拷貝到/etc/nginx/conf.d/下的容器鏡像。
剩下的事情是構建新的Docker鏡像并運行容器:docker build -t wordpress-nginx . docker run -d --name=wordpress-nginx --link=wordpress-app:wordpress-app -p 80:80 wordpress-nginx docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b9f99664249 wordpress-nginx:latest "nginx -g 'daemon of 3 seconds ago Up 2 seconds 443/tcp, 0.0.0.0:80->80/tcp wordpress-nginx c39600354fcb wordpress:latest "/entrypoint.sh apac 9 minutes ago Up 3 minutes 80/tcp wordpress-app 20e66802e914 mysql:latest "/entrypoint.sh mysq 9 minutes ago Up 4 minutes 3306/tcp wordpress-db </pre>
可能你會注意到我們指定了參數-p 80:80,這是告訴Docker暴露容器的80端口,這樣可以從Docker的宿主機器外部訪問該容器。Hey Presto
在瀏覽器瀏覽 http://DOCKER_HOST_IP/,看,WordPress已經可以用了,按照WordPress安裝提示配置實例,很快就可以看到如下頁面:
總的來說,我們通過實際使用Docker Hub上的一些已有資源,學習到了一些Docker的基本概念,構建了WordPress的自包含可運行實例。一切只需要運行幾個Docker命令。希望 這篇文章能夠幫助你開始Docker化你的應用基礎架構,享受到Docker帶來的巨大好處。
如果喜歡這篇文章,請幫忙轉發給你的朋友,或者在推ter,LinkedIn上共享。多謝閱讀!
原文鏈接:A Dive into Docker(翻譯:崔婧雯 校對:李穎杰)
===========================
譯者介紹
崔婧雯,現就職于VMware,高級軟件工程師,負責桌面虛擬化產品的質量保證工作。曾在IBM WebSphere業務流程管理軟件擔任多年系統測試工作。對虛擬化,中間件技術有濃厚的興趣。
來自:http://dockerone.com/article/189