基於docker構建測試環境

目錄

0x01介紹php

0x02 鏡像基本操做python

0x03 容器基本操做mysql

0x04 容器的修改與保存nginx

0x05 使用Dockerfile定製鏡像sql

0x01介紹

Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從Apache2.0協議開源,它可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化;容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低,經過docker咱們能夠快速搭建起比vm輕便不少的測試環境。docker

鏡像:是用於建立 Docker 容器的模板shell

容器:獨立運行的一個或一組應用數據庫

倉庫:鏡像的集中存放地,能夠理解爲代碼控制中的代碼倉庫,Docker Hub(https://hub.docker.com)提供了龐大的鏡像集合供使用json

這裏使用的是Ubuntu18來進行實踐的centos

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)
  • 掃碼關注便可
  • file
相關文章
相關標籤/搜索