前言:
作為一個開發人員,每每在更換電腦或重裝系統時,要重新安裝開發工具搭建開發環境。所以有的人會封裝一下系統(這里指windows),將平時用到的環境和工具全安裝在里面,改改OEM,以后換了電腦就直接拿封裝的系統安裝就方便很多。
同樣但也不一樣的,在開發完的應用程序在需要更換IDC或者部署分布式時。針對應用又要重新搭建環境,安裝軟件依賴等等。所以這時候可以將應用軟件以及環境依賴一並作為docker鏡像,部署的時候直接拉取鏡像,啟動后為容器就可以正常運行了。
Docker簡介:
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker與虛擬機的區別:
上面系統封裝與鏡像制作,我說過兩者有相同但也一點不同。所以就以我的理解簡單介紹一下Docker與虛擬機的區別。網上也有很多詳細介紹兩者架構的原理及原理圖,這里就略過原理直接說差異。
使用場景:Docker適合隔離應用,虛擬機能隔離用戶(更能隔離應用),因為有獨立完整的操作系統。
技術方面:虛擬機是通過虛擬化硬件並CPU要支持虛擬化技術,Docker容器只是在宿主操作系統上開啟了Docker引擎,比如一個CentOS鏡像是一套文件系統,引擎將容器放入到一個進程中並相互隔離。各個容器共用同一套操作系統資源,不需要虛擬化硬件,啟動快速。
Docker的安裝:
在windows下有兩個工具, docker toolbox 針對win7, win8,工具集合了Virtual Box(虛擬機軟件),Kitematic(docker圖形化軟件),和其他幾個命令終端工具。針對win10的是 Docker for Windows Installer 。
安裝完畢后點擊Docker Quickstart啟動 Docker Toolbox 終端。命令執行會先在Virtualbox創建一個名字為default的CentOS虛擬機並安裝了Docker。CentOS默認賬號docker, 密碼tcuser,Ip在啟動toolbox時在命令板上顯示,可以通過Xshell連接。
鏡像下載&容器使用
最簡單的就是打開Kitematic工具,網絡正常時會展示主流的鏡像,選擇其中一個點擊“create”就會下載並在左側欄啟動容器。容器的啟動和停止重啟在圖形化界面中也很方便地操作。下面就下載PHP和 Nginx並運行在瀏覽器打開。
1. nginx,php容器設置與使用
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root /var/www; index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?/$1 last; } } location ~ \.php { root /var/www; fastcgi_pass 192.168.99.100:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /var/www/index.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 192.168.99.100:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
2. 鏡像的制作
鏡像制作就需要使用 Dockerfile ,類似PHP項目中的composer.json,用於構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
這里僅講解如何運行 Dockerfile 文件來定制一個鏡像,具體 Dockerfile 文件內指令詳解,將在下一節中介紹,這里你只要知道構建的流程即可。
(1)、下面以定制一個 nginx 鏡像(構建好的鏡像內會有一個 /usr/share/nginx/html/index.html 文件)
在一個空目錄下,新建一個名為 Dockerfile 文件,並在文件內添加以下內容:
FROM nginx RUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html
(2)、FROM 和 RUN 指令的作用
FROM:定制的鏡像都是基於 FROM 的鏡像,這里的 nginx 就是定制需要的基礎鏡像。后續的操作都是基於 nginx。
RUN:用於執行后面跟着的命令行命令。有以下倆種格式:
shell 格式:
RUN <命令行命令> # <命令行命令> 等同於,在終端操作的 shell 命令。
exec 格式:
RUN ["可執行文件", "參數1", "參數2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:
FROM centos
RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上執行會創建 3 層鏡像。可簡化為以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz 如上,以 && 符號連接命令,這樣執行后,只會創建 1 層鏡像。
在 Dockerfile 文件的存放目錄下,執行構建動作。
以下示例,通過目錄下的 Dockerfile 構建一個 nginx:test(鏡像名稱:鏡像標簽)。
注:最后的 . 代表本次執行的上下文路徑,下一節會介紹。
以上顯示,說明已經構建成功。
鏡像上傳到遠程鏡像庫
1. 首先在docker hub官網注冊一個賬號,然后可以正在登陸,Kitematic 也可以登陸試試。
2. 打開docker cli命令面板,輸入docker login,輸入docker hub賬號密碼后,顯示login success后,就可以准備自己本地的鏡像文件了。
3. docker images查看本地的所有鏡像文件,記住鏡像完整名稱,然后給要提交的鏡像加標簽,這時會生成兩個鏡像ID一樣的鏡像文件。然后通過docker push 完整的鏡像文件:包括標簽名,最后就可以推送到自己的鏡像庫了。
上傳至阿里雲鏡像庫
1. 首先有阿里雲賬戶,登錄成功后開通"容器鏡像服務",設置賬號密碼,並建立空間和倉庫,點擊管理可以看到登錄,拉取,推送的命令。
2. 同樣的方式打開docker cli命令面板或者xshell連接docker中登錄阿里鏡像賬號,同樣的方式找到本地做好的鏡像然后推送。
3. 拉取docker hub和阿里鏡像都通過 docker pull 完整的鏡像名,就可以拉取到本地,然后通過docker images查看。