基於docker構建測試環境
0x02 映象基本操作
0x03 容器基本操作
0x04 容器的修改與儲存
0x05 使用Dockerfile定製映象
0x01介紹
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源,它可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化;容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低,通過docker我們可以快速搭建起比vm輕便很多的測試環境。
映象
:是用於建立 Docker 容器的模板
容器
:獨立執行的一個或一組應用
倉庫
:映象的集中存放地,可以理解為程式碼控制中的程式碼倉庫,Docker Hub(
這裡使用的是Ubuntu18來進行實踐的
0x02 映象基本操作
docker的安裝不細說了,網上有大量的內容。
從倉庫中獲取映象
搜尋映象
docker search image_name
這裡以nginx為例
可以看到查詢後有5列內容,依次是:
名字、描述、獲得的star數、是否官方提供、映象是否是通過自動化構建生成的
如果要對搜尋結果進行過濾的話,可以通過以下的命令來進行
是否是官方提供
docker search --filter "is-official=true" image_name
是否是自動化構建
docker search --filter "is-automated=true" image_name
大於多少星的
docker search --filter starts=100 image_name
下載映象
docker pull image_name
這塊就完全取決於網速了,我們可以通過更換國內的源來加快速度
Linux位置:
/etc/docker/daemon.json
Windows位置:
%programdata%\docker\config\daemon.json
在配置檔案中加入以下配置內容即可
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
改完以後需要重啟dockers服務
檢視本地存在的映象
docker images
同樣也有5列內容,它們依次是:
名字、標籤、ID、映象的建立時間、映象的大小
刪除本地映象
docker rmi image_name
這裡我就不進行執行了
0x03 容器基本操作
上面我們獲取了映象,現在就可以通過映象來建立容器了
建立容器
docker run -itd --name=container_name image_name
PS:
-i:以互動模式執行容器
-d:後臺執行容器並返回容器ID
-t:容器重新分配一個偽輸入終端
--name:為容器自定義一個名字
這裡返回的資訊就是容器的ID,後面檢視執行容器時候的容器ID也是這一串,不過是前幾位,但是已經足夠表示它的唯一性了
檢視執行中的容器
docker ps
有7列內容,它們依次是:
容器ID、採用映象、容器啟動後執行的命令、建立時間、狀態、埠、自定義的名字
檢視所有的容器(包括已停止的)
docker ps -a
停止容器
docker stop container_name/container_id
然後我們順便嘗試一下檢視全部容器的命令結果
啟動容器
docker start container_name/container_id
重啟容器
docker restart container_name/container_id
刪除容器
docker rm container_name/container_id
這裡我們來使用容器ID來進行演示
如果想要刪除容器,必須先把容器關閉掉
0x04 容器的修改與儲存
為什麼會要有儲存操作,因為當你刪除掉容器之後,重新再建立容器,你之前所修改的操作是不會儲存的,所以我們就需要涉及到容器的儲存操作
進入容器
docker exec -it container_name/container_id command
退出容器
exit
上面的建立檔案操作是為了驗證一下
停止容器後重啟,所進行的更改是還存在的;如果刪除掉後是不會存在的
重啟後:
刪除後:
提交修改
docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
PS:
-a:可選引數,用於指定作者
-m:可選引數,提交資訊,表明自己所作的修改
new_image_name:自定義新的映象的名稱
tag_name:新的映象的標籤,預設為latest
首先先進行一系列的修改
退出後,我們進行提交修改操作
可以發現提交後返回的值就是映象的ID
然後我們再通過這個新建立的映象來啟動一個容器看一下是否儲存了之前的修改操作
可以發現內容都是存在的
PS:這裡還有一個點大家需要注意一下tag_name預設是latest,如果你沒有自定義tag_name的時候,在啟動的時候可以不寫,如果自定義過的話,在啟動的時候需要加上tag_name的值
埠對映
為什麼要進行埠對映?
因為所有的執行都是在容器中的,而我們能提供服務的是我們的宿主機,所以只有進行埠對映才能從外部訪問我們搭建好的容器系統。
docker run -itd --name=container_name -p 宿主機埠號:容器埠號 image_name
然後訪問本地的8080埠就可以訪問到nginx容器的80埠了
檔案掛載
可以將本地的檔案掛載到容器中,這裡的目錄需要寫絕對路徑
docker run -itd --name=container_name -v /宿主機檔案目錄/檔名:/容器檔案目錄/檔名 image_name
然後我們再訪問本地的8080埠看一下效果
PS:如果本地修改了檔案,容器中的也會相應更改的
在宿主機和容器之間複製檔案
docker cp 容器名:/容器檔案目錄/檔名 /宿主機檔案目錄/檔名
docker cp /宿主機檔案目錄/檔名 容器名:/容器檔案目錄/檔名
容器互聯
可以在容器和容器之間進行操作,在docker中每一個容器只提供一個功能,如果需要進行組合工作的話,是需要同時啟動多個容器來進行配合的。
docker run -itd --name=container_name --link 要關聯的容器名字:容器在被關聯容器中的別名 image_name
這裡我們來演示PHP和MySQL兩個容器配合工作
首先我們先將PHP和MySQL的映象下載回來
首先我們先啟動一個MySQL的容器
因為在這個組合中PHP的執行依賴於MySQL,所以我們先啟動MySQL容器;而且因為資料庫所產生的內容都將是非常重要的,而刪除容器之後,裡面的資料是不會保留下來的,所以我們使用掛載的方式將我們宿主機上的目錄掛載到MySQL容器中
這裡我們還需要對MySQL的root密碼進行初始化的操作,所以加上-e引數來對其進行初始化,-e引數是將環境變數資訊傳入容器中
由於MySQL8版本的特性,我們需要重新設定一下root密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wuxin';
關於MySQL8的一些操作可以參考《MySQL8.0操作命令》
然後就可以正常登陸了
然後進行簡單的資料插入
然後啟動PHP容器
然後和MySQL建立連線
發現沒有pdo_mysql外掛,需要自己進行安裝,docker自己內建了下載方式
然後我們更改一下php程式碼
仔細觀察應該可以發現,我們這裡的資料庫連線地址寫的是mysql而不是IP地址,這裡的mysql其實就是我們在關聯容器的時候,所起的那個別名,如下圖所畫的那個直線所示的內容
這裡是因為IP地址的話,會經常變化,如果使用別名的話就不會有任何的問題了。
然後再次進入docker進行執行
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)
- 掃碼關注即可