建立一个自定义的Image,在该Image中,包含一个本身的Python程序,经过docker运行该Image 容器,并执行咱们本身的Python程序,经过添加数据卷,在本机可以查看Python的执行结果.python
建立自定义Image,须要定义一个Dockerfile.nginx
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:指定标签信息
下面是我建立的一个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"]
在Dockerfile的目录下,运行下面的语句,建立新的Image
[root@localhost python]# sudo docker build -t matthewx:python-matthew /home/jenkins/Dockerfile/python
[root@localhost python]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
matthewx python-matth 3ccb7748fa38 6 seconds ago 192.5 MB
[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容器中的目录.该语句建立一个数据卷.
[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
[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
# 在本机目录建立了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