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

原文地址:https://www.cnblogs.com/Rong-/p/7670716.html