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

1 目標:

建立一個自定義的Image,在該Image中,包含一個本身的Python程序,經過docker運行該Image 容器,並執行咱們本身的Python程序,經過添加數據卷,在本機可以查看Python的執行結果.python

2 建立Dockerfile

建立自定義Image,須要定義一個Dockerfile.nginx

2.1 Dockerfile語法規則

 8 使用Dockerfile建立鏡像docker

    dockerfile:文本格式的配置文件shell

        可使用dockerfile建立自定義的鏡像數據庫

    8.1 基本結構centos

        四部分bash

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

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

            鏡像操做指令python2.7

                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

相關文章
相關標籤/搜索