從最簡單的入手學習 Docker (一)

coding01發表於2019-02-16

group_5622_0
group_5622_0

什麼是 Docker

Docker is the leading Containers as a Service (CaaS) platform

Docker is the world’s leading software container platform. Developers use Docker to eliminate “works on my machine” problems when collaborating on code with co-workers. Operators use Docker to run and manage apps side-by-side in isolated containers to get better compute density. Enterprises use Docker to build agile software delivery pipelines to ship new features faster, more securely and with confidence for both Linux, Windows Server, and Linux-on-mainframe apps.

Docker 作用

執行環境儘可能一致

不管是在大公司還是小公司,由於程式碼有版本控制,大家的程式碼能保證一致;但由於大家相互之間的開發硬體不一樣 (如,有人喜歡在 windows 環境下開發,有些人用 Mac 電腦),必然導致開發環境不一致,有時候就因為環境不一致,而誤解為程式碼的問題,如 (有些語言,在 windows 下對大小寫不敏感,但在 Linux下敏感),所以提供一個如何保證相同的開發執行環境就顯得很重要了。

Java 曾提出 「Write Once, Run Anywhere」,而 Docker 則提出了 「Build once, Run anywhere, Configure once, Run anything」。

Java 的一個非常重要的特性就是與平臺無關性,而使用 Java 虛擬機器是實現這一特性的關鍵。Java 虛擬機器遮蔽了與具體平臺相關的資訊,使得 Java 語言編譯程式只需生成可以在 Java 虛擬機器上執行的目的碼 (位元組碼),就可以在多種平臺上不加修改的執行。

和 Java 虛擬機器類似,Docker 使用容器引擎解決平臺依賴問題,它在每臺宿主機上都啟動一個 Docker 的守護程式,守護程式遮蔽了與具體平臺相關的資訊,對上層應用提供統一的解析給不同平臺上的執行驅動,儲存驅動和網路驅動去執行。

解決本地多個專案多種環境相互干擾的問題

可能由於不同的專案需要不同的開發環境,如有些專案需要 PHP 5.6,有些專案需要 PHP7.0;有些專案需要 Apache,有些專案需要 Nginx。在同一臺電腦上需要同時安裝相同軟體的不同版本,或者同時執行相同埠 (如:80),這些都避免不了出現衝突的情況。

有時候我們並不想電腦上同時安裝很多開發軟體,這時候 Docker 就發揮作用了。根據不同的專案,使用不同的 Docker 映象,搭建開發環境;而每一個 Docker 應用有自己一個獨立的執行環境,互不干擾。

Docker 具有版本控制能力

Docker 容器還可以像 git 倉庫一樣,可以讓你提交變更到 Docker 映象中並通過不同的版本來管理它們。設想如果你因為完成了一個元件的升級而導致你整個環境都損壞了,Docker 可以讓你輕鬆地回滾到這個映象的前一個版本。這整個過程可以在幾分鐘內完成,如果和虛擬機器的備份或者映象建立流程對比,那 Docker 算相當快的,它可以讓你快速地進行復制和實現冗餘。

如何測試人員還是運維人員,也可以根據最新版本的映象來測試和部署新的測試環境和生產環境。

Docker 基本使用

第一個映象

為了加速下載 Docker 映象,可以使用國內的一些加速器,如daocloud,如 Mac:

Docker For Mac
右鍵點選桌面頂欄的 docker 圖示,選擇 Preferences ,在 Daemon 標籤(Docker 17.03 之前版本為 Advanced 標籤)下的 Registry mirrors 列表中加入下面的映象地址:

40974b5e.m.daocloud.io

點選 Apply & Restart 按鈕使設定生效。
更多參考:
www.daocloud.io/mirror#acce…

WX20170910-211235@2x
WX20170910-211235@2x

PHP 專案中建立一個Dockerfile

FROM daocloud.io/php:5.6-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./hello.php" ]複製程式碼

寫個 hello.php

<?php 
  echo "hello yemeishu";    
?>複製程式碼

建立映象

docker build -t my-php-app .複製程式碼

WX20170910-212504@2x
WX20170910-212504@2x

查詢映象

docker images複製程式碼

WX20170910-212700@2x
WX20170910-212700@2x

第一個容器

有了第一個映象,就可以利用這個映象,建立容器,執行程式碼。

docker run -it --rm --name my-running-app my-php-app複製程式碼

WX20170910-213651@2x
WX20170910-213651@2x

資料卷

正如之前所說的,程式碼有版本控制,映象的一個目標是:讓我們的執行環境一致。所以我們的做法是儘可能將程式碼和映象分離開來。

這時候就需要利用到「資料卷」。資料卷是一個可供一個或者多個容器使用的特殊目錄,主要有以下幾個特點:

1.資料卷可以在容器之間共享和重用;
2.對資料卷的內容進行修改,會立刻生效;
3.資料卷內容並不包含在映象中,所以不會影響映象;

在使用 docker run 命令時,使用 -v 標記來建立一個資料卷,或者指定掛載一個本地主機的目錄到容器中,如我們將本地的 hello.php 掛載到容器中,其中稍微修改下hello.php

<?php
    $file_path = "public/test.txt";
    if(file_exists($file_path)){
        $fp = fopen($file_path,"r");
        $str = fread($fp,filesize($file_path));//指定讀取大小,這裡把整個檔案內容讀取出來
        echo $str = str_replace("\r\n","<br />",$str);
    }
?>複製程式碼

將本地的一個包含 test.txt 的 public 資料夾掛載到容器中,並讀取該檔案中的內容:

docker run -it --rm --name my-running-app -v /Users/ye/docker/learning/demo/public:/usr/src/myapp/public my-php-4複製程式碼

WX20170910-222305@2x
WX20170910-222305@2x

總結

Docker 需要並且可學習的東西還有很多,我們從編寫簡單的 Dockerfile 檔案來建立映象,建立容器,掛載資料卷,一步步去了解和使用 Docker。

下一步我們從如何利用已有的 laradock (github.com/laradock/la…)執行 Laravel 專案來進一步掌握 Docker。

附:Docker 常用命令資料卷

id 命令 含義
1 docker kill $(docker ps -a -q) 殺死所有正在執行的容器
2 docker rm $(docker ps -a -q) 刪除所有已經停止的容器
3 docker images 檢視本地映象
4 docker ps 檢視本地容器
5 docker build -t name:tag Dockerfile路徑 建立映象
6 docker exec-it IMAGE ID或者NAMES /bin/bash 進入容器
7 docker stop CONTAINER ID或者NAMES 關閉容器
8 docker start CONTAINER ID或者NAMES 重新啟動關閉的容器
9 docker rm CONTAINER ID或者NAMES 移除本地容器

coding01 期待您關注

qrcode
qrcode


感謝您能看到這了

qrcode
qrcode

相關文章