天天看點

使用Dockerfile制作nginx鏡像,并詳解鏡像的分層

  在生産環境中,往往都會使用官方的系統鏡像在加上一些環境的依賴制作出一個環境的基礎鏡像,後面在把相關的代碼放到制作的基礎鏡像中,進而完一個項目鏡像的建構工作,一般制作好的基礎鏡像後很少去修改,除非需要添加一些新的依賴項才會去修改一下基礎鏡像。

1、Dockerfile介紹

Dockerfile是一種可以被docker程式讀取指令的一個腳本,是有一條條Dockerfile的指令加指令組成的,docker程式在将這些Dockerfile檔案裡的指令解析成真正的Linux指令。Dockerfile可以分為四部分:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令。

指令 說明
FROM 設定鏡像使用的基礎鏡像
MAINTAINER 設定鏡像的作者
RUN 編譯鏡像是運作shell指令,是要非互動式的指令
CMD 設定容器的啟動指令
LABEL 設定鏡像的标簽
EXPOSE 聲明要把容器的哪些端口暴露出來
ENV 設定容器的環境變量
ADD 編譯鏡像時複制到鏡像中,這個可以複制壓縮檔案會自動解壓,但是不會自動解壓zip的壓縮包,可以解壓tar包
COPY 編譯鏡像時複制到鏡像中,這個指令就隻是複制
ENTRYPOINT 指定容器啟動時的指令或腳本,如果和CMD同時使用,會将CMD的指令當做參數傳遞給ENTRYPOINT後面的腳本
VOLUME 設定容器的挂載卷
USER 指定執行後續指令的使用者和使用者組,這邊隻是切換後續指令執行的使用者(使用者和使用者組必須提前已經存在)
WORKDIR 指定工作目錄
ARG 設定編譯鏡像時加入的參數
ONBUILD 設定鏡像的ONBUILD指令
STOPSIGNAL 設定容器的退出信号量

2、Docker鏡像分層

  利用Dockerfile檔案來制作時,可以使用一步到位的方式,将官方的鏡像和最後的業務鏡像整理到一起,也是可以利用分層的技術來制作鏡像,建議大家使用分層制作鏡像。

2.1、為什麼要鏡像分層

2.1.1、直接使用官方鏡像在建構業務鏡像

  如果在生産中使用官方鏡像直接建構成業務鏡像的話,到後面會出現比較嚴重的弊端:

  1. 工作量大:每次建構業務鏡像時會涉及到操作會很多,會感覺到很繁瑣;
  2. 後續鏡像需要變動是需要重建立鏡像:一旦後期鏡像需要改動的話,是要重新開始要一步步建構鏡像,所耗費的時間成本比較大。

2.1.2、鏡像分層後的優勢

  1. 基本上每個軟體都是基于某個鏡像去運作的,是以一旦某個底層環境出了問題,就不需要去修改全部基于該鏡像的軟體的鏡像,隻需要修改底層環境的鏡像。
  2. 這個好處也是最大好處,就是可以共享資源,其他相同環境的軟體鏡像都共同去享用同一個環境鏡像,而不需要每個軟體鏡像要去建立一個底層環境。
  3. 可以複用,節省磁盤空間,相同的内容隻需加載一份到記憶體。 修改dockerfile之後,再次建構速度快

2.2、鏡像分層原理

使用Dockerfile制作nginx鏡像,并詳解鏡像的分層
使用Dockerfile制作nginx鏡像,并詳解鏡像的分層

鏡像分層的說明:

  1. 在制作鏡像時,我們可以通過docker官方的ubuntu、centos、alpine等系統鏡像來作底層來啟動容器,并進行一些系統的初始化工作,來實作基本的系統基礎鏡像;
  2. 可以在已經初始化工作的基礎鏡像上,後面我們會安裝一些基礎服務來部署業務需要的環境,會構成基礎鏡像上的第二層、第三層等等鏡像;
  3. 通過一層層的鏡像的疊加後,最終形成符合企業中業務需要的業務基礎鏡像,後面的話最上面一層鏡像隻需添加或者修改具體業務要使用的代碼即可。

3、使用Dockerfile建立nginx鏡像

3.1、制作底層基礎鏡像

3.1.1、建立好Dockerfile檔案的存放目錄

建立這些目錄是為了後面的操作更友善,也對Dockerfile檔案的管理方面也友善挺多

root@node2:~# mkdir -pv /data/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{ubuntu,centos,alpine}}
mkdir: created directory '/data'
mkdir: created directory '/data/dockerfile'
mkdir: created directory '/data/dockerfile/web'
mkdir: created directory '/data/dockerfile/web/nginx'
mkdir: created directory '/data/dockerfile/web/tomcat'
mkdir: created directory '/data/dockerfile/web/jdk'
mkdir: created directory '/data/dockerfile/web/apache'
mkdir: created directory '/data/dockerfile/system'
mkdir: created directory '/data/dockerfile/system/ubuntu'
mkdir: created directory '/data/dockerfile/system/centos'
mkdir: created directory '/data/dockerfile/system/alpine'
           

3.1.2、下載下傳鏡像

底層鏡像的話是可以使用官方的ubuntu、alpine、centos等等一些鏡像,具體還是得看業務的需求,這裡我就是使用ubuntu:18.04的鏡像了

root@node2:~# docker pull ubuntu:18.04
root@node2:~# docker images	#有些鏡像是之前下載下傳的
REPOSITORY   TAG        IMAGE ID       CREATED         SIZE
nginx        latest     605c77e624dd   7 months ago    141MB
alpine       latest     c059bfaa849c   8 months ago    5.59MB
ubuntu       18.04      5a214d77f5d7   10 months ago   63.1MB
centos       7.9.2009   eeb6ee3f44bd   10 months ago   204MB
           

3.1.3、編寫Dockerfile檔案制作底層鏡像并建構鏡像

root@node2:~# cd /data/dockerfile/system/ubuntu/
root@node2:/data/dockerfile/system/ubuntu# vim Dockerfile
# My Ubuntu Base images ubuntu:18.04
#
FROM ubuntu:18.04
MAINTAINER "Stars.Zhang [email protected]"
ADD sources.list /etc/apt/sources.list
RUN apt update && apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev vim lrzsz tree iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common openssh-server iotop unzip zip

root@node2:/data/dockerfile/system/ubuntu# cat sources.list 
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
root@node2:/data/dockerfile/system/ubuntu# cat ubuntu1804-build-command.sh
#!/bin/bash
#
TAG=$1
docker build -t harbor.stars.org/zg-test/ubuntu-base:${TAG} .
root@node2:/data/dockerfile/system/ubuntu# chmod +x ubuntu1804-build-command.sh
root@node2:/data/dockerfile/system/ubuntu# ls
Dockerfile  sources.list  ubuntu1804-build-command.sh
root@node2:/data/dockerfile/system/ubuntu# ./ubuntu1804-build-command.sh v1
           

3.1.4、驗證鏡像是否正常

root@node2:/data/dockerfile/system/ubuntu# docker images
REPOSITORY                             TAG        IMAGE ID       CREATED              SIZE
harbor.stars.org/zg-test/ubuntu-base   v1         ff7be0679685   About a minute ago   426MB
nginx                                  latest     605c77e624dd   7 months ago         141MB
alpine                                 latest     c059bfaa849c   8 months ago         5.59MB
ubuntu                                 18.04      5a214d77f5d7   10 months ago        63.1MB
centos                                 7.9.2009   eeb6ee3f44bd   10 months ago        204MB
root@node2:/data/dockerfile/system/ubuntu# docker run -it --rm harbor.stars.org/zg-test/ubuntu-base:v1 bash
root@37b48839b663:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@37b48839b663:/# gcc
gcc           gcc-7         gcc-ar        gcc-ar-7      gcc-nm        gcc-nm-7      gcc-ranlib    gcc-ranlib-7  
root@37b48839b663:/# vim a.txt
root@37b48839b663:/# vi
vi         view       vigr       vim        vim.basic  vimdiff    vimtutor   vipw       
root@37b48839b663:/# tree 
.dockerenv  boot/       etc/        lib/        media/      opt/        root/       sbin/       sys/        usr/        
bin/        dev/        home/       lib64/      mnt/        proc/       run/        srv/        tmp/        var/        
root@37b48839b663:/# exit 
exit
           

3.2、制作nginx鏡像

3.2.1、準備nginx的源碼包及配置檔案

root@node2:/data/dockerfile/system/ubuntu# cd /data/dockerfile/web/nginx/
root@node2:/data/dockerfile/web/nginx# ls
root@node2:/data/dockerfile/web/nginx# mkdir nginx-1.18.0 && cd $_
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# wget https://nginx.org/download/nginx-1.18.0.tar.gz
--2022-07-30 16:39:45--  https://nginx.org/download/nginx-1.18.0.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1039530 (1015K) [application/octet-stream]
Saving to: ‘nginx-1.18.0.tar.gz’

nginx-1.18.0.tar.gz                                 100%[===================================================================================================================>]   1015K   771KB/s    in 1.3s    

2022-07-30 16:39:48 (771 KB/s) - ‘nginx-1.18.0.tar.gz’ saved [1039530/1039530]


root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# ls
nginx-1.18.0.tar.gz
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# vim nginx.conf
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# grep -Ev "^$|^\s*#" nginx.conf	#^$是比對空行,^\s*#與原來的^#相比,增加了使用\s*來比對#前面可能會出現的空格。
user  nginx;
worker_processes  auto;
events {
    worker_connections  10240;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server_tokens off;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
           

3.2.2、編寫Dockerfile檔案

root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# vim Dockerfile
#My Nginx-Dockerfile from nginx-1.18.0
#
FROM harbor.stars.org/zg-test/ubuntu-base:v1
MAINTAINER "Stars.Zhang [email protected]"
ADD nginx-1.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
RUN useradd nginx -s /sbin/nologin 
RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
RUN echo "The is Docker test page" > /usr/local/nginx/html/index.html
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# vim nginx-1.18.0-build-command.sh
#!/bin/bash
#
TAG=$1
docker build -t harbor.stars.org/zg-test/nginx-1.18.0-base:${TAG} .
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# chmod +x nginx-1.18.0-build-command.sh
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# ls
Dockerfile  nginx-1.18.0-build-command.sh  nginx-1.18.0.tar.gz  nginx.conf
           

3.2.3、建構鏡像并驗證鏡像的可用性

root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# docker images
REPOSITORY                                   TAG        IMAGE ID       CREATED          SIZE
harbor.stars.org/zg-test/nginx-1.18.0-base   v1         30a83f4f2a50   49 seconds ago   464MB
harbor.stars.org/zg-test/ubuntu-base         v1         ff7be0679685   58 minutes ago   426MB
nginx                                        latest     605c77e624dd   7 months ago     141MB
alpine                                       latest     c059bfaa849c   8 months ago     5.59MB
ubuntu                                       18.04      5a214d77f5d7   10 months ago    63.1MB
centos                                       7.9.2009   eeb6ee3f44bd   10 months ago    204MB
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# docker run -d --name test-nginx -p 8080:80 harbor.stars.org/zg-test/nginx-1.18.0-base:v1
607493aea8f81be1f34d10b1e5367acae4bfb9112d17abc50056c8d3a1417508
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# docker ps
CONTAINER ID   IMAGE                                           COMMAND                  CREATED         STATUS         PORTS                                            NAMES
607493aea8f8   harbor.stars.org/zg-test/nginx-1.18.0-base:v1   "nginx -g 'daemon of…"   7 seconds ago   Up 6 seconds   443/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp   test-nginx
root@node2:/data/dockerfile/web/nginx/nginx-1.18.0# lsof -i:8080
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 13122 root    4u  IPv4  86167      0t0  TCP *:http-alt (LISTEN)
docker-pr 13129 root    4u  IPv6  86175      0t0  TCP *:http-alt (LISTEN)
           

繼續閱讀