天天看點

DockerFile簡介與執行個體什麼是Dockerfile?Dockerfile執行個體精講:

向您推薦

Dcoker入門與實踐系列文章

什麼是Dockerfile?

Dockerfile是自動建構docker鏡像的配置檔案,Dockerfile中的指令非常類似linux shell下的指令

Dockerfile,可以讓使用者自定義建構docker鏡像,支援以 # 開頭的注釋行

一般,Dockerfile分為4部分

  1. 基礎鏡像(父鏡像)資訊
  2. 維護者資訊
  3. 鏡像操作指令
  4. 容器啟動指令
DockerFile簡介與執行個體什麼是Dockerfile?Dockerfile執行個體精講:

Dockerfile執行個體精講:

下面是一個CentOS7的Dockerfile執行個體

FROM       daocloud.io/centos:7
MAINTAINER hanxt <[email protected]>

ENV TZ "Asia/Shanghai"
ENV TERM xterm


ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo



RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
    yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
    yum install -y --enablerepo=epel pwgen python-pip && \
    yum clean all



RUN pip install supervisor
ADD supervisord.conf /etc/supervisord.conf

RUN mkdir -p /etc/supervisor.conf.d && \
    mkdir -p /var/log/supervisor

EXPOSE 22

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]           

複制

Dockerfile詳細解析

FROM daocloud.io/centos:7

  • 基于父鏡像建構其他docker鏡像,父鏡像:可以通過docker pull 指令獲得,也可以自己制作

MAINTAINER hanxt <[email protected]>

  • Dockerfile維護者

ENV TZ "Asia/Shanghai"

  • ENV(environment)設定環境變量,一個Dockerfile中可以寫多個。以上例子是:設定docker容器的時區為Shanghai

Dockerfile中有2條指令可以拷貝檔案

ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

  • 拷貝本地檔案到docker容器裡,還可以拷貝URL連結位址下的檔案,ADD還具有解壓軟體包的功能(支援gzip, bzip2 or xz)

COPY test /mydir

  • 拷貝本地檔案到docker容器

安裝linux軟體包

RUN yum install -y curl wget....

  • RUN指令,非常類似linux下的shell指令 (the command is run in a shell - /bin/sh -c - shell form)

在Dockerfile中每執行一條指令(ENV、ADD、RUN等指令),都會生成一個docker image layer

RUN pip install supervisor

  • 安裝supervisor程序管理系統,推薦使用

ADD supervisord.conf /etc/supervisord.conf

  • 添加supervisor的主配置檔案,到docker容器裡

RUN mkdir -p /etc/supervisor.conf.d

  • 建立存放啟動其他服務"supervisor.conf"的目錄,此目錄下的所有以.conf結尾的檔案,在啟動docker容器的時候會被加載

端口映射

EXPOSE 22

  • 端口映射

    EXPOSE <host_port>:<container_port>

  • 推薦使用

    docker run -p <host_port>:<container_port>

    來固化端口

容器啟動時執行的指令

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

  • 一個Dockerfile中隻有最後一條ENTRYPOINT生效,并且每次啟動docker容器,都會執行ENTRYPOINT

建構鏡像

以上檔案就是用來生成第一個docker鏡像的Dockerfile,通過docker build指令來生成docker鏡像

docker build -t hanxt/centos:7 .

  • 如果Dockerfile在目前目錄下,輸入點.就可以進行加載目前目錄下的Dockerfile
  • 如果不在目前目錄下需要運作

    docker build -t hanxt/centos:7 <Dockerfile_dir>

    加載相對路徑下的Dockerfile
docker鏡像的命名規則 registry_url/namespace/image_name:tag 預設tag是latest
  • 在建構Docker鏡像時,如果有自己内部的yum源,替換成自己内部的yum源位址,可以加快建構速度。
  • 如果第一次建構失敗,會有部分鏡像layer生成,第二次建構會基于第一次建構所生成的layer(use cache),繼續建構
docker鏡像的分層
Step 10 : EXPOSE 22

 ---> Running in 0ed1c5479ebc

 ---> c57a5bac41c8

Removing intermediate container 0ed1c5479ebc

Step 11 : ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisord.conf

 ---> Running in e16c7ac2fd45

 ---> 185ef7b101a8

Removing intermediate container e16c7ac2fd45

Successfully built 185ef7b101a8           

複制

可以看到每執行一條Dockerfile的指令都會生成一個鏡像的layerc57a5bac41c8 185ef7b101a8 最後185ef7b101a8這個是docker鏡像的ID,185ef7b101a8是由c57a5bac41c8 185ef7b101a8...layers疊加而成,展現了docker鏡像是分層的

  • 檢視目前主機本地有哪些docker鏡像

docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

csphere/centos 7.1 185ef7b101a8 40 minutes ago 451.9 MB

  • 生成docker容器

docker run -d -p 2222:22 --name centos7base hanxt/centos:7

37ac69acf47d501ffc61d8883ae2ba362a132d11e46897212a92b1936e0a0593

參數說明:

-d 背景運作

-it 前台互動式運作

-P 22 将主控端的一個未使用的随機端口映射到容器的22端口

-p 2222:22 将主控端的2222端口映射到容器的22端口

--name centos7base 給容器命名為centos7base

hanxt/centos:7 使用這個鏡像鏡像建立docker容器           

複制

  • 檢視Docker容器

docker ps

ps預設隻會顯示容器在“running”的狀态的,容器清單

docker ps -a

ps -a 會檢視到所有的容器清單

  • 進入docker容器shell腳本

docker exec -it centos7base /bin/bash