Dockerfiles: 標準鏡像、基礎鏡像和服務鏡像
===
這是一個包含所有公用鏡像構建過程的倉庫,主要分三部分:Dockerfile、公共資源、構建腳本。
所有維護這個倉庫的人員都應該提供并及時更新自己的文檔。

## Dockerfile
---
包含:library、base、service
結構:
```bash
.
|-- base # 父類
| |-- centos # 子類
| | `-- centos=version-zh.df # 模糊版本
| |-- gradle
| | `-- gradle=2.14.1.df # 明確版本
| |-- jdk
| | `-- jdk=8u101.df
| `-- tomcat
| |-- src # 私有資源(可選)
| | |-- docker-entrypoint-kazoo.sh
| | `-- docker-entrypoint.sh
| |-- tomcat=8.0.36.df
|-- library
| |-- centos
| |-- centos=7.2.1511.df
| |-- centos=latest.df # 最后版本
| `-- src
| `-- centos-7.2.1511-docker.tar.xz
|-- service
|-- elasticsearch
|-- elasticsearch=2.3.5.df
`-- src
`-- docker-entrypoint.sh
- library:包含各類標準鏡像,基本上屬于官方的標準流程,該動極少且不做定制。
- base:包含各類基礎鏡像,根據需求做定制,不修改原有結構。
- service:包含各類服務鏡像,根據需求做定制,盡量不修改原有結構。
```
用途:規整鏡像Dockerfile的存放結構
## 公共資源
---
包含:resources
結構:
```bash
.
`-- sources
|-- apache-tomcat-8.0.36.tar.gz
|-- elasticsearch-2.3.5.tar.gz
|-- gradle-2.14.1-bin.zip
`-- jdk-8u101-linux-x64.tar.gz
```
用途:存放鏡像構建過程中的依賴文件
## 構建腳本
---
包含:build.sh、build.list
結構:
- build.sh:
```bash
#!/bin/bash
cd `dirname ${BASH_SOURCE}` # 切換到工作目錄
suffix="2257b4561a43e400e437b662529255e3" # 標簽
[ -n "${1}" ] && DOCKER_REGISTRY="${1%%/*}/" # docker倉庫
os="centos"
fs="simplehttpserver"
dns="bind"
mnt=`pwd`/resources
DOCKER_BUILD_LIST=`grep -v '^ *#' build.list` # 取得任務
# 構建最簡單的系統鏡像
sed -i '/^FROM/d' library/${os}/${os}=latest.df
sed -i "1iFROM scratch" library/${os}/${os}=latest.df
docker build -t ${os}:latest -f library/${os}/${os}=latest.df library/${os}
# 構建最簡單的文件服務鏡像
sed -i '/^FROM/d' library/${fs}/${fs}=latest.df
sed -i "1iFROM ${os}" library/${fs}/${fs}=latest.df
docker build -t ${fs}:latest -f library/${fs}/${fs}=latest.df library/${fs}
# 構建最簡單的解析服務鏡像
sed -i '/^FROM/d' library/${dns}/${dns}=latest.df
sed -i "1iFROM ${os}" library/${dns}/${dns}=latest.df
docker build -t ${dns}:latest -f library/${dns}/${dns}=latest.df library/${dns}
# 運行文件服務并掛載資源
docker stop ${fs}-${suffix} && docker rm ${fs}-${suffix} || echo
docker run -d -P --name ${fs}-${suffix} -v ${mnt}:/mnt ${fs}:latest
fsIp=`docker inspect -f '{{.NetworkSettings.IPAddress}}' ${fs}-${suffix}`
# 運行解析服務
docker stop ${dns}-${suffix} && docker rm ${dns}-${suffix} || echo
docker run -d -P --name ${dns}-${suffix} ${dns}:latest
docker exec ${dns}-${suffix} bash -c "echo '${fs} A ${fsIp}' >> /var/named/named.localhost"
docker restart ${dns}-${suffix}
dnsIp=`docker inspect -f '{{.NetworkSettings.IPAddress}}' ${dns}-${suffix}`
# 修改宿主機dns
sed -i "/${suffix}/d" /etc/resolv.conf
sed -i "1inameserver ${dnsIp} # ${suffix}" /etc/resolv.conf
# 構建鏡像
for LINE in ${DOCKER_BUILD_LIST}
do
FROM_IMAGE=`echo ${LINE} | awk -F',' '{print $1}'`
TO_IMAGE=`echo ${LINE} | awk -F',' '{print $2}'`
DOCKERFILE_FILE=`echo ${LINE} | awk -F',' '{print $3}'`
DOCKERFILE_PATH=${DOCKERFILE_FILE%/*}
[ -n "${DOCKER_REGISTRY}" ] && docker pull ${DOCKER_REGISTRY}${TO_IMAGE} || echo "${DOCKER_REGISTRY}${TO_IMAGE} not found!"
sed -i '/^FROM/d' ${DOCKERFILE_FILE}
if [ 'scratch' != "${FROM_IMAGE}" ]
then
sed -i "1iFROM ${DOCKER_REGISTRY}${FROM_IMAGE}" ${DOCKERFILE_FILE}
else
sed -i "1iFROM ${FROM_IMAGE}" ${DOCKERFILE_FILE}
fi
docker build -t ${DOCKER_REGISTRY}${TO_IMAGE} -f ${DOCKERFILE_FILE} ${DOCKERFILE_PATH}
[ -n "${DOCKER_REGISTRY}" ] && docker push ${DOCKER_REGISTRY}${TO_IMAGE}
done
# 清理
sed -i "/${suffix}/d" /etc/resolv.conf
docker stop ${dns}-${suffix} && docker rm ${dns}-${suffix} || echo
docker stop ${fs}-${suffix} && docker rm ${fs}-${suffix} || echo
```
- build.list:
```bash
scratch,library/centos:7.2.1511,library/centos/centos=7.2.1511.df
base/centos:7.2.1511-zh,base/jdk:8u101,base/jdk/jdk=8u101.df
base/jdk:8u101,base/gradle:2.14.1-8u101,base/gradle/gradle=2.14.1.df
base/jdk:8u101,base/tomcat:8.0.36-8u101,base/tomcat/tomcat=8.0.36.df
- 以","分隔為三部分。第一部分:上層鏡像,第二部分:目標鏡像,第三部分:Dockerfile位置。
```
用途:執行build.sh,根據build.list文件所指定的關系,依次構建鏡像。
- 第一章 Docker核心技術(一)
- 第一章 Docker核心技術(二)
- 第一章 Docker核心技術(三)
- 第一章 Docker核心技術(四)
- 第二章 Docker 入門
- 第三章 使用docker鏡像
- 第四章 實戰應用使用Docker構建LNMP環境 (一)
- 第四章 實戰應用使用Docker構建LNMP環境 (二)
- 第四章 實戰應用使用Docker構建LNMP環境 (三)
- 第五章 構建企業級Harbor-Registry
- 第六章 構建Docker應用發布系統(一)
- 第六章 構建Docker應用發布系統(二)
- 第六章 構建Docker應用發布系統(三)
- 第六章 構建Docker應用發布系統(四)