建立一個自定義的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