【Docker系列教程之四】Dockerfile入門
在上一篇的文章中,我們把 Docker
容器的工作流程剖析的十分清楚了,我們大體可以知道 Docker
元件協作執行容器可以分為以下幾個過程:
-
Docker
客戶端執行docker run
命令 -
Dockerdaemon
發現本地沒有我們需要的映象 -
daemon
從DockerHub
下載映象 -
下載完成後,映象被儲存到本地
-
Dockerdaemon
啟動容器
瞭解了這些過程以後,我們再來理解這些命令就不會覺得很突兀了,下面我來給大家講講 Docker
常用的一些命令操作吧。
Docker常用命令
我們可以通過 docker-h
去檢視命令的詳細的幫助文件。在這裡我只會講一些平常日常比賽或者生活中我們可能會用的比較多的一些命令。
例如,我們需要拉取一個 docker
映象,我們可以用如下命令:
docker pull image_name
image_name
為映象的名稱,而如果我們想從 DockerHub
上去下載某個映象,我們可以使用以下命令:
docker pull centos:latest
centos:lastest
是映象的名稱, Dockerdaemon
發現本地沒有我們需要的映象,會自動去 DockerHub
上去下載映象,下載完成後,該映象被預設儲存到 /var/lib/docker
目錄下。
接著我們如果想檢視下主機下存在多少映象,我們可以用如下命令:
docker images
我們要想知道當前有哪些容器在執行,我們可以用如下命令:
docker ps -a
-a
是檢視當前所有正在執行的容器
我們該如何去對一個容器進行啟動,重啟和停止呢?我們可以用如下命令:
docker start container_name/container_id docker restart container_name/container_id docker stop container_name/container_id
這個時候我們如果想進入到這個容器中,我們可以使用 attach
命令:
docker attach container_name/container_id
那如果我們想執行這個容器中的映象的話,並且呼叫映象裡面的 bash
,我們可以使用如下命令:
docker run -t -i container_name/container_id /bin/bash
那如果這個時候,我們想刪除指定映象的話,由於 image
被某個 container
引用(拿來執行),如果不將這個引用的 container
銷燬(刪除),那 image
肯定是不能被刪除。我們首先得先去停止這個容器:
docker ps -a
docker stop container_name/container_id
然後我們用如下命令去刪除這個容器:
docker rm container_name/container_id
然後這個時候我們再去刪除這個映象:
docker rmi image_name
此時,常用的 Docker
相關的命令就講到這裡為止了,我們在後續的文章中還會反覆地提到這些命令。
Dockerfile是什麼
前面我們已經提到了 Docker
的一些基本概念。以 CTF
選手的角度來看,我們可以去使用 Dockerfile
定義映象,依賴映象來執行容器,可以去模擬出一個真實的漏洞場景。因此毫無疑問的說, Dockerfile
是映象和容器的關鍵,並且 Dockerfile
還可以很輕易的去定義映象內容,說了這麼多,那麼 Dockerfile
到底是個什麼東西呢?
Dockerfile
是自動構建 docker
映象的配置檔案, 使用者可以使用 Dockerfile
快速建立自定義的映象。 Dockerfile
中的命令非常類似於 linux
下的 shell
命令。
我們可以通過下面這幅圖來直觀地感受下 Docker 映象、容器和 Dockerfile 三者之間的關係。
我們從上圖中可以看到, Dockerfile
可以自定義映象,通過 Docker
命令去執行映象,從而達到啟動容器的目的。
Dockerfile
是由一行行命令語句組成,並且支援已 #
開頭的註釋行。
一般來說,我們可以將 Dockerfile
分為四個部分:
-
基礎映象(父映象)資訊指令
FROM
-
維護者資訊指令
MAINTAINER
-
映象操作指令
RUN
、EVN
、ADD
和WORKDIR
等 -
容器啟動指令
CMD
、ENTRYPOINT
和USER
等
下面是一段簡單的Dockerfile的例子:
-
FROM python:2.7
-
MAINTAINER Angel_Kitty <[email protected].com>
-
COPY . /app
-
WORKDIR /app
-
RUN pip install -r requirements.txt
-
EXPOSE 5000
-
ENTRYPOINT ["python"]
-
CMD ["app.py"]
我們可以分析一下上面這個過程:
-
1、從
DockerHub
上pull
下python2.7
的基礎映象 -
2、顯示維護者的資訊
-
3、
copy
當前目錄到容器中的/app
目錄下 複製本地主機的<src>
(Dockerfile
所在目錄的相對路徑)到容器裡<dest>
-
4、指定工作路徑為
/app
-
5、安裝依賴包
-
6、暴露
5000
埠 -
7、啟動
app
這個例子是啟動一個 python flask app
的 Dockerfile
( flask
是 python
的一個輕量的 web
框架),相信大家從這個例子中能夠稍微理解了Dockfile的組成以及指令的編寫過程,我們將會在下一篇文章中詳細講解Dockerfile的一些常見的操作指令。