在生産環境中,往往都會使用官方的系統鏡像在加上一些環境的依賴制作出一個環境的基礎鏡像,後面在把相關的代碼放到制作的基礎鏡像中,進而完一個項目鏡像的建構工作,一般制作好的基礎鏡像後很少去修改,除非需要添加一些新的依賴項才會去修改一下基礎鏡像。
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、直接使用官方鏡像在建構業務鏡像
如果在生産中使用官方鏡像直接建構成業務鏡像的話,到後面會出現比較嚴重的弊端:
- 工作量大:每次建構業務鏡像時會涉及到操作會很多,會感覺到很繁瑣;
- 後續鏡像需要變動是需要重建立鏡像:一旦後期鏡像需要改動的話,是要重新開始要一步步建構鏡像,所耗費的時間成本比較大。
2.1.2、鏡像分層後的優勢
- 基本上每個軟體都是基于某個鏡像去運作的,是以一旦某個底層環境出了問題,就不需要去修改全部基于該鏡像的軟體的鏡像,隻需要修改底層環境的鏡像。
- 這個好處也是最大好處,就是可以共享資源,其他相同環境的軟體鏡像都共同去享用同一個環境鏡像,而不需要每個軟體鏡像要去建立一個底層環境。
- 可以複用,節省磁盤空間,相同的内容隻需加載一份到記憶體。 修改dockerfile之後,再次建構速度快
2.2、鏡像分層原理
鏡像分層的說明:
- 在制作鏡像時,我們可以通過docker官方的ubuntu、centos、alpine等系統鏡像來作底層來啟動容器,并進行一些系統的初始化工作,來實作基本的系統基礎鏡像;
- 可以在已經初始化工作的基礎鏡像上,後面我們會安裝一些基礎服務來部署業務需要的環境,會構成基礎鏡像上的第二層、第三層等等鏡像;
- 通過一層層的鏡像的疊加後,最終形成符合企業中業務需要的業務基礎鏡像,後面的話最上面一層鏡像隻需添加或者修改具體業務要使用的代碼即可。
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)