企業運維實戰--Docker學習筆記1.Docker簡介、安裝部署、鏡像構建、Dockerfile詳解、鏡像構建、鏡像優化、本地私有倉庫搭建
- 前言--Docker簡介
- 一、Docker安裝部署
- 二、鏡像的構建
- 三、Dockerfile詳解
- 四、鏡像構建- -nginx
- 五、鏡像優化
- 六、本地私有倉庫搭建
- 筆記補充--docker常用命令補充
前言–Docker簡介
Docker是一個基于Go語言的,開源的應用容器引擎,是一個用于開發,交付和運行應用程式的開放平臺,Docker使得應用程式與基礎架構分開來,進而實作快速交付,
其作用包括:可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實作虛擬化,
容器是完全使用沙箱機制(沙箱就是一個限制應用程式對系統資源的訪問的運行環境,通常實作在虛擬機中),更重要的是容器性能開銷極低,
Docker的優點:
1.快速、一致地交付應用程式,開發人員在本地寫代碼,使用Docker容器與同事共享作業;使用Docker將應用程式推送到測驗環境中進行測驗;當出現錯誤時,開發人員可以在開發環境中進行修復,然后重新部署到測驗環境中;測驗完成后將修補程式像更新的鏡像一樣推送給生產環境,
2.回應式部署和擴展,Docker 是基于容器的平臺,允許高度可移植的作業負載,Docker 的可移植性和輕量級的特性,還可以使您輕松地完成動態管理的作業負擔,并根據業務需求指示,實時擴展或拆除應用程式和服務,
3.同一硬體上可運行更多作業負載,Docker輕巧快速,為基于虛擬機管理程式的虛擬機提供了可行、經濟、高效的替代方案,因此Docker非常適合于高密度環境以及中小型部署,通俗來講就是用更少的資源做更多的事情,
先簡單介紹一下Docker的作業流程

1.Dockerfile是鏡像的源代碼,你可以簡單理解為創建容器鏡像(Images)的腳本,可以通過它創建容器的鏡像,
2.獲得容器的鏡像后,我們可以通過鏡像在本地Docker環境拉起(run)容器(Containers),也可以對其進行stop暫停、start開啟、restart重啟操作,容器也可以交付commit給鏡像,
3.可對鏡像進行備份backup.tar,
4.Docker registry 注冊表就好像一個本地倉庫,你可以推送(push,也可以理解為上傳)和拉取(pull,也可以理解為下載)鏡像,
目前的Docker主要分為社區版(CE)和企業版(EE),本章我們將使用CE版進行操作學習,
一、Docker安裝部署
環境介紹:一臺全新的rhel7.6虛擬機,火墻和selinux均處于關閉狀態,
安裝docker-ce,啟動服務
yum repolist
yum install -y docker-ce

systemctl enable --now docker

查看docker資訊,發現兩條warning
docker info


sysctl -a | grep bridge-nf-call-iptables
vim /etc/sysctl.d/docker.conf

cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

docker服務開啟自動添加docker ip
ip addr

docker服務開啟會自動寫入火墻策略
iptables -L

重繪內核檔案,讀取添加的檔案
sysctl --system

再次查看發現警告已消除
docker info

測驗:將2048游戲鏡像添加到docker中
docker load -i game2048.tar
查看已經添加的鏡像
docker images
運行容器 –name表示名稱為demo 埠為真實主機的80映射到虛擬機的80埠,-d表示打入后臺
docker run -d --name demo -p 80:80 game2048

docker images
docker rm -f demo
測驗:網頁訪問172.25.9.1,可看到游戲畫面,docker安裝部署完成, 
二、鏡像的構建
注意:
ctrl+p+q 將運行的互動式容器打入后臺
上傳busybox鏡像到docker
docker load -i busybox.tar

拉起容器busybox,-i表示互動式,-t表示打開偽終端
docker run -it --name demo busybox

查看鏡像
docker images

洗掉demo容器重新創建
docker run -it --name demo busybox

-a查看所有行程
docker ps -a

啟動已有容器
docker start demo
查看行程
docker ps

進入已存在的demo容器中
docker container attach demo

上傳新的鏡像,源于demo容器 demo:v1
docker commit demo demo:v1
docker images

對比查看兩者層級結構
docker history demo:v1
docker history busybox:latest

洗掉v1容器
docker rmi demo:v1
docker images

重啟讀取v1中的內容
docker commit demo demo:v1
docker images

刪掉demo后,不影響v1容器
docker rm demo
docker run -it --name demo demo:v1

對比層級結構查看,手動添加的容器沒有解釋每一層的作用,game2048里會對
docker ps
docker history game2048:latest


解決方法:
Dockerfile檔案方式匯入鏡像v2,history可以查看具體內容,容器用busybox
mkdir docker
cd docker/
vim Dockerfile
cat Dockerfile
FROM busybox
RUN echo westos > testfile
RUN echo hello > testfile1

在當前目錄檔案Dockerfile下創建鏡像
docker build -t demo:v2 .

查看匯入的鏡像,可以查到鏡像內容
docker images
docker history demo:v2

可以看到層級操作的具體操作解釋,
三、Dockerfile詳解
詳情如下:
vim Dockerfile
注意:此處為了方便解釋每條陳述句的含義,所以才在文中直接加了中文注釋,運行時請刪掉注釋,
FROM busybox #鏡像來源
RUN echo westos > testfile # RUN后跟shell運行陳述句
RUN echo hello > testfile1
COPY index.html / #COPY拷貝當前目錄的index.html到容器的根目錄下
ADD nginx-1.20.1.tar.gz / #ADD 解壓tar包到根目錄下
ENV HOSTNAME server1 #ENV 定義變數HOSTNAME為server1
EXPOSE 80 #設定埠為80
VOLUME {"/data"} #掛載目錄為/data
WORKDIR /data #作業空間為 /data
ENTRYPOINT ["/bin/echo", "hello"] #強制輸出不被覆寫
CMD ["world"] #輸出會覆寫

創建容器demo:v5

–rm表示執行后丟棄,不保存cache
docker run -it --rm demo:v5
docker run -it --rm demo:v5 westos

docker rmi docker images |grep ^demo | awk '{print $3}'
四、鏡像構建- -nginx
匯入rhel7鏡像,相當于使用rhel7的內核
docker load -i rhel7.tar

撰寫Dokcerfile創建鏡像,
vim Dockerfile
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
通過Dockerfile建立鏡像v1,執行命令創建鏡像rhel7:v1
docker build it rhel7:v1


查看埠
拉起容器,行程名為demo,
docker run -d --name demo rhel7:v1
查demo行程/容器資訊
docker inspect demo

可以看到分配給nginx的ip為172.17.0.2
測驗訪問可訪問到nginx主頁
curl 172.17.0.2
五、鏡像優化
主要優化途徑包括:
- 清理鏡像構建的中間產物
- 選擇最精簡的基礎鏡像
- 減少鏡像的層數
- 盡量去用構建快取
- 使用多階段構建鏡像
- 注意優化網路請求
v2鏡像:減少鏡像層數,合并所有RUN指令,清理鏡像構建的中間產物包括編譯好的安裝包和快取/mnt/nginx-1.20.1 /var/cache/*
cat Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
創建鏡像v2
docker build -t rhel7:v2 .

查看鏡像大小
docker images rhel7

v3:盡量去用構建快取,使用多階段構建鏡像
cat Dockerfile
FROM rhel7 as build
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 /var/cache/*
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -t rhel7:v3 .

查看壓縮后的鏡像v3大小

v4:選擇最精簡的基礎鏡像替換原有的rhel7

cat /new/Dockerfile
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /usr/sbin/nginx-debug /opt && \
cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]
docker build -t rhel7:v4 .


docker images rhel7

可以看到原本的300M+的鏡像被我們壓縮到31.9M,
六、本地私有倉庫搭建
先清理之前實驗的所有鏡像

docker ps -a
docker rm -f demo
docker rmi rhel7:v4
docker rmi rhel7:v3
docker rmi rhel7:v2
docker rmi rhel7:v1
docker images

鏡像改名
標記原有鏡像rhel7:v4 為新鏡像demo:latest
docker tag rhel7:v4 demo:latest
docker images

洗掉rhel7:v4不影響demo的使用
docker rmi rhel7:v4
docker images rhel7
docker images demo

準備好搭建本地倉庫的軟體tegistry
docker pull registry
docker load -i registry2.tar

docker images

查看行程和層級結構
docker ps -a
docker history registry:2

啟動本低倉庫,-v表示本地 /opt/ 映射容器中的 /var/lib ,埠映射為5000
docker run -d --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 registry

查看行程是否開啟
docker ps

查看本地映射的倉庫路徑
ls /opt/registry/
cd /opt/registry/

查看埠5000是否打開
netstat -antlp

將容器中的game2048鏡像標記到本地倉庫中
docker tag game2048:latest localhost:5000/game2048:latest

推行上傳
docker push localhost:5000/game2048

上傳成功后本地路徑中也產生了檔案
ls /opt/registry/
docker ps -a

洗掉之后,重新加載,之前的內容依然存在
docker rm -f registry
docker ps -a
docker run -d --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 registry
curl localhost:5000/v2/_catalog

筆記補充–docker常用命令補充
rhel8系統版本中容器為podman,使用與docker相似,
docker 常用命令
可參考:https://www.runoob.com/docker/docker-command-manual.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289722.html
標籤:其他
上一篇:windows環境jenkins安裝 自動編譯 publish over ssh 遠程發布.netcore webapi 服務化.netcore webapi
下一篇:在新服務器上安裝python環境
