向您推薦
Dcoker入門與實踐系列文章
什麼是Dockerfile?
Dockerfile是自動建構docker鏡像的配置檔案,Dockerfile中的指令非常類似linux shell下的指令
Dockerfile,可以讓使用者自定義建構docker鏡像,支援以 # 開頭的注釋行
一般,Dockerfile分為4部分
- 基礎鏡像(父鏡像)資訊
- 維護者資訊
- 鏡像操作指令
- 容器啟動指令

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
- 如果不在目前目錄下需要運作
加載相對路徑下的Dockerfiledocker build -t hanxt/centos:7 <Dockerfile_dir>
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