1. 程式人生 > >基於docker構建測試環境

基於docker構建測試環境

0x02 映象基本操作

0x03 容器基本操作

0x04 容器的修改與儲存

0x05 使用Dockerfile定製映象

0x01介紹

Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源,它可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化;容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低,通過docker我們可以快速搭建起比vm輕便很多的測試環境。

映象:是用於建立 Docker 容器的模板

容器:獨立執行的一個或一組應用

倉庫:映象的集中存放地,可以理解為程式碼控制中的程式碼倉庫,Docker Hub(

https://hub.docker.com)提供了龐大的映象集合供使用

這裡使用的是Ubuntu18來進行實踐的

0x02 映象基本操作

docker的安裝不細說了,網上有大量的內容。

從倉庫中獲取映象

搜尋映象

docker search image_name

這裡以nginx為例

file

可以看到查詢後有5列內容,依次是:

名字、描述、獲得的star數、是否官方提供、映象是否是通過自動化構建生成的

如果要對搜尋結果進行過濾的話,可以通過以下的命令來進行

是否是官方提供

docker search --filter "is-official=true" image_name

file

是否是自動化構建

docker search --filter "is-automated=true" image_name

file

大於多少星的

docker search --filter starts=100 image_name

file

下載映象

docker pull image_name

file

這塊就完全取決於網速了,我們可以通過更換國內的源來加快速度

Linux位置:
/etc/docker/daemon.json
Windows位置:
%programdata%\docker\config\daemon.json

在配置檔案中加入以下配置內容即可

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

改完以後需要重啟dockers服務

file

檢視本地存在的映象

docker images

file

同樣也有5列內容,它們依次是:

名字、標籤、ID、映象的建立時間、映象的大小

刪除本地映象

docker rmi image_name

file

這裡我就不進行執行了

0x03 容器基本操作

上面我們獲取了映象,現在就可以通過映象來建立容器了

建立容器

docker run -itd --name=container_name image_name

PS:

-i:以互動模式執行容器

-d:後臺執行容器並返回容器ID

-t:容器重新分配一個偽輸入終端

--name:為容器自定義一個名字

file

這裡返回的資訊就是容器的ID,後面檢視執行容器時候的容器ID也是這一串,不過是前幾位,但是已經足夠表示它的唯一性了

檢視執行中的容器

docker ps

file

有7列內容,它們依次是:

容器ID、採用映象、容器啟動後執行的命令、建立時間、狀態、埠、自定義的名字

檢視所有的容器(包括已停止的)

docker ps -a

停止容器

docker stop container_name/container_id

file

然後我們順便嘗試一下檢視全部容器的命令結果

file

啟動容器

docker start container_name/container_id

file

重啟容器

docker restart container_name/container_id

file

刪除容器

docker rm container_name/container_id

這裡我們來使用容器ID來進行演示

如果想要刪除容器,必須先把容器關閉掉

file

0x04 容器的修改與儲存

為什麼會要有儲存操作,因為當你刪除掉容器之後,重新再建立容器,你之前所修改的操作是不會儲存的,所以我們就需要涉及到容器的儲存操作

進入容器

docker exec -it container_name/container_id command

file

退出容器

exit

file

上面的建立檔案操作是為了驗證一下

停止容器後重啟,所進行的更改是還存在的;如果刪除掉後是不會存在的

重啟後:

file

刪除後:

file

提交修改

docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name

PS:

-a:可選引數,用於指定作者

-m:可選引數,提交資訊,表明自己所作的修改

new_image_name:自定義新的映象的名稱

tag_name:新的映象的標籤,預設為latest

首先先進行一系列的修改

file

退出後,我們進行提交修改操作

file

可以發現提交後返回的值就是映象的ID

然後我們再通過這個新建立的映象來啟動一個容器看一下是否儲存了之前的修改操作

file

file

可以發現內容都是存在的

PS:這裡還有一個點大家需要注意一下tag_name預設是latest,如果你沒有自定義tag_name的時候,在啟動的時候可以不寫,如果自定義過的話,在啟動的時候需要加上tag_name的值

埠對映

為什麼要進行埠對映?

因為所有的執行都是在容器中的,而我們能提供服務的是我們的宿主機,所以只有進行埠對映才能從外部訪問我們搭建好的容器系統。

docker run -itd --name=container_name -p 宿主機埠號:容器埠號 image_name

file

然後訪問本地的8080埠就可以訪問到nginx容器的80埠了

file

檔案掛載

可以將本地的檔案掛載到容器中,這裡的目錄需要寫絕對路徑

docker run -itd --name=container_name -v /宿主機檔案目錄/檔名:/容器檔案目錄/檔名 image_name

file

然後我們再訪問本地的8080埠看一下效果

file

PS:如果本地修改了檔案,容器中的也會相應更改的

在宿主機和容器之間複製檔案

docker cp 容器名:/容器檔案目錄/檔名 /宿主機檔案目錄/檔名
docker cp /宿主機檔案目錄/檔名 容器名:/容器檔案目錄/檔名

file

容器互聯

可以在容器和容器之間進行操作,在docker中每一個容器只提供一個功能,如果需要進行組合工作的話,是需要同時啟動多個容器來進行配合的。

docker run -itd --name=container_name --link 要關聯的容器名字:容器在被關聯容器中的別名 image_name

這裡我們來演示PHP和MySQL兩個容器配合工作

首先我們先將PHP和MySQL的映象下載回來

file

file

file

首先我們先啟動一個MySQL的容器

因為在這個組合中PHP的執行依賴於MySQL,所以我們先啟動MySQL容器;而且因為資料庫所產生的內容都將是非常重要的,而刪除容器之後,裡面的資料是不會保留下來的,所以我們使用掛載的方式將我們宿主機上的目錄掛載到MySQL容器中

這裡我們還需要對MySQL的root密碼進行初始化的操作,所以加上-e引數來對其進行初始化,-e引數是將環境變數資訊傳入容器中

file

由於MySQL8版本的特性,我們需要重新設定一下root密碼

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wuxin';

關於MySQL8的一些操作可以參考《MySQL8.0操作命令

file

然後就可以正常登陸了

file

然後進行簡單的資料插入

file

然後啟動PHP容器

file

然後和MySQL建立連線

file

發現沒有pdo_mysql外掛,需要自己進行安裝,docker自己內建了下載方式

file

然後我們更改一下php程式碼

file

仔細觀察應該可以發現,我們這裡的資料庫連線地址寫的是mysql而不是IP地址,這裡的mysql其實就是我們在關聯容器的時候,所起的那個別名,如下圖所畫的那個直線所示的內容

file

這裡是因為IP地址的話,會經常變化,如果使用別名的話就不會有任何的問題了。

然後再次進入docker進行執行

file

0x05 使用Dockerfile定製映象

Dockerfile就是一個包含Linux命令的一個檔案,docker會通過讀取其中的命令來構建映象。

內容結構

Dockerfile一般分為四個部分: 基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行的指令

執行Dockerfile

docker build -t image_name:tag_name

或者通過-f引數來指定檔案位置來執行

docker build -f /path/Dockerfile

命令詳解

PS:如果多行內容都屬於一個命令的話,在結尾使用 &&\ 來表示換行

FROM:指定基礎映象,必須是第一個命令

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
例:
FROM centos:7.0

MAINTAINER:維護者資訊

MAINTAINER <name>
例:
MAINTAINER wuxin

RUN:構建映象時執行的命令

RUN <command>
RUN ["executable", "param1", "param2"]
例:
RUN yum install nginx
RUN ["/bin/executable", "param1", "param2"]

ADD:將本地檔案新增到容器中,也可以訪問網路資源,tar檔案會自動解壓

ADD <宿主機檔案路徑><容器路徑>
例:
ADD test* /test/  新增所有以test開頭的檔案
ADD tes?.txt /test/  ?可以替代一個單個字元

COPY:功能類似ADD,但是不能自動解壓,也不能訪問網路資源

CMD:在容器啟動時進行執行的內容,如果執行時指定了其他命令,這裡的內容將會被覆蓋

CMD ["executable", "param1", "param2"]  執行可執行檔案
CMD command param1 param2  執行shell內部命令
例:
CMD ["/usr/bin/wc", "--help"]
CMD echo "test"

PS:CMD用於指定在容器啟動時要執行的命令,RUN用於指定映象構建時所要執行的命令

ENTRYPOINT:與CMD類似,配置容器啟動時的執行命令,一定會被執行,即使執行 docker run時指定了其他命令

例:
ENTRYPOINT ["/bin/echo","Hello"]

LABEL:用於為映象新增元資料

LABEL <key>=<value> <key>=<value>
LABEL version="1.0" description="balabala"

ENV:設定環境變數

ENV <key> <value>
例:
ENV name wuxin
ENV names balabala

PS:key之後的內容均會被視為value,所以依次只能設定一個變數

EXPOSE:指定與外界互動的埠

EXPOSE <port> [<port>]
例:
EXPOSE 80 443
EXPOSE 8888

PS:EXPOSE不會讓容器的埠訪問到宿主機,需要在執行的時候使用-p引數來將所有的EXPOSE的埠匯出

VOLUME:用於指定持久化目錄

VOLUME ["/path/"]
例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log"]

WORKDIR:工作目錄

WORKDIR /path/workdir
例:
WORKDIR /usr/local  此時的工作目錄為/usr/local
WORKDIR nginx  此時的工作目錄為/usr/local/nginx

PS:設定完成後,RUN、CMD等命令執行時都會在該目錄下執行,在使用docker run執行時,可以通過-w引數覆蓋此時的設定

USER:指定容器執行時的使用者名稱或UID,後續的RUN命令也會使用指定使用者

USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
例:
USER wuxin

ARG:用於指定傳遞給構建執行時的變數

ARG <name>[=<default value>]
例:
ARG site
ARG build_user=www

ONBUILD:用於設定映象觸發器

ONBUILD [INSTRUCTION]
例:
ONBUILD ADD ./app/src
ONBUILD RUN /usr/local/bin/python-build –dir/app/src

PS:當所構建的映象被用作其他映象的基礎映象,該映象中的觸發器將會被觸發

注意:Dockerfile是分層的,執行的時候也是分層來進行執行的

  • 文章首發於本人公眾號:無心的夢囈(wuxinmengyi)
  • 掃碼關注即可