Docker容器(配置+镜像建立及优化+镜像加速器制作)
一、docker簡(jiǎn)介
Docker是管理容器的引擎。
Docker為應(yīng)用打包、部署平臺(tái),而非單純的虛擬化技術(shù)
1.VM vs Container
2.傳統(tǒng)虛擬機(jī)和容器的技術(shù)對(duì)比
3.容器是如何工作的
二、容器配置
鏈接:官方站點(diǎn)
阿里云開源鏡像站
1.搭建docker倉(cāng)庫(kù)
[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由于下載過(guò)程中會(huì)出現(xiàn)很多的依賴性,這些依賴性都是從centos源里面找到的,所以這里我們還需搭建一個(gè)centos源,這里可以參考阿里云鏡像站
[root@server1 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo [root@server1 yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo [root@server1 yum.repos.d]# vim CentOS-Base.repo :%s/$releasever/7/g ## 因?yàn)槲矣玫氖莚edhat操作系統(tǒng),所以需要修改一下路徑,替換成7就可以了修改后的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列一下倉(cāng)庫(kù),如果沒(méi)有問(wèn)題直接下載即可
2.下載docker-ce
[root@server1 yum.repos.d]# yum repolist [root@server1 yum.repos.d]# yum install -y docker-ce3.開啟服務(wù),并開機(jī)自啟
[root@server1 yum.repos.d]# systemctl start docker [root@server1 yum.repos.d]# systemctl enable docker4.查看docker 信息
[root@server1 yum.repos.d]# docker info
如果查看info中出現(xiàn)以下報(bào)錯(cuò)
解決方法如下:
5.測(cè)試
[root@server1 ~]# docker search yakexi007 NAME DESCRIPTION STARS OFFICIAL AUTOMATED yakexi007/game2048 0 yakexi007/mario 0 yakexi007/nginx 0 [root@server1 ~]# docker pull yakexi007/game2048 ## 拉取鏡像本地加載[root@server1 ~]# docker load -i mario.tar
做端口映射 第一個(gè)80是宿主機(jī)的,第二個(gè)對(duì)應(yīng)鏡像的端口
-d是打入后臺(tái),–name 是給鏡像取個(gè)名字
然后訪問(wèn)docker主機(jī)的ip即可
這里是mario的,和2048操作相同
刪除已經(jīng)拉取的鏡像
三、docker鏡像
1.鏡像的分層結(jié)構(gòu)
共享宿主機(jī)的kernel
base鏡像提供的是最小的Linux發(fā)行版
同一docker主機(jī)支持運(yùn)行多種Linux發(fā)行版
采用分層結(jié)構(gòu)的最大好處是:共享資源
拉取一個(gè)busybox作為實(shí)驗(yàn)環(huán)境
[root@server1 ~]# docker pull busybox [root@server1 ~]# docker history busybox:latest會(huì)執(zhí)行shell ,提供一個(gè)環(huán)境,交互式
進(jìn)入交互式
會(huì)提供一個(gè)ip ,在容器的ip上遞增,內(nèi)核版本信息和宿主機(jī)一模一樣
當(dāng)我們CLRT+d 推出那個(gè)交互式環(huán)境之后,我們?cè)俅尾榭催M(jìn)程,發(fā)現(xiàn)已經(jīng)沒(méi)有進(jìn)程了,
注意 CTRL+p+q 是打入后臺(tái),可以退出交互式環(huán)境,也還可以保留進(jìn)程
Copy-on-Write 可寫容器層,容器層以下所有鏡像層都是只讀的,docker從上往下依次查找文件,容器層保存鏡像變化的部分,并不會(huì)對(duì)鏡像本身進(jìn)行任何修改,一個(gè)鏡像最多127層。
實(shí)驗(yàn)驗(yàn)證:
2.鏡像的構(gòu)建
- docker commit 構(gòu)建新鏡像三部曲
- 運(yùn)行容器
- 修改容器
- 將容器保存為新的鏡像
- 缺點(diǎn):
- 效率低、可重復(fù)性弱、容易出錯(cuò)
- 使用者無(wú)法對(duì)鏡像進(jìn)行審計(jì),存在安全隱患
(一)運(yùn)行容器
(二)將容器保存為新的鏡像
[root@server1 ~]# docker commit -m "add files" demo demo:v1(三)查看鏡像
[root@server1 ~]# docker images
相當(dāng)于在原來(lái)的busybox基礎(chǔ)上加了一層.
當(dāng)我們回收掉容器demo后,再次運(yùn)行一下demo:v1查看數(shù)據(jù)
創(chuàng)建一個(gè)Dockerfile
構(gòu)建鏡像
從當(dāng)前目錄中找Dokerfile ,運(yùn)行里面的指令
在history里我們可以詳細(xì)的看到所運(yùn)行的所有指令。一目了然。
Dokerfile 最佳實(shí)踐
每一步操作都是由docker commit來(lái)實(shí)現(xiàn)的,每一條指令生成一個(gè)鏡像層
在demo:v1的基礎(chǔ)上又加了兩層
四、Dockerfile詳解
還原環(huán)境
[root@server1 docker]# docker rmi demo:v1 [root@server1 docker]# docker rmi demo:v21.dockerfile常用指令
(1) FROM
指定base鏡像,如果本地不存在會(huì)從遠(yuǎn)程倉(cāng)庫(kù)下載。
(2) MAINTAINER
設(shè)置鏡像的作者,比如用戶郵箱等。
(3) COPY
把文件從build context復(fù)制到鏡像
支持兩種形式:COPY src dest 和 COPY [“src”, “dest”]
src必須指定build context中的文件或目錄
示例:
[root@server1 docker]# vim index.html www.sun.com [root@server1 docker]# vim Dockerfile FROM busybox RUN touch file1 COPY index.html /
查看
進(jìn)入交互式頁(yè)面,查看剛才指令是否執(zhí)行成功
(4)ADD
用法與COPY類似,不同的是src可以是歸檔壓縮文件,文件會(huì)被自動(dòng)解壓到dest,也可以自動(dòng)下載URL并拷貝到鏡像:
示例:
查看效果:
(4) ENV
設(shè)置環(huán)境變量,變量可以被后續(xù)的指令使用:
ENV HOSTNAME sevrer1
示例:
查看命令和之前相同,這里直接驗(yàn)證最后結(jié)果
(5) EXPOSE
如果容器中運(yùn)行應(yīng)用服務(wù),可以把服務(wù)端口暴露出去:
EXPOSE 80
隨機(jī)指定端口:
(6) VOLUME
申明數(shù)據(jù)卷,通常指定的是應(yīng)用的數(shù)據(jù)掛在點(diǎn):
VOLUME ["/var/www/html"]
查看/data是否成功掛載
[root@server1 docker]# docker inspect demo
上圖我們看到/data實(shí)際上掛載到了我選中的那個(gè)路徑中,數(shù)據(jù)也存在在宿主機(jī)里面,然后我們測(cè)試刪掉文件,然后重新見(jiàn)一個(gè)文件,再次進(jìn)入demo中查看,我們新建的文件也存在。說(shuō)明容器可以做數(shù)據(jù)持久化。
用以下命令我們可以將沒(méi)有被掛載的數(shù)據(jù)
[root@server1 _data]# docker rm demo demo [root@server1 _data]# docker volume ls DRIVER VOLUME NAME local ad7567a0c7d9a0694ea1f3ea1798bd12a8b1f3eb036a8cd3476359c6c7e6db19 [root@server1 _data]# docker volume prune(7) WORKDIR
為RUN、CMD、ENTRYPOINT、ADD和COPY指令設(shè)置鏡像中的當(dāng)前工作目錄,如果目錄不存在會(huì)自動(dòng)創(chuàng)建。
(8) RUN
在容器中運(yùn)行命令并創(chuàng)建新的鏡像層,常用于安裝軟件包:
(9) CMD 與 ENTRYPOINT
這兩個(gè)指令都是用于設(shè)置容器啟動(dòng)后執(zhí)行的命令,但CMD會(huì)被docker run后面的命令行覆蓋,而ENTRYPOINT不會(huì)被忽略,一定會(huì)被執(zhí)行。
docker run后面的參數(shù)可以傳遞給ENTRYPOINT指令當(dāng)作參數(shù)。
Dockerfile中只能指定一個(gè)ENTRYPOINT,如果指定了很多,只有最后一個(gè)有效。
示例:
我們可以看的CMD后的東西是可以被覆蓋的
五、配置鏡像加速器
容器鏡像服務(wù)
在阿里云注冊(cè),每個(gè)人都可以有免費(fèi)加速
六、鏡像的優(yōu)化
- 選擇最精簡(jiǎn)的基礎(chǔ)鏡像
- 減少鏡像的層數(shù)
- 清理鏡像構(gòu)建的中間產(chǎn)物
- 注意優(yōu)化網(wǎng)絡(luò)請(qǐng)求
- 盡量去用構(gòu)建緩存
- 使用多階段構(gòu)建鏡像
1.實(shí)例分析:
這里我們使用nginx鏡像制作作為示例
首先我們需要搭建base,這里使用的是rhel7,
鏈接:rhel7 提取碼: k2dm
- 編寫Dockerfile 文件
這里我們還需要nginx-1.18.0的tar包放在test目錄下
鏈接:nginx tar包 提取碼: tscn
還需要將本地的yum源放置test目錄下
這里我們看到我們構(gòu)建出來(lái)的nginx鏡像144M,由于我們知道官方的nginx鏡像是133M,所以需要做優(yōu)化。
我們可以看到剛才的base rhel7就占140M,我們要再優(yōu)化的話只能從base入手,所以我們需要換一個(gè)小一點(diǎn)的base
下面我們就使用goole最簡(jiǎn)base做實(shí)驗(yàn),對(duì)比剛才做好的鏡像大小。
七、構(gòu)建nginx容器鏡像
首先我們使用goolge的最簡(jiǎn)base
鏈接: base-debian10.tar提取碼: n8xf
1.創(chuàng)建base環(huán)境
[root@server1 ~]# docker load -i base-debian10.tar [root@server1 nginx]# docker pull nginx [root@server1 ~]# mkdir nginx2.編寫Dockefile
[root@server1 nginx]# vim Dockerfile FROM nginx:1.19.2 as base# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ARG TIME_ZONERUN 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/localtimeFROM gcr.io/distroless/base-debian10COPY --from=base /opt /EXPOSE 80 443ENTRYPOINT ["nginx", "-g", "daemon off;"]參考官方地址nginx Dockefilehttps://github.com/kyos0109/nginx-distroless/blob/master/Dockerfile
3.執(zhí)行built
[root@server1 nginx]# docker build -t webserver:v1 . [root@server1 nginx]# docker images
我們可以封裝完看到只有31.6MB,比官方的要小的多
4.運(yùn)行測(cè)試
[root@server1 nginx]# docker run -d --name webserver webserver:v1 [root@server1 nginx]# docker ps [root@server1 nginx]# docker inspect webserver將其打入后臺(tái),查看端口,進(jìn)行訪問(wèn)
我們可以看到已經(jīng)成功訪問(wèn)到了nginx的默認(rèn)發(fā)布頁(yè)面,到這里就說(shuō)明我們已經(jīng)成功構(gòu)建nginx鏡像了。
從上圖我們通過(guò)對(duì)比兩次制作的nginx鏡像大小,我們看到通過(guò)優(yōu)化之后的鏡像大小只有31.6M,比官方的要小的多。
總結(jié)
以上是生活随笔為你收集整理的Docker容器(配置+镜像建立及优化+镜像加速器制作)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: salt-api配置
- 下一篇: Docker仓库搭建