我們在使用Dockerfile建構docker鏡像時,一種方式是使用官方預先配置好的容器鏡像。優點是我們不用從頭開始建構,節省了很多工作量,但付出的代價是需要下載下傳很大的鏡像包。
比如我機器上docker images傳回的這些基于nginx的鏡像,每個都超過了100MB,而一個簡單的Ubuntu的容器超過了200MB,如果安裝了相關的軟體,尺寸會更大。
如果我們的需求是在建構一個符合我們實際業務需求的Docker鏡像的前提下,確定鏡像尺寸盡可能的小,應該怎麼做呢?
思路是使用空鏡像scratch。
建立一個檔案夾,用wget下載下傳rootfs.tar.xz壓縮包。
wget -O rootfs.tar.xz https://github.com/debuerreotype/docker-debian-artifacts/raw/b024a792c752a5c6ccc422152ab0fd7197ae8860/jessie/rootfs.tar.xz
這個将近30MB的壓縮包是個什麼東東?
解壓之後看内容就知道了,包含了作業系統大部分常用指令。
wget -O nginx.conf https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/nginx.conf
建立一個dockerfile檔案,将下列内容粘貼進去:
FROM scratch
# set the environment to honour SAP's proxy servers
ENV http_proxy http://sap.corp:8080
ENV https_proxy http://sap.corp:8080
ENV no_proxy .sap.corp
# give yourself some credit
LABEL maintainer="Jerry Wang"
# add and unpack an archive that contains a Debian root filesystem
ADD rootfs.tar.xz /
# use the apt-get package manager to install nginx and wget
RUN apt-get update && \
apt-get -y install nginx wget
# use wget to download a custom website into the image
RUN wget --no-check-certificate -O /usr/share/nginx/html/cheers.jpg https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.jpg && \
wget --no-check-certificate -O /usr/share/nginx/html/index.html https://github.diablo.corp/raw/slvi/docker-k8s-training/master/docker/res/cheers.html
# copy the custom nginx configuration into the image
COPY nginx.conf /etc/nginx/nginx.conf
# link nginx log files to Docker log collection facility
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
# expose port 80 - the standard port for webservers
EXPOSE 80
# and make sure that nginx runs when a container is created
CMD ["nginx", "-g", "daemon off;"]
執行指令進行鏡像的建構:
docker build -t nginx-from-scratch1.0 .
産生的日志:
最後看到鏡像成功建構的消息。
基于這個名為nginx-from-scratch的鏡像啟動一個新的nginx容器:
localhost:1083, 看到首頁,說明這個新建構的鏡像工作正常。
本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。