docker--Dockerfile

前戲

鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎,咱們以前的例子都是使用來自docker hub的鏡像。直接使用這些鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,就得自定製這些鏡像。python

鏡像的定製就是定製每一層所添加的配置、文件。若是把每一層修改,安裝,構建,操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是Dockerfile。mysql

Dockerfile是一個文本文件,其內部包含一條條指令, 每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建linux

Dockerfile的命令

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=「zouzou0214"

#對於複雜的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 and COPY 
ADD hello /  #把本地文件添加到鏡像中(和Dockerfile同級),把本地的hello可執行文件拷貝到鏡像的/目錄
ADD test.tar.gz /  #添加到根目錄並解壓

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」]

建立本身的容器鏡像

1.先準備一段flask代碼sql

myflask.pydocker

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

2.準備傳到docker容器裏的文件shell

[root@HH tmp]# ls
CentOS-Base.repo  Dockerfile  epel.repo  myflask.py

3.製做Dockerfileflask

FROM centos
LABEL maintainer="zouzou0214"
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-pip -y
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
COPY myflask.py /app/
WORKDIR /app/
EXPOSE 8081
CMD ["python","myflask.py"]
  • 1.引入一個centos鏡像,爲基礎鏡像
  • 2.做者註釋信息
  • 3.添加本地的兩個yum文件,到容器的/etc/yum.repos.d/底下
  • 4.清空yum緩存
  • 5.yum安裝pip工具
  • 6.pip安裝flask模塊,指定清華源
  • 7.拷貝本地的flask代碼,到容器的/app/目錄下
  • 8.切換工做目錄,到/app底下
  • 9.暴露容器的8081端口,而後在運行鏡像時候,加上-p參數,指定端口映射
  • 10.執行命令,運行flask

4.構建docker鏡像ubuntu

docker build -t zouzu0214/my-docker-flask .

注意:最後面有個.(點)表明從當前目錄buildvim

構建當前目錄的Dcokerfile,而後構建出一個名爲yuchao163/s14-flask-docker 這個的鏡像文件centos

-t tag參數,給鏡像加上標記名

dockerhub帳戶名:zouzou0214,dockerhub帳戶名/鏡像名 ,是爲了後面講docker鏡像,推送到dockerhub

5.查看鏡像是否構建成功:docker images

[root@HH tmp]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
zouzu0214/my-docker-flask   latest              845652a3022e        12 seconds ago      346MB
centos                      latest              67fa590cfc1c        5 weeks ago         202MB

我本地是沒有centos鏡像的,會去先下載一個centos鏡像,而後基於該鏡像構建

6.運行鏡像

[root@HH tmp]# docker run -d -p 9000:8081 8456
bcd4e98ba419f5eaf3c9f43e64d9b1dd2558fddb2316be84b46fdf656318ab64

docker run -p 9000:8081 -d 8456

-p 映射9000端口到容器的8081

-d 後臺運行

8456  鏡像id

7.查看已經運行的docker實例

[root@HH tmp]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
44a53f62f533        76a7                "/sbin/tini -- /usr/…"   11 hours ago        Up 11 hours         50000/tcp, 0.0.0.0:8000->8080/tcp   MyJenkins
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息