通過dockerfile製作鏡像

  Dockerfile是一個用於構建Docker鏡像的文本文件,其中包含了創建Docker鏡像的全部指令。就是將我們安裝環境的每個步驟使用指令的形式存放在一個文件中,最後生成一個需要的環境。
  Docker使用Dockerfile構建鏡像步驟:

  1. 創建dockerfile文件
  2. 通過build命令生成image鏡像文件
  3. 運行容器
  4. 上傳倉庫

創建dockerfile文件

1、創建dockerfile

新建一個文件夾,api-demo

然後進入api-demo,創建dockerfile

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ mkdir api—-demo
$ cd api—-demo/
$ touch Dockerfile
$ vi Dockerfile

編寫Dockerfile文件如下:

# 基於基礎鏡像
FROM python:3.6

# 設置code文件夾是工作目錄
WORKDIR /code

# 將代碼添加到code文件夾下
COPY test_api.py  /code/

# 更新pip
RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple

# pip安裝依賴包
RUN pip install -U pytest
RUN pip install -U requests

# 執行命令
CMD ["python", "test_api.py"]

2、dockerfile常用指令  

Dockerfile 語法:

Dockerfile語法由兩部分構成,註釋和命令+參數

示例:

# 基於基礎鏡像
FROM python:3.6

 

常用指令如下

ADD

ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上覆制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder 

COPY

用於將文件作爲一個新的層添加到鏡像中。通常使用 COPY 指令將應用代碼賦值到鏡像中。

COPY test_api.py  /code/

CMD

和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器後被調用。

CMD ["python", "test_api.py"]

ENTRYPOINT

配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

ENTRYPOINT 幫助你配置一個容器使之可執行化,如果你結合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留參數,參數將傳遞給ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

ENV

ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,並可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。

# Usage: ENV key value
ENV SERVER_WORKS 4  

EXPOSE

EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。

# Usage: EXPOSE [port]
EXPOSE 8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啓動構建流程。基礎鏡像可以爲任意鏡 像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。

# Usage: FROM [image name]
FROM ubuntu 

MAINTAINER

我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於聲明作者,並應該放在FROM的後面。

# Usage: MAINTAINER [name]
MAINTAINER authors_name 

RUN

RUN命令是Dockerfile執行命令的核心部分。它接受命令作爲參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。

# pip安裝依賴包
RUN pip install -U pytest

USER

USER命令用於設置運行容器的UID。

# Usage: USER [UID]
USER 751

VOLUME

VOLUME命令用於讓你的容器訪問宿主機上的目錄。

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用於設置CMD指明的命令的運行目錄。

# Usage: WORKDIR /path
WORKDIR ~/

 3、創建python文件

創建python文件 test_api.py,在這做一個簡單的接口測試,一個成功的測試用例和一個失敗的測試用例,代碼如下:

# coding=utf-8
import requests
import pytest


def test_1():
    search_url = 'https://baidu.com/'

    respose = requests.get(url=search_url)

    assert 200 == respose.status_code


def test_2():
    search_url = 'https://baidu.com/'

    respose = requests.get(url=search_url)

    assert 400 == respose.status_code


if __name__ == "__main__":
    pytest.main(["-s", "test_api.py"]) 

 

通過build構建鏡像文件

使用docker build 命令創建鏡像。

使用命令:(注意命令最後面的點)

docker build -t tynam/api-demo:v1.1 .

OPTIONS說明:

    • --tag, -t: 鏡像的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中爲一個鏡像設置多個標籤。例如 tynam/api-demo:v1.1

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker build -t tynam/api-demo:v1.1 .
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM python:3.6
---> 0db2e2bbf438
Step 2/7 : WORKDIR /code
---> Using cache
---> 688dd9856f6e
Step 3/7 : COPY test_api.py  /code/
---> 87e29f28e665
Step 4/7 : RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
---> Running in 14f5c424c164
Looking in indexes: https://pypi.douban.com/simple
Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages (20.0.2)
Removing intermediate container 14f5c424c164
---> fbdb47946e97
Step 5/7 : RUN pip install -U pytest
---> Running in 6ffb142f983d
Collecting pytest
  Downloading pytest-5.4.1-py3-none-any.whl (246 kB)
Collecting wcwidth
  Downloading wcwidth-0.1.9-py2.py3-none-any.whl (19 kB)
Collecting importlib-metadata>=0.12; python_version < "3.8"
  Downloading importlib_metadata-1.6.0-py2.py3-none-any.whl (30 kB)
Collecting attrs>=17.4.0
  Downloading attrs-19.3.0-py2.py3-none-any.whl (39 kB)
Collecting more-itertools>=4.0.0
  Downloading more_itertools-8.2.0-py3-none-any.whl (43 kB)
Collecting pluggy<1.0,>=0.12
  Downloading pluggy-0.13.1-py2.py3-none-any.whl (18 kB)
Collecting packaging
  Downloading packaging-20.3-py2.py3-none-any.whl (37 kB)
Collecting py>=1.5.0
  Downloading py-1.8.1-py2.py3-none-any.whl (83 kB)
Collecting zipp>=0.5
  Downloading zipp-3.1.0-py3-none-any.whl (4.9 kB)
Collecting pyparsing>=2.0.2
  Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting six
  Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: wcwidth, zipp, importlib-metadata, attrs, more-itertools, pluggy, pyparsing, six, packaging, py, pytest
Successfully installed attrs-19.3.0 importlib-metadata-1.6.0 more-itertools-8.2.0 packaging-20.3 pluggy-0.13.1 py-1.8.1 pyparsing-2.4.7 pytest-5.4.1 six-1.14.0 wcwidth-0.1.9 zipp-3.1.0
Removing intermediate container 6ffb142f983d
---> 0fe23e1c2a89
Step 6/7 : RUN pip install -U requests
---> Running in 21163a3acd67
Collecting requests
  Downloading requests-2.23.0-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2020.4.5.1-py2.py3-none-any.whl (157 kB)
Collecting chardet<4,>=3.0.2
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting idna<3,>=2.5
  Downloading idna-2.9-py2.py3-none-any.whl (58 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
  Downloading urllib3-1.25.9-py2.py3-none-any.whl (126 kB)
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2020.4.5.1 chardet-3.0.4 idna-2.9 requests-2.23.0 urllib3-1.25.9
Removing intermediate container 21163a3acd67
---> 8a8ae3f778a5
Step 7/7 : CMD ["python", "test_api.py"]
---> Running in f7310b052d08
Removing intermediate container f7310b052d08
---> 308b0f67af64
Successfully built 308b0f67af64
Successfully tagged tynam/api-demo:v1.1
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

  在運行過程中,可以看到運行步驟,及運行的指令。例如第五步:Step 5/7 : RUN pip install -U pytest

 

鏡像創建完成後可以使用命令查看創建的鏡像:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker images
REPOSITORY                  TAG                IMAGE ID            CREATED            SIZE
tynam/api-demo              v1.1                308b0f67af64        12 minutes ago      927MB

  

運行容器

 鏡像創建完成後開始運行,使用命令;

docker run -it tynam/api-demo:v1.1

運行結果如下:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker run -it tynam/api-demo:v1.1
================================================= test session starts ==================================================
platform linux -- Python 3.6.10, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: /code
collected 2 items

test_api.py .F

======================================================= FAILURES =======================================================
________________________________________________________ test_2 ________________________________________________________

    def test_2():
        search_url = 'https://baidu.com/'

        respose = requests.get(url=search_url)

>      assert 400 == respose.status_code
E      assert 400 == 200
E        +  where 200 = <Response [200]>.status_code

test_api.py:19: AssertionError
=============================================== short test summary info ================================================
FAILED test_api.py::test_2 - assert 400 == 200
============================================= 1 failed, 1 passed in 0.61s ==============================================

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo

 

上傳倉庫

 docker擁有自己的鏡像倉庫,官方倉庫網站是 https://hub.docker.com/

鏡像上傳倉庫的流程爲:登錄>>tag操作>>push

1、創建賬號

進入docker hub  https://hub.docker.com/ 註冊賬號,然後創建自己的倉庫

例如筆者創建的倉庫名爲 api

2、本地登錄docker

使用命令登錄自己的docker

docker login

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (tynam): tynam
Password:
Login Succeeded

3、修改鏡像名

修改鏡像名和倉庫名一致,鏡像名稱必須和 hub 中的倉庫名稱一致,否則將會拋出錯誤, 使用命令:

docker tag IMAGEID(鏡像id) REPOSITORY:TAG(倉庫:標籤)

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker tag 308b0f67af64 tynam/api:v1.1

修改後查看鏡像

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker images
REPOSITORY                  TAG                IMAGE ID            CREATED            SIZE
tynam/api-demo              v1.1                308b0f67af64        16 minutes ago      927MB
tynam/api                    v1.1                308b0f67af64        16 minutes ago      927MB

4、上傳鏡像

docker push [REPOSITORY]:[TAG]

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ docker push tynam/api:v1.1
The push refers to repository [docker.io/tynam/api]
de38accaade6: Pushed
52574f25c16c: Pushed
c2e450965650: Pushed
86dd60275049: Pushed
58f7d369eb64: Pushed
7e8b1f6898b0: Mounted from tynam/test
e91ff66f967f: Mounted from tynam/test
e05388744d34: Mounted from tynam/test
d4aeb4b1e8cc: Mounted from tynam/test
46829331b1e4: Mounted from tynam/test
d35c5bda4793: Mounted from tynam/test
a3c1026c6bcc: Mounted from tynam/test
f1d420c2af1a: Mounted from tynam/test
461719022993: Mounted from tynam/test
v1.1: digest: sha256:c821d6afcfb43cc03b47bf3e0241d04472f4ecc83455dd5b6a3acc6a1b5b3276 size: 3265

上傳完成後進入自己的倉庫可以查看上傳結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章