Docker基礎知識
可以參考之前的文章Docker基礎知識
Docker的基本使用方法
可以參考之前的文章Docker基本使用
里邊包含創建鏡像的兩種方法,第二種方法Dockerfile是下面涉及到的,建議把鏈接的文章看一下
自己創建一個nginx的鏡像
自己撰寫Dockerfile通過原始的安裝編譯的方法打包一個nginx的鏡像
[root@server1 docker]# pwd
/root/docker/
[root@server1 docker]# vim Dockerfile
#檔案內容
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb #非0退出會終止運行,所以要重建
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;"]
撰寫完檔案后創建鏡像-運行容器 -查看容器詳細資訊得到ip和分配的地址
[root@server1 docker]# docker build -t rhel7:v1 .
[root@server1 docker]# docker run -d --rm rhel7:v1
19d2cf9bcad38671f3466317a5e0ba1e0bdf742e8e2742fe320fd742497edecc
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19d2cf9bcad3 rhel7:v1 "/usr/local/nginx/sb…" 8 seconds ago Up 7 seconds 80/tcp sleepy_payne
[root@server1 docker]# docker inspect 19d2cf9bcad3
"Source": "/var/lib/docker/volumes/9db302d4232ebcdbb66574dc9114b1dec43d0b8a2210b4116693af1291e816ed/_data", #這是nginx源地址,需要在這里撰寫一個index.html,否則可能會出現403錯誤
"IPAddress": "172.17.0.2", #后邊會顯示訪問nginx的ip

去源地址加index.html檔案,然后curl ip訪問,如果顯示我們編輯的頁面內容即訪問成功,
[root@server1 docker]# cd /var/lib/docker/volumes/9db302d4232ebcdbb66574dc9114b1dec43d0b8a2210b4116693af1291e816ed/_data
[root@server1 _data]# ls
[root@server1 _data]# echo www.hello.org > index.html
[root@server1 _data]# curl 172.17.0.2
www.hello.org
#訪問成功!
至此初始鏡像制作成功!大小是303MB

在初始鏡像的基礎上進行優化
修改我們上面編輯的Dockerfile檔案
把RUN命令都合到一起,因為RUN命令每運行一次都會增加一層鏡像層,所以我們用&&(如果執行成功就執行下一條命令)把他們連接起來
[root@server1 _data]# cd -
/root/docker
[root@server1 docker]# ls
Dockerfile dvd.repo index.html nginx-1.20.1.tar.gz rhel7.tar
[root@server1 docker]# vim Dockerfile
#修改后的檔案內容如下
FROM rhel7 as build
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
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;"]
創建新的鏡像-運行容器
[root@server1 docker]# docker build -t rhel7:v2 .
[root@server1 docker]docker run -d --rm rhel7:v2
8a9f00388f769907385210efe8a39df17d5a04ef3f80066fc9b5a4bbcaca47c2

查看容器詳細資訊得到ip和分配的地址并curl訪問
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a9f00388f76 rhel7:v2 "/usr/local/nginx/sb…" 26 seconds ago Up 26 seconds gallant_leakey
19d2cf9bcad3 rhel7:v1 "/usr/local/nginx/sb…" About an hour ago Up About an hour 80/tcp sleepy_payne
[root@server1 docker]# docker inspect 8a9f00388f76
[root@server1 docker]# curl 172.17.0.3

查看首次優化后的大小為141M,相比原始的303已經小了很多,但還不夠
#rhel:v2是在下圖none的基礎上建成的,因為我們在Dockerfile檔案中寫了是基于創建好的又進行優化的

進一步優化
我們上面用的baseimage都是rhel7鏡像,比較大,他里邊有很多模塊是我們用不到的,我們可以把需要的依賴項拷下來,這樣一來就可以省掉很多空間,
按照這個思路先換個baseimage,我換為了debian10鏡像
[root@server1 docker]# cd
[root@server1 ~]# ls
anaconda-ks.cfg base-debian10.tar docker
[root@server1 ~]# docker load -i base-debian10.tar #載入debian10鏡像
de1602ca36c9: Loading layer 3.041MB/3.041MB
1d3b68b6972f: Loading layer 17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest
重新寫一個Dockerfile檔案,把需要的依賴項都拷下來放到一個目錄下
[root@server1 ~]# vim 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;"]
創建鏡像
[root@server1 ~]# docker build -t rhel7:v3 .
使用鏡像運行容器
[root@server1 ~]# docker run -d --rm rhel7:v3
9f97e2c8ef38f808bb4e6bce964be7887d80fc6094ca903d9b52102389a39761
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f97e2c8ef38 rhel7:v3 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp, 443/tcp friendly_kowalevski
8a9f00388f76 rhel7:v2 "/usr/local/nginx/sb…" 55 minutes ago Up 55 minutes gallant_leakey
19d2cf9bcad3 rhel7:v1 "/usr/local/nginx/sb…" 2 hours ago Up 2 hours 80/tcp sleepy_payne

查看大小,可以看到是31.6M,已經很小了
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 v3 6980ac3cc586 8 seconds ago 31.6MB
<none> <none> bb19467e5054 9 seconds ago 145MB
<none> <none> 1e4b9ae5243f 24 minutes ago 255MB

查看容器詳細資訊得到給nginx分配的ip
[root@server1 ~]# docker inspect 9f97e2c8ef38 #容器id,docker ps可以得到

curl訪問成功!

優化成功!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290043.html
標籤:其他
