利用dockerfile定製鏡像

利用dockerfile定製鏡像

鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。

 

#指定一個基礎鏡像
FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image
FROM centos #使用base image
FROM ubuntu:14.04 #帶有tag的base image

LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋
LABEL maintainer=「yc_uuu@163.com"

#對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!
RUN yum update && yum install -y vim \
    Python-dev #反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」

WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd
WORKDIR /test #若是沒有就自動建立
WORKDIR demo #再進入demo文件夾
RUN pwd     #打印結果應該是/test/demo


#ADD是添加文件,從物理機本地,添加到容器空間內 ADD and COPY ADD hello / #把本地文件添加到鏡像中,把本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz /tmp #將物理環境下的test添加到容器tmp目錄並解壓,可是建議使用copy WORKDIR /root ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ #等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程文件/目錄使用curl或wget ENV #環境變量,儘量使用ENV增長可維護性 ENV MYSQL_VERSION 5.6 #設置一個mysql常量 RUN yum install -y mysql-server=「${MYSQL_VERSION}」 VOLUME and EXPOSE 存儲和網絡 RUN and CMD and ENTRYPOINT RUN:執行命令並建立新的Image Layer CMD:設置容器啓動後默認執行的命令和參數 ENTRYPOINT:設置容器啓動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo 」hello docker」 ENTRYPOINT echo 「hello docker」 Exec格式 RUN [「apt-get」,」install」,」-y」,」vim」] CMD [「/bin/echo」,」hello docker」] ENTRYPOINT [「/bin/echo」,」hello docker」] 經過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變量 ENTRYPOINT [「/bin/bash」,」-c」,」echo hello $name"] CMD 容器啓動時默認執行的命令 若是docker run指定了其餘命令(docker run -it [image] /bin/bash ),CMD命令被忽略 若是定義多個CMD,只有最後一個執行 ENTRYPOINT 讓容器以應用程序或服務形式運行 不會被忽略,必定會執行 最佳實踐:寫一個shell腳本做爲entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [「docker-entrypoint.sh] EXPOSE 27017 CMD [「mongod」] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name」]

打包flask程序與dockerfile

環境準備

[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir mydocker
[root@localhost opt]# cd mydocker/
[root@localhost mydocker]# touch myflask.py
[root@localhost mydocker]# vim myflask.py 

寫入一下內容python

#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "hello docker"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)

準備構建dockerfile,用於生成鏡像

拷貝本地的yum倉庫到容器內部空間mysql

[root@localhost mydocker]# cp /etc/yum.repos.d/CentOS-Base.repo .
[root@localhost mydocker]#  cp /etc/yum.repos.d/epel.repo .
[root@localhost mydocker]# ll
總用量 12
-rw-r--r--. 1 root root 2523 3月  14 19:29 CentOS-Base.repo
-rw-r--r--. 1 root root  664 3月  14 19:30 epel.repo
-rw-r--r--. 1 root root  176 3月  14 19:19 myflask.py

建立Dockerfile文件,必須大寫的D開頭linux

[root@localhost mydocker]# touch Dockerfile

寫入內容sql

FROM centos     #指定一個基礎鏡像 
COPY CentOS-Base.repo /etc/yum.repos.d/  #拷貝本地的yum倉庫,到容器空間內               
COPY epel.repo /etc/yum.repos.d/    
RUN yum clean all  #清除yum緩存
RUN yum install python-setuptools -y
RUN easy_install flask   #linux默認使用python2,想要使用python3使用RUN 執行命令安裝
COPY myflask.py /opt/
WORKDIR /opt       
EXPOSE 8080     #暴露容器的8080端口,供給物理機去映射訪問,myflask.py 設置的端口
CMD ["python","myflask.py"]       #cmd表明執行命令
[root@localhost mydocker]# ls
CentOS-Base.repo  Dockerfile  epel.repo  myflask.py

構建鏡像

確保文件在同一目錄docker

[root@localhost mydocker]# ll
總用量 16
-rw-r--r--. 1 root root 2523 3月  14 19:29 CentOS-Base.repo
-rw-r--r--. 1 root root  281 3月  14 20:47 Dockerfile
-rw-r--r--. 1 root root  664 3月  14 19:30 epel.repo
-rw-r--r--. 1 root root  176 3月  14 19:19 myflask.py
[root@localhost mydocker]# docker build .   
會去執行當前目錄中的Dockerfile文件
構建了一個ID爲a7f439ad8953 的鏡像
 ---> a7f439ad8953
Successfully built a7f439ad8953
[root@localhost mydocker]# docker tag  a7f myflask
[root@localhost mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myflask             latest              a7f439ad8953        3 minutes ago       346MB

運行鏡像,生成容器實例shell

[root@localhost mydocker]# docker run -p 8080:8080 -d a7f 
e6e1721be1c346f05c8913c2efed6bb3f3564f97ff6b2e64caad18d64c6a5e32
[root@localhost mydocker]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED              STATUS              PORTS                    NAMES
e6e1721be1c3        a7f                 "python myflask.py"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   thirsty_swanson

查看容器的映射狀態flask

[root@localhost mydocker]# docker port e6e
8080/tcp -> 0.0.0.0:8080

訪問windowsubuntu

http://192.168.11.174:8080/
相關文章
相關標籤/搜索