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