1. 程式人生 > >【Docker系列教程之四】Dockerfile入門

【Docker系列教程之四】Dockerfile入門

在上一篇的文章中,我們把 Docker 容器的工作流程剖析的十分清楚了,我們大體可以知道 Docker 元件協作執行容器可以分為以下幾個過程:

  1. Docker 客戶端執行 docker run 命令

  2. Dockerdaemon 發現本地沒有我們需要的映象

  3. daemon 從 DockerHub 下載映象

  4. 下載完成後,映象被儲存到本地

  5. 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的例子:

  1. FROM python:2.7

  2. MAINTAINER Angel_Kitty <[email protected].com>

  3. COPY . /app

  4. WORKDIR /app

  5. RUN pip install -r requirements.txt

  6. EXPOSE 5000

  7. ENTRYPOINT ["python"]

  8. 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的一些常見的操作指令。