Docker實踐:創建並運行一個自定義的Docker Image


1 目標:

創建一個自定義的Image,在該Image中,包含一個自己的Python程序,通過docker運行該Image 容器,並執行我們自己的Python程序,通過添加數據卷,在本機能夠查看Python的執行結果.

2 創建Dockerfile

創建自定義Image,需要定義一個Dockerfile.

2.1 Dockerfile語法規則

 8 使用Dockerfile創建鏡像

    dockerfile:文本格式的配置文件

        可以使用dockerfile創建自定義的鏡像

    8.1 基本結構

        四部分

            基礎鏡像信息:FROM centos  基於的基礎鏡像

            維護者信息:MAINTAINER docker_user docker_user@email.com

            鏡像操作指令

                Run echo "test"

                apt/sources.list

                RUN apt-get update && apt-get install -y nginx

                RUN echo "test"

                Run指令:

                    將對鏡像執行跟隨的命令

                    沒運行一條Run命令,鏡像添加新的一層並天驕

                    容器啟動時執行指令

                CMD /usr/sbin/nginx

        8.2 指令

        一般格式

            INSTRUCTION arguments

            FROM

            MAINTAINER

            RUN

        指令

            1 FROM

            2 MAINTAINER

            3 RUN

            格式

                RUN <command>:在shell終端中運行命令

                RUN ["executable", "param1", "param2"]:exec執行

            \:換行

            4 CMD

            格式

                CMD ["executable", "param1", "param2"]:exec執行

                CMD command param1 param2:bin/sh執行

                CMD ["param1", "param2"]:ENTRYPOINT的默認參數

            每個Dockfile只能有一條CMD命令

            5 EXPOSE

            格式

                EXPOSE  <port> [<port>...]

            功能

                告訴docker服務端容器暴露的端口號,供互聯系統使用

                    EXPOSE 22 80 8443

                在啟動容器時, 需要通過-P或-p分配

            6 ENV

            格式

                ENV <key> <value>

            功能

                指定環境變量

                會被后續RUN指令使用

                在容器運行時保持

               ENV PG_MAJOR 9.3

            7 ADD

            格式

                ADD <src> <dest>

            功能

                將復制指定的<src>到容器中的<dest>

                <src>

                    可以是Dockerfile所在目錄的一個相對路徑(文件或目錄)

                    可以是一個URL

                    可以是一個tar文件

                自動解壓為目錄

            8 COPY

            格式

                COPY <src> <dest>

            功能

                復制本地主機<src>為容器中的<dest>

                目標路徑不存在時, 推薦使用COPY

            9 ENTRYPOINT

            格式

                    ENTRYPOINT ["executable", "param1", "param2"]

                    ENTRYPOINT command param1 param2:shell中執行

            功能

                配置容器啟動后執行的命令

                不可被docker run 提供的參數覆蓋

                每個Dockerfile中只能有一個ENTRYPOINT

                指定多個時,只有最后一個有效

            10 VOLUME

            格式

                VOLUM ["/data"]

            功能

                創建一個可以從本地主機或其他容器掛載的掛在店

                一般用來存放數據庫和需要保持的數據等

            11 USER

            格式

                USER daemon

            功能

                指定運行容器時的用戶名或UID

            12 WORKDIR

            格式

                WORKDIR /path/to/workdir

            功能

                為后續的RUN,CMD, ENTRYPOINT指令配置工作目錄

                可以使用多個WORKDIR指令

                如果參數是相對路徑,則會基於之前命令指定的路徑

            13 ONBUILD

            格式

                ONBUILD [INSTRUCTION]

            功能

                配置當前所創建的鏡像作為其他新創建鏡像的基礎鏡像時, 所執行的操作指令

        8.3 創建鏡像

        格式

            docker build [選項] 路徑

                將該路徑下所有內容發送給Docker服務端

                將讀取指定路徑下(包括子目錄)的Dockerfile

                服務端創建鏡像

        建議Dockerfile的目錄為空目錄

        .dockerignore:忽略路徑下的目錄和文件

        -t:指定標簽信息

 

 

2.2 Dockerfile案例

下面是我創建的一個Dockerfile, 文件名稱就是Dockerfile:

# centos: 該處表明,這個Dockerfile的基礎鏡像為centos:lastest

# 如果你是在離線的環境下,要確保centos:lastest已經pull到本地,這樣build的時候就不需要網絡了.

#將Image pull到本地,應該用Docker的代理.我嘗試過下載離線的Image,沒有成功

FROM centos:latest

 

#此處是創建者信息

MAINTAINER User <email@email.com>

#將本機當前目錄下的文件拷貝到容器的/home/pythonapp下

# 注: 使用當前目錄不是很好,因為當前目錄包含Dockerfile,會將這個文件也拷貝進去.

# 我的當前目錄下包含的文件有: Compare.py, Compare.txt

# Compare.py會根據Compare.txt的內容,生成新的文件,並拷貝到output的dst.txt文件中

COPY . /home/pythonapp

 

#在離線的情況下,該句會導致build Image失敗

# centos的image中預裝了python

#RUN yum install -y python2.7

 

CMD ["bash"]

3 Build Dockerfile

3.1 Build

在Dockerfile的目錄下,運行下面的語句,創建新的Image

[root@localhost python]# sudo docker build -t matthewx:python-matthew /home/jenkins/Dockerfile/python

3.2 查看Image

[root@localhost python]# docker images

REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE

matthewx                python-matth        3ccb7748fa38        6 seconds ago       192.5 MB

4運行容器

4.1 運行新構建的Image

[root@localhost python]# docker run -idt --name python_app_test -v /home/jenkins/Dockerfile/python/output:/home/pythonapp/output  3ccb7748fa38

其中/home/jenkins/Dockerfile/python/output為本機目錄, /home/pythonapp/output為Docker容器中的目錄.該語句創建一個數據卷.

4.2 查看容器

[root@localhost python]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

9a8ae7fae406        3ccb7748fa38        "bash"              13 seconds ago      Up 12 seconds                           python_app_test

4.3 進入容器

[root@localhost python]#docker attach python_app_test

# 進入容器:

[root@localhost python]# docker attach python_app_test

[root@9a8ae7fae406 /]# cd /home/

[root@9a8ae7fae406 home]# ls

pythonapp

[root@9a8ae7fae406 home]# cd pythonapp/

[root@9a8ae7fae406 pythonapp]# ls

Compare.py  Compare.txt  Dockerfile  dst.txt  output

[root@9a8ae7fae406 pythonapp]# python Compare.py

# 退出容器

[root@9a8ae7fae406 pythonapp]# exit

Exit

4.4 查看數據卷

# 在本機目錄創建了output文件夾

[root@localhost python]# ls

Compare.py  Compare.txt  Dockerfile  dst.txt  output

[root@localhost python]# cd output/

# dst.txt為新建的文件夾

[root@localhost output]# ls

dst.txt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM