歡迎你們前往騰訊雲技術社區,獲取更多騰訊海量技術實踐乾貨哦~php
做者:張戈html
導語:應用場景從建立、上傳直到部署的詳細過程,並簡單的介紹了騰訊雲容器服務的使用方法。經過Docker快速拉起一個定製服務,極大的簡化了部署,加快了業務部署節奏,並下降了運維成本。 —— 人生苦短,快用Docker。python
爲了學習Docker,咱們先結合實際需求,設計這樣一個場景case:假設有一個我的網站,想使用Nginx反向代理方案,可以在國內外快速搭建多個相似於CDN的節點,提供集羣式的WEB訪問服務。nginx
我想到的方案以下: 1.常規部署方案: 購買雲主機->環境初始化->部署Nginx->配置反向代理->DNS解析 2.Docker部署方案:購買雲主機->yum 安裝docker->拉取自定義鏡像並執行->DNS解析 3.騰訊雲容器方案: 騰訊雲容器服務->建立服務->DNS解析docker
很明顯,使用Docker部署方案,整個過程會變得簡單快捷,也更易自動化。固然,若不是對IDC有特殊要求的話,騰訊雲的容器服務當選爲最佳方案。vim
下面簡單記錄下我從Docker鏡像的建立、上傳到部署的實踐過程。centos
•騰訊雲:CentOS Linux release 7.2.1511 (Core) •阿里雲:CentOS Linux release 7.2.1511 (Core) •Docker version 1.12.6, build 88a4867/1.12.6 •Docker 鏡像版本:Centos 官方最新版 •Nginx 版本:Tengine 2.2.0 •其餘略..bash
# 安裝docker
yum install -y docker
# 配置騰訊雲鏡像加速(官方的龜速)
vim /etc/sysconfig/docker
#新增以下參數:
OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'
#重啓docker服務:
systemctl restart docker
複製代碼
拉取 centos官方基礎鏡像 docker pull centos服務器
查看當前鏡像 docker images網絡
[root@MyServer docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 328edcd84f1b 4 weeks ago 192.5 MB
複製代碼
運行並進入鏡像:
docker run -ti docker.io/centos:latest /bin/bash
複製代碼
此時,終端已經進入了鏡像裏面,如今咱們能夠根據本身的需求安裝額外的組件,好比我此次須要用到crontab任務計劃服務、進程守護supervisor等,那麼直接在這個終端開始操做:
[root@0d7f7b8769d9 /]# yum install -y epel-release crontabs
[root@0d7f7b8769d9 /]# yum install -y python-pip
[root@0d7f7b8769d9 /]# pip install --upgrade pip
[root@0d7f7b8769d9 /]# pip install supervisor
複製代碼
Ps:上面的PS提示符中的 0d7f7b8769d9 就是本次啓動的 CONTAINER ID ,在下面的commit步驟即將用到。 完成必要組件安裝以後,按下 Ctrl +D 退出系統,接着使用 docker commit 命令建立新鏡像,好比命名爲 nginx-proxy-base,版本latest:
docker commit 0d7f7b8769d9 centos/nginx-proxy-base:latest
複製代碼
執行完成後,可使用 docker images 查看剛建立的鏡像:
[root@MyServer ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/nginx-proxy-base latest 676fcfff6d3c About an hour ago 366 MB
複製代碼
到此,咱們就建立了一個自定義的Docker基礎鏡像(Ps:基礎鏡像相似一個VM虛擬機的快照,方便後續步驟均可以從這個基礎上從新制做。)
Ps:這裏展現的是進入Docker裏面經過手工部署的方式,其實咱們還能夠經過DockerFile來完成上述全部操做,能夠極大的減少Docker鏡像的體積。
有了前面的基礎鏡像以後,咱們能夠在此基礎之上添加應用程序或自定義配置,打包爲服務鏡像。以本文背景需求爲例,爲了方便後續維護,Nginx我採用純靜態編譯方式,製做成綠色便攜版本。
所以,咱們先在宿主機上靜態編譯一個符合需求的Nginx(僅展現關鍵步驟,依賴組件自行搞定):
# 把全部依賴都靜態編譯進去
./configure --prefix=/usr/local/nginx \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre=../pcre-8.39 \
--with-zlib=../zlib-1.2.11 \
--with-http_sub_module \
--with-openssl=../openssl-1.0.2j \
--add-module=../ngx_cache_purge-2.3 \
--add-module=../ngx_http_substitutions_filter_module
# 安裝
make && make install
複製代碼
安裝後獲得 /usr/local/nginx 目錄,接着咱們按照實驗需求修改Nginx各項配置,好比反向代理:
server {
listen 80;
server_name demo.domain.com;
access_log /data/wwwlogs/demo.domain.com.log;
index index.html index.htm index.php;
location / {
proxy_pass http://xxx.xxx.xxx.xxx;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_redirect off;
proxy_set_header Host demo.domain.com;
}
}
複製代碼
所有配置OK後,運行nginx,確保能夠正常工做。
①、建立一個目錄,好比:
mkdir -p /data/docker-nginx-proxy
cd /data/docker-nginx-proxy
複製代碼
②、建立 supervisor配置文件,注意必須非daemon模式,因此此處crond會帶上-n參數:
[supervisord]
nodaemon=true
[program:crond]
command=crond -n
[program:nginx]
command=/usr/local/nginx/sbin/nginx
複製代碼
③、繼續建立其餘所需文件,好比 crontab.list:
*/20 * * * * /usr/local/nginx/sbin/nginx -s reload > /dev/null 2>&1
複製代碼
④、將前面的nginx目錄拷貝過來:
cp -rf /usr/local/nginx .
⑤、編寫Dockerfile文件:
vim Dockerfile
FROM centos/nginx-proxy-base:latest
MAINTAINER <jagerzhang@tencent.com>
# 將所需文件複製到鏡像指定路徑
ADD nginx /usr/local/nginx
ADD supervisord.conf /etc/supervisord.conf
# 定義一些命令(由於Docker是分層的,這裏建議將多個命令經過&&鏈接,寫到一個RUN裏面來減小Docker層數)
# 指定時區,解決Dcoker時間和宿主機時間差別問題
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo Asia/Shanghai > /etc/timezone && \
ln -sf /usr/local/nginx/sbin/nginx /bin/ && \
echo 'daemon off;' >> /usr/local/nginx/conf/nginx.conf && \
crontab /etc/crontab.list
# 運行 supervisor,這裏注意CMD只能用一次
CMD ["/usr/bin/supervisord"]
複製代碼
附:dockerfile 經常使用指令,能夠按實際需求自行添加:
FROM:指定基礎image
MAINTAINER:用來指定鏡像建立者信息
ADD:從src複製文件到container的dest路徑
RUN:在容器裏面執行命令
CMD:設置container啓動時執行的操做,只能是一條,多條則只執行最後一條
EXPOSE:指定容器須要映射到宿主機器的端口,也能夠再run的時候指定
ENV:用於設置環境變量
VOLUME:指定掛載點,使容器中的一個目錄具備持久化存儲數據的功能
複製代碼
命令爲:docker build -t="[name]:[tag]" ./ ,好比:
docker build -t="centos/nginx-proxy:v1" ./
build以後,再執行docker images就能夠看到剛剛建立的鏡像:
[root@MyServer docker-nginx-proxy]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/nginx-proxy v1 f2ed91429b31 31 seconds ago 370.8 MB
centos/nginx-proxy-base latest 676fcfff6d3c About an hour ago 366 MB
複製代碼
接着,能夠下測試鏡像是否能正常運行,命令語法大體以下:
docker run -v [宿主目錄]:[鏡像目錄] -ti -p [宿主端口]:[鏡像端口] 鏡像名稱:版本
複製代碼
若加上 -d 參數,docker將會後臺運行,這裏咱們想看下剛剛建立的鏡像是否正常, 因此採用前臺運行模式,命令以下:
docker run -v /data/docker:/data/wwwlogs -ti -p 80:80 centos/nginx-proxy:v1
複製代碼
執行過程:
[root@MyServer docker-nginx-proxy ~]# docker run -v /data/docker:/data/wwwlogs -ti -p 443:443 -p 80:80 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
/usr/lib/python2.7/site-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
2017-09-03 06:34:59,613 CRIT Supervisor running as root (no user in config file)
2017-09-03 06:34:59,615 INFO supervisord started with pid 1
2017-09-03 06:35:00,617 INFO spawned: 'nginx' with pid 7
2017-09-03 06:35:00,622 INFO spawned: 'crond' with pid 8
2017-09-03 06:35:01,689 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-09-03 06:35:01,689 INFO success: crond entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
複製代碼
能夠看到,鏡像可以正常運行,接着咱們還能夠繼續測試下啓動的Nginx是否可以正常提供服務,這裏就不詳細介紹了。
前文已經制做了一個帶有Nginx反向代理服務的Docker鏡像,此時還只能在本地使用,如果要讓其餘服務器也能用到這個鏡像,咱們可使用 docker registry 建立一個私有倉庫,步驟以下:
docker pull registry
複製代碼
此時,執行docker images應該能夠看到4個鏡像:
[root@MyServer docker-nginx-proxy]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/nginx-proxy v1 f2ed91429b31 About an hour ago 370.8 MB
centos/nginx-proxy-base latest 676fcfff6d3c 2 hours ago 366 MB
docker.io/centos latest 328edcd84f1b 4 weeks ago 192.5 MB
docker.io/registry latest 9d0c4eabab4d 3 months ago 33.17 MB
複製代碼
docker run -d -p 5000:5000 -v /data/images:/tmp/registry docker.io/registry
複製代碼
第一步查看鏡像列表時,拿到須要推送的鏡像的ID,好比 f2ed91429b31
①、先打tag,語法以下:
docker tag [image id] [倉庫地址]/[命名空間]/[鏡像名稱]:[版本]
②、而後push,語法以下:
docker push [倉庫地址]/[命名空間]/[鏡像名稱]
執行過程以下所示:
[root@MyServer docker-nginx-proxy]# docker tag f2ed91429b31 localhost:5000/centos/nginx-proxy:latest
[root@MyServer docker-nginx-proxy]# docker push localhost:5000/centos/nginx-proxy
The push refers to a repository [localhost:5000/centos/nginx-proxy]
158fae47d4e2: Pushed
4a5dcec3edb7: Pushed
ae9a40cbe568: Pushed
7abc8eb8fc0f: Pushed
d8a5f0f5adc1: Pushed
7dc25a4e14aa: Pushed
c7ee46ed4410: Pushing [===> ] 9.669 MB/153.1 MB
b362758f4793: Pushing [======> ] 26.78 MB/192.5 MB
複製代碼
完成後,執行docker images就能夠看到剛剛提交的鏡像了:
[root@MyServer docker-nginx-proxy]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/centos/nginx-proxy latest f2ed91429b31 About an hour ago 370.8 MB
centos/nginx-proxy v1 f2ed91429b31 About an hour ago 370.8 MB
centos/nginx-proxy-base latest 676fcfff6d3c 2 hours ago 366 MB
docker.io/centos latest 328edcd84f1b 4 weeks ago 192.5 MB
docker.io/registry latest 9d0c4eabab4d 3 months ago 33.17 MB
複製代碼
③、測試拉取:
如今能夠在本機(本機能夠先刪除在拉取)或另找一臺服務器進行docker pull拉取測試。
好比,先在宿主機上刪除這個鏡像:
[root@MyServer docker-nginx-proxy]# docker rmi localhost:5000/centos/nginx-proxy
Untagged: localhost:5000/centos/nginx-proxy:latest
Untagged: localhost:5000/centos/nginx-proxy@sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152
複製代碼
此時,docker images 列表已經消失,再執行 docker pull 就又回來了。
[root@MyServer docker-nginx-proxy]# docker pull localhost:5000/centos/nginx-proxy
Using default tag: latest
Trying to pull repository localhost:5000/centos/nginx-proxy ...
sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152: Pulling from localhost:5000/centos/nginx-proxy
Digest: sha256:20e7898413c368ee8dbfac0649fbfbb2d43510c3024d01e6ea3ec3f1a5d7c152
Status: Downloaded newer image for localhost:5000/centos/nginx-proxy:latest
複製代碼
當私有倉庫沒法使用時(好比存在網絡限制),咱們還能夠將鏡像保存爲一個tar包,方便離線使用,使用也很是簡單:
①、export / import 方案
使用 docker ps -a 查看當前正在運行的docker鏡像列表,獲得對應的 CONTAINER ID,執行以下語句能夠將運行中的鏡像導出到指定tar包:
docker export [CONTAINER ID] > centos-nginx-proxy-latest.tar
複製代碼
有了tar包以後,就可使用 import 來導入:
cat centos-nginx-proxy-latest.tar | docker import - centos/nginx-proxy:v1
複製代碼
②、save / load 方案
使用 docker images 查看本地已有鏡像列表,獲得對應的IMAGE ID,而後執行以下語句能夠將本地已存在鏡像保存到指定tar包:
docker save [IMAGE ID] > centos-nginx-proxy-latest.tar
複製代碼
後面則可使用 load 來加載tar包鏡像:
docker load < centos-nginx-proxy-latest.tar
複製代碼
兩種方案的區別: •export 只能導出正在運行的鏡像,而 save 能夠直接導出本地鏡像; •export 導出的鏡像文件通常會小於 save 保存的鏡像(本文實踐數據:相差38MB); •export 導出(import導入)是根據容器拿到的鏡像,再導入時會丟失鏡像全部的歷史,因此沒法進行回滾操做(docker tag ,而save保存(load加載)的鏡像,沒有丟失鏡像的歷史,能夠回滾到以前的層(layer)。
上述私有倉庫其實已經能夠知足整個實驗背景需求,咱們能夠在購買其餘雲主機以後,就能夠經過私有倉庫外網地址快速拉起一個Nginx反向代理服務了。
可是,咱們都知道國內的雲主機都是小水管,而按流量收費的模式也比較昂貴。此時,本文的主角才姍姍來遲:騰訊雲-容器服務。
簡單來講,騰訊雲的容器服務,就是給咱們提供了一個在雲端的Docker私有倉庫,咱們能夠將製做好的鏡像,推送到騰訊雲私有鏡像倉庫,而後就能夠在騰訊雲或國內外其餘雲主機上快速拉起自定義的Docker鏡像服務了,很是很是方便!並且,最重要的是...該服務目前免費。
下面簡單分享一下騰訊雲容器服務的使用方法。
①、開通鏡像服務
打開騰訊雲-容器服務:https://console.qcloud.com/ccs
按照頁面提示填寫相關信息並設置倉庫密碼:
②、接着在【個人建立】頁面新建一個鏡像倉庫:
獲得騰訊雲私有倉庫地址:
即:ccr.ccs.tencentyun.com/myspace/nginx-proxy
③、重置密碼
若是忘記密碼的話,可使用【重置密碼】功能來設置新的密碼:
①、倉庫認證
username 填寫你登陸騰訊雲的帳號,通常是QQ號碼
docker login --username=[username] ccr.ccs.tencentyun.com
複製代碼
②、推送鏡像
和前文推送鏡像到本地私有倉庫同樣,先查看鏡像ID,而後以下先打tag,而後推送:
docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]
docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[tag]
複製代碼
好比:
docker tag f2ed91429b31 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
docker push ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
複製代碼
成功後,就能夠在騰訊雲容器頁面查看到剛剛提交的鏡像版本了:
最後,咱們就能夠在須要部署Nginx反代服務的雲主機上進行拉取操做了。
好比,我在阿里雲主機上拉取這個鏡像:
①、安裝docker:yum install docker
②、啓動docker:systemctl restart docker.service
③、登陸騰訊雲倉庫
docker login --username=xxxxx http://ccr.ccs.tencentyun.com/myspace/nginx-proxy
複製代碼
④、拉取鏡像
docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy
[root@iZbp1ct9hsppxrazdvn54mZ ~]# docker pull ccr.ccs.tencentyun.com/myspace/nginx-proxy
Using default tag: latest
Trying to pull repository ccr.ccs.tencentyun.com/myspace/nginx-proxy ...
latest: Pulling from ccr.ccs.tencentyun.com/myspace/nginx-proxy
74f0853ba93b: Downloading [===========================> ] 39.11 MB/72.25 MB
e7fa91cce4c4: Downloading [================================> ] 37.65 MB/57.14 MB
c7319b8f7fbc: Download complete
faf8180992b4: Download complete
79327b915b74: Download complete
702ede4e59c4: Download complete
77e09cc85e34: Download complete
8a265e81261a: Download complete
複製代碼
⑤、運行鏡像
這裏咱們正式執行,因此加上 -d 參數:
docker run -v /data/docker:/data/wwwlogs -dti -p 443:443 -p 80:80 ccr.ccs.tencentyun.com/myspace/nginx-proxy:latest
複製代碼
整個過程不到5分鐘,真的很是方便!
本文記錄了一個實際的Dokcer應用場景從建立、上傳直到部署的詳細過程,Docker爲咱們提供了一個新的軟件發佈方式,只要將應用以及相關的依賴打包成Docker鏡像,並上傳到鏡像倉庫以後,咱們就能夠快速拉起一個定製服務,毫無拖泥帶水,從而極大的簡化了部署。
本文還簡單的介紹了騰訊雲的容器服務,經過容器服務,咱們能夠上傳自定製Docker鏡像,能夠在騰訊雲主機或其餘國內網服務器上快速拉起應用服務,加快了業務部署節奏,並下降了運維成本。
嗯,固然最重要的仍是我經過這個實踐,熟悉了Docker的基本知識和基礎使用方法,從而實現了個人Docker入門學習目標。
##相關閱讀 使用 docker 搭建你的 typecho 我的博客 5 種 Docker 日誌最佳實踐 Docker 遠程 python API 操做容器一例
此文已由做者受權騰訊雲技術社區發佈,轉載請註明文章出處 原文連接:https://cloud.tencent.com/community/article/287910