目錄
- docker簡介
- docker和虛擬機的區別:
- 容器是如何作業的
- 1.配置docker
- 1.1搭建docker倉庫
- 1.2下載docker-ce
- 1.3測驗
- 2.鏡像的分層
- 2.1檔案匯入鏡像
- 3.Dockerfile詳解
- 3.1. FROM
- 3.2. RUN
- 3.3. MAINTAINER
- 3.4.COPY
- 3.5.ADD
- 3.6. ENV
- 3.7. EXPOSE
- 3.8. VOLUME
- 3.9.WORKDIR
- 3.10.CMD 與 ENTRYPOINT
- 洗掉掉剛才建立的鏡像
- 4.鏡像構建- -nginx
- 5.鏡像優化
docker簡介
Docker是管理容器的引擎,
Docker為應用打包、部署平臺,而非單純的虛擬化技術
docker和虛擬機的區別:

容器是如何作業的

1.配置docker
1.1搭建docker倉庫
準備一臺虛擬機server1:
配置軟體倉庫,從官網下載的倉庫!
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
由于下載程序中會出現很多的依賴性,這些依賴性都是從centos源里面找到的,所以這里我們還需搭建一個centos源,這里可以參考阿里云鏡像站
[root@server1 yum.repos.d]# vim CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-7 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-7 - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-7 - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-7 - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#contrib - packages by Centos Users
[contrib]
name=CentOS-7 - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
本人本地有docker軟體目錄,所以直接下載!
1.2下載docker-ce
[root@server1 yum.repos.d]# yum repolist
[root@server1 yum.repos.d]# yum install -y docker-ce

開啟服務,并開機自啟
[root@server1 yum.repos.d]# systemctl enable docker

查看docker 資訊:
[root@server1 yum.repos.d]# docker info

使用docker info 出現警告iptables的情況:
解決方式:

[root@server1 sysctl.d]# pwd
/etc/sysctl.d
[root@server1 sysctl.d]# vim docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 sysctl.d]# sysctl --system
[root@server1 sysctl.d]# ip addr

1.3測驗
因為本人本地有鏡像直接本地拉取,沒有的網上拉取!
[root@server1 ~]# docker search yakexi007
[root@server1 ~]# docker load -i mario.tar ##本地加載
[root@server1 ~]# docker pull yakexi007/game2048 ## 要是本地沒有,就網上拉取拉取鏡像
[root@server1 ~]# docker inmages

做埠映射 第一個80是宿主機的,第二個對應鏡像的埠
-d是打入后臺,–name 是給鏡像取個名字
[root@server1 ~]# docker run -d --name game2048 -p 80:80 yakexi007/game2048
[root@server1 ~]# docker ps ##查詢埠連接情況
[root@server1 ~]# docker ps -a ## 查看所有的,包括已經停掉的

[root@server1 ~]# docker history game2048:latest

然后訪問docker主機的ip即可:172.25.0.1

接著洗掉拉取得鏡像
[root@server1 ~]# docker rm -f demo

重新拉取鏡像mario
做埠映射 第一個80是宿主機的,第二個對應鏡像的埠
mario的鏡像埠為8080!!!
docker load -i mario.tar
docker run -d --name demo -p 80:8080 mario


訪問172.25.0.1:

2.鏡像的分層
base鏡像提供的是最小的Linux發行版
同一docker主機支持運行多種Linux發行版
采用分層結構的最大好處是:共享資源
拉取一個busybox作為實驗環境
[root@server1 ~]# docker pull busybox
[root@server1 ~]# docker run -it --name demo busybox

進入互動式
[root@server1 ~]# docker run -it --name demo busybox
ls
[root@server1 ~]#docker rm demo
-i表示互動式,-t表示打開偽終端
[root@server1 ~]#docker run -it --name demo demo:v1

查看鏡像
docker images

運行容器,創建檔案!
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

我們來對比查看兩者層級結構
我們會發現demo:v1是在busybox的基礎上又添加了一層!
docker history demo:v1
docker history busybox:latest

洗掉v1鏡像
docker rmi demo:v1
docker images
docker history busybox:latest

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

注意,已經拉取了busybox再次拉取一定會報錯!!如下:

刪掉demo后,不影響v1鏡像!
docker rm demo
docker ps -a
docker run -it --name demo demo:v1 ## 檔案還在!!

對比層級結構查看,我們會發現:手動添加的容器沒有解釋每一層的作用,game2048里會有解釋如下圖:
docker history demo:v1
docker history game2048:latest


2.1檔案匯入鏡像
我們若是需要解決這個問題需要用檔案的方式匯入 鏡像!
mkdir docker
cd docker/
vim Dockerfile
cat Dockerfile
FROM busybox
RUN echo westos > testfile

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


查看匯入的鏡像,可以查到鏡像內容:

接著我們在檔案Dockerfile里面再追加一行輸出:
vim Dockerfile
FROM busybox
RUN echo westos > testfile
RUN echo westos > helloworld

docker build -t demo:v3 .
docker history demo:v3

同樣可以看到記錄追加了一條!

3.Dockerfile詳解
3.1. FROM
指定base鏡像,如果本地不存在會從遠程倉庫下載,
3.2. RUN
在容器中運行命令并創建新的鏡像層,常用于安裝軟體包:
3.3. MAINTAINER
設定鏡像的作者,比如用戶郵箱等,
3.4.COPY
把檔案從build context復制到鏡像
支持兩種形式:COPY src dest 和 COPY [“src”, “dest”]
src必須指定build context中的檔案或目錄
FROM busybox #鏡像來源
RUN echo westos > testfile # RUN后跟shell運行陳述句
RUN echo westos > helloworld
COPY index.html / #COPY拷貝當前目錄的index.html到容器的根目錄下
然后在docker目錄下
echo westos > index.html

我們可以看到demo:v3里面可以看到index.html檔案已經匯入!
docker build -t demo:v3 .
docker run -it --name demo demo:v3
ls


3.5.ADD
接下來我們需要在docker目錄下放入一個nginx的壓縮包:

添加組態檔!
ADD nginx-1.20.1.tar.gz / #ADD 解壓tar包到根目錄下

docker build -t demo:v4 .
docker history demo:v4


我們需要每次加載docker之后,不希望保留行程!
那么需要加上引數 --rm
docker run -it --rm demo:v4
我們看到nginx已經被解壓放入了docker中!

3.6. ENV
設定環境變數,變數可以被后續的指令使用:
ENV HOSTNAME sevrer1
3.7. EXPOSE
如果容器中運行應用服務,可以把服務埠暴露出去:
EXPOSE 80
3.8. VOLUME
申明資料卷,通常指定的是應用的資料掛在點:
VOLUME ["/var/www/html"]
添加env expose引數沒有效果,后面再演示!
ENV HOSTNAME server1 #ENV 定義變數HOSTNAME為server1
EXPOSE 80 #設定埠為80
VOLUME {"/data"} #掛載目錄為/data

docker build -t demo:v5 .
docker run -it --rm demo:v5


我們可以查看data是否掛載成功!
docker inspect demo

我們進入圖上顯示的路徑下:
cd /var/lib/docker/volumes/****
echo westos >> helloworld
echo westos >> helloworld
echo westos >> helloworld
echo westos >> helloworld

重新加載進入docker發現剛才匯入的資料全部到docker中了!
docker ps
docker attach ****
ls
cat helloworld

3.9.WORKDIR
為RUN、CMD、ENTRYPOINT、ADD和COPY指令設定鏡像中的當前作業目錄,如果目錄不存在會自動創建,
3.10.CMD 與 ENTRYPOINT
這兩個指令都是用于設定容器啟動后執行的命令,但CMD會被docker run后面的命令列8覆寫,而ENTRYPOINT不會被忽略,一定會被執行,
檔案中添加CMD echo “hello world”
docker build -t demo:v6 .
docker run --rm demo:v6



當檔案寫為如下就會報錯,因為格式不正確
docker build -t demo:v7 .
docker run --rm demo:v7


所以我們刪掉鏡像v7

修改檔案使得可以輸出主機名
docker build -t demo:v9 .
docker run --rm demo:v9



若是在運行docker容器的時候,后面加上引數,那么就會覆寫之前的輸出:
docker run --rm demo:v9 date

修改檔案如下
輸出會覆寫
CMD ["world"]
docker1 build -t demo:v9 .
docker run --rm demo:v9



后面添加引數會自動覆寫,如下:

洗掉掉剛才建立的鏡像
洗掉掉剛才建立的鏡像,使用快捷的指令直接洗掉!
docker rmi `docker images |grep ^demo | awk '{print $3}'`

4.鏡像構建- -nginx
匯入rhel7鏡像,相當于使用rhel7的內核
get rhel7.tar
docker load -i rhel7.tar
docker images

rhel7有140mb大小!

撰寫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
docker images rhel7


拉起容器,行程名為demo,查看行程!
docker run -d --name demo rhel7:v1
docker ps

查demo行程/容器資訊
docker inspect demo


修改容器docker中nginx的發布頁面
echo www.westos.org > index.html

測驗訪問可訪問到nginx主頁
curl 172.17.0.2

docker images rhel7
查看到鏡像v1的大小346MB很大!!這樣是不行的!

我們實際生產中,需要docker容器中的鏡像大小越小越好!那么我們需要做優化!
5.鏡像優化
選擇最精簡的基礎鏡像
減少鏡像的層數
清理鏡像構建的中間產物
注意優化網路請求
盡量去用構建快取
使用多階段構建鏡像
優化思路:
v2鏡像:減少鏡像層數,合并所有RUN指令,清理鏡像構建的中間產物包括編譯好的安裝包和快取/mnt/nginx-1.20.1 /var/cache/*
我們繼續編輯檔案Dockerfile,編輯結果如下:
vim 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
發現大小為255MB也沒有想象中的那么如意,還需要優化!

我們單階段鏡像最佳優化已經極限了,那么盡量去用構建快取,使用多階段構建鏡像
兩個from!!
vim 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大小
docker images rhel7


我們運行v3鏡像,ldd查看結構!
docker run -it --rm rhel7:v3 bash
ldd

若是還想優化鏡像的話:
選擇最精簡的基礎鏡像替換原有的rhel7
我們創建一個新的目錄new用來存放新的base的檔案!
cd /root/docker
mkdir new
cd new

下載到新的base

本地加載base鏡像
docker load -i base-debian10.tar

docker images查看大小
僅僅19.2MB,在base上比之前的rhel7大大的優化了!!

撰寫檔案Dockerfile

vim /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

查看大小只有31.9MB

加載鏡像v4
docker run -d --name demo rhel7:v4

docker inspect demo

測驗
curl 172.17.0.2即可!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289545.html
標籤:其他
上一篇:微服務原理學習小結(一)
下一篇:js 封裝websocket
