zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2018上C语言程序设计(高级)作业-第0次作业
    最后一次作业-- 总结报告
    第14、15教学周作业
    第七周作业
    第六周作业
    第四周作业
    C语言--第四次作业
    C语言--第三次作业
    C-语言第二次作业(大一下)
    TRY
  • 原文地址:https://www.cnblogs.com/Rong-/p/7670716.html
Copyright © 2011-2022 走看看