因爲最近在作基於Headless chrome + Robotframework + Docker +Jenkins架構的web自動化測試的預研工做,其中涉及到web自動化持續集成,須要搭建自動化測試環境;在經歷了不少痛苦的嘗試後,發現之前服務器上的Docker鏡像再也不適用,沒法知足目前的web自動化測試環境,因此着手學習下Docker並部署適用於項目的web自動化測試的鏡像。python
定義:Docker是一個開源的應用容器引擎,基於Go語言並聽從Apache2.0協議開源。git
功能:Docker可讓開發者打包他們的應用和依賴包到一個輕量級、可移植的容器中,而後發佈任何流行的Linux機器上,也能夠實現虛擬化。web
機制:容器徹底是沙箱機制,相互之間不會有任何接口(相似於iPhone的app),更重要的是容器開銷極低。chrome
一、web應用的自動化打包和發佈docker
二、自動化測試和持續集成、發佈shell
三、在服務型環境中部署和調整數據庫或其餘的後臺應用數據庫
四、從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PAAS環境編程
·Docker使用客戶端-服務器(C/S)架構模式,使用遠程API來管理和建立Docker容器api
·Docker容器經過Docker鏡像來建立bash
·Docker中的鏡像和容器相似於面向對象編程中的類和對象
Docker 鏡像(Images):Docker 鏡像是用於建立 Docker 容器的模板。
Docker 容器(Container):容器是獨立運行的一個或一組應用。
Docker 客戶端(Client):Docker客戶端經過命令行或者其餘工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通訊。
Docker 主機(Host):一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。
Docker 倉庫(Registry):Docker倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。
Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用
Docker Machine:Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。
·Ubuntu Precise 12.04 (LTS)
·Ubuntu Trusty 14.04 (LTS)
·Ubuntu Wily 15.10
·Xenial 16.04 (LTS)
·其餘更新的版本…
注:如需安裝Docker CE須要16.04以上(不包含16.14)的版本
使用如下命令能夠查看你的Ubuntu系統的版本:
命令:cat etc/issue
Docker在1.13之後有兩個版本,分別是CE和EE,CE是開源的社區版本、EE是收費企業版本
查看Docker版本:
命令:docker --version
Docker要求Ubuntu系統的內核版本高於3.10,首先得驗證你的Ubuntu系統內核版本是否支持Docker
命令:uname -r
如上在終端上敲入相應命令查詢到個人Ubuntu系統的內核版本是4.13版本
命令:wget -qO- https://get.docker.com/ | sh
Sh命令的做用是執行.sh腳本或是切換到sh這個bash裏,Linux默認的shell是bash
這裏的sh就是後面這個用處
輸入當前用戶密碼後,系統會自動下載腳本並安裝Docker及依賴包
安裝完成後有個提示:
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
sudo usermod -aG docker runoob
Remember that you will have to log out and back in for this to take effect!
當要以非root用戶能夠直接運行docker時,須要執行 sudo usermod -aG docker name 命令,而後從新登錄,不然會報錯
命令:sudo service docker start
前言:鏡像的製做主要分爲三個部分
一、獲取基礎鏡像(docker pull)
二、基於基礎鏡像製做所需的鏡像
三、將鏡像推送到製品庫進行保存(docker push)
製做鏡像主要有兩種方法,第一種使用commit命令製做,第二種使用dockerfile製做,下面來簡單的談一談這兩種方法的優缺點。
Commit:使用此方法方便開發者調試,但不方便過程的記錄,可複製性遠差於dockerfile
Dockerfile:Dockerfile是描述鏡像製做過程當中的文件,記錄了製做鏡像的過程,方便之後更改或者鏡像丟失後從新構建
·獲取基礎鏡像:能夠從docker hub或第三方網站拉取鏡像到本地
命令:docker pull [options] <dir_name>.<realm_name>:<tag>
Options說明:
-a:拉取全部tagged鏡像
--disable-content-trust:忽略鏡像的校驗,默認開啓
實例:docker pull docker hub xxxx:v1
從網上拉取基礎鏡像後使用docker images命令,查看本地服務器是否有已拉取的
基礎鏡像:
·基於基礎鏡像建立容器
基於上面已經pull下來的鏡像製做一個容器
命令:docker run [options] image [command]
實例:docker run --privileged --name=qinjiaxi_web_test --net=host -it -v ~:/share docker hub xxxx:v1
關於這一塊每一個項目或者說每一個人的需求都不同,所以安裝的應用程序和環境必然不會想相同,這裏沒法統一的進行硬性規定,只進行簡單的說明。
這裏主要用到apt這個命令
如:安裝python軟件:
命令:apt install python
固然須要安裝的東西比較多,並且有些軟件還有本身的依賴包,在安裝主軟件的同時優先進行依賴包的安裝不然沒法安裝主軟件,這裏有個強制安裝依賴包的命令供你們參考:apt -f install。
命令:docker commit [opions] containerid <repository>:<tag>
Options說明:
-a:提交的鏡像做者
-m:提交時的說明文字
-p:在commit時,將容器暫停
實例:docker commit -a 「qinjiaxi」 -m 「web_ci_test」 qinjiaxi_web_ci:web_ci_20190822
經過以上命令建立完成後,使用docker images命令查看本地鏡像,就能夠看到上面的鏡像被commit到本地了。
注:保存在本地的鏡像repository能夠隨便寫,可是若是想推到網絡上去就須要按照規定的格式來編輯,這裏提供兩種方法:
一、修改已有本地鏡像的repository和tag名稱(鏡像重命名):
命令:docker tag <image id> <new repository>:<new tag>
實例:docker tag 2d440113d507 zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822
二、在commit的時候就按照規定格式來建立鏡像
在上面第三部中就按照如下格式來commit:
實例:docker commit -a 「qinjiaxi」 -m 「web_ci_test」 zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822
命令:docker pull [options] <dir_name>.<realm_name>:<tag>
Options說明:
--disable-content-trust:忽略鏡像的校驗,默認開啓
實例:docker push zxxxxxx-xxxx-docker.xxxx.com.cn/webci/qinjiaxi_web_ci:web_ci_20190822
至此:commit方式製做鏡像已經完成。
下面附上docker commit中經常使用的dokcer命令:
command |
describe |
docker images |
查看本地全部鏡像(可加上grep分支來篩選,如:docker images|grep qinjiaxi) |
docker ps |
查看正在運行的容器(加上-a查看所有的容器,也可加上grep分支來篩選) |
docker start |
啓動一個容器(後面必選項爲container_name or container_id) |
docker attach |
運行一個容器(後面必選項爲container_name or container_id) |
docker pull |
從製品庫中下載基礎鏡像 |
docker push |
將本地鏡像推送到製品庫中 |
docker rm |
移除本地已有容器(後面的必選項爲container_name or container_id) |
docker rmi |
移除本地已有鏡像(後面的必選項爲image_name or image_id) |
docker tag |
對鏡像進行重命名 |
COMMAND |
FROMAT |
DESCRIPTION |
FROM |
FROM <REPOSITORY>:<TAG> |
指定基礎鏡像,必須爲第一個命令 |
MAINTAINER |
MAINTAINER <NAME> |
維護者信息 |
RUN |
RUN <COMMAND> |
鏡像容器中運行命令 |
ADD |
ADD <SCR> <DEST> |
將本地文件添加到容器中,tar格式自動解壓(網絡壓縮資源不會被解壓),能夠訪問網絡資源,相似wget |
COPY |
COPY <SCR> <DEST> |
複製本地文到容器中,壓縮格式文件不會進行解壓 |
CMD |
RUN <COMMAND> |
指定在容器啓動時全部執行的命令 |
ENV |
ENV <KEY> <VALUE> |
設置環境變量 |
WORKDIR |
WORKDIR <WORK_DIR> |
工做目錄,相似於cd命令 |
命令:mkdir docker_build
命令:cp dockerfile.txt /docker_build
命令:cd docker_build
docker build -f dockerfile.txt -t web_ci_test:v1 -q .
para |
description |
f |
指向任何路徑下的dockerfile文件 |
t |
指定生成鏡像的名稱,包含倉庫名稱和標籤名稱 |
q |
quiet模式減小無用的打印 |
. |
製做鏡像時資源文件的路徑,即當前目錄,須要將製做鏡像中用到的資源放入當前目錄下 |
學到這裏你們應該也忘記的差很少了,是時候該放棄docker學習(開個玩笑),最後對以上的知識進行一個總結:本文從docker的基本概念、架構、安裝調試、以及鏡像製做四個維度進行了講解和說明,期間有涉及到部分實例,實踐和理論的相結合更容易讓你們接受和運用,相信對後期開發中應用到docker場景的同窗有所幫助。