2022-10-24 docker學(xué)習(xí)

1、掌握namespace、cgroup在容器中的作用;

1.1、namespace

namespace 是 Linux系統(tǒng)的底層概念,在內(nèi)核層實(shí)現(xiàn),即有一些不同類(lèi)型的命名空問(wèn)被部署在核內(nèi),各個(gè)docker 容器運(yùn)行在同一個(gè)docker 主進(jìn)程并且共用同一個(gè)宿主機(jī)系統(tǒng)內(nèi)核,各docker 容器運(yùn)行在宿主機(jī)的用戶空問(wèn),每個(gè)容器都要有類(lèi)似于虛擬機(jī)一樣的相互隔離的運(yùn)行空問(wèn),但是容器技術(shù)是在一個(gè)進(jìn)程內(nèi)實(shí)現(xiàn)運(yùn)行指定服務(wù)的運(yùn)行環(huán)境,并且還可以保護(hù)宿主機(jī)內(nèi)核不受其他進(jìn)程的干擾和影響,如文件系統(tǒng)間、網(wǎng)絡(luò)空間、進(jìn)程空問(wèn)等,目前主要通過(guò)以下技術(shù)實(shí)現(xiàn)容器運(yùn)行空間的相互隔離


1666593797674.png

1.2、cgroup

cgroup可以限制單個(gè)容器使用宿主機(jī)的資源,一般包括CPU、內(nèi)存。

2、編排工具及依賴技術(shù)總結(jié);

2.1、編排工具

Docker swarm: docker 開(kāi)發(fā)的容器編排引擎。
Kubernetes: google 領(lǐng)導(dǎo)開(kāi)發(fā)的容器編排引擎,內(nèi)部項(xiàng)目為Borg,且其同時(shí)支持docker fu CoreOS.
Mesos+Marathon:通用的集群組員調(diào)度平臺(tái),mesos(資源分配)與marathon(容器編排平臺(tái))一起提供容器編排引擎功能
docker-compose:docker自帶的單機(jī)容器編排工具,不能跨虛擬機(jī)使用。

2.2、依賴技術(shù)

2.2.1、容器網(wǎng)絡(luò):

docker 自帶的網(wǎng)絡(luò)docker network 僅支持管理單機(jī)上的容器網(wǎng)絡(luò),當(dāng)多主機(jī)運(yùn)行的時(shí)候需要使用第三方開(kāi)源網(wǎng)絡(luò),例如calico. flannel 等。

2.2.2、服務(wù)發(fā)現(xiàn):

容器的動(dòng)態(tài)擴(kuò)容特性決定了容器IP也會(huì)隨之變化,因此需要有一種機(jī)制可以自動(dòng)識(shí)別并將用戶請(qǐng)求動(dòng)態(tài)轉(zhuǎn)發(fā)到新創(chuàng)建的容器上,kubernetes 自帶服務(wù)發(fā)現(xiàn)功能,需要結(jié)合kube-dns 服務(wù)解析內(nèi)部域名。

2.2.3、容器監(jiān)控:

可以通過(guò)原生命令docker ps/top/stats 查看容器運(yùn)行狀態(tài),另外也可以使heapster/ Prometheus 等第三方監(jiān)控工具監(jiān)控容器的運(yùn)行狀態(tài)。

2.2.4、數(shù)據(jù)管理:

容器的動(dòng)態(tài)遷移會(huì)導(dǎo)致其在不同的Host 之間遷移,因此如何保證與容器相關(guān)的數(shù)據(jù)也能隨之遷移或隨時(shí)訪問(wèn),可以使用邏輯卷/存儲(chǔ)掛載等方式解決。

2.2.5、日志收集:

docker 原生的日志查看工具docker logs,但是容器內(nèi)部的日志需要通過(guò)ELK等專(zhuān)門(mén)的日志收集分析和展示工具進(jìn)行處理。

3、基于dockerfile制作一個(gè)nginx鏡像;

3.1、dockerfile文件

FROM 155.155.1.54/sdyy/ol7:slim
LABEL version="OracleLinux7:slim"
LABEL maintainer="hanqunfeng"

ENV NGINX_HOME=/usr/local/nginx
ENV PATH=$PATH:$NGINX_HOME/sbin
ENV export PATH


#EXPOSE 80

RUN  rm -f /etc/localtime \
        && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && mkdir -p /opt/script 
        

RUN yum clean all && yum makecache && yum install -y wget vim-enhanced make automake cmake gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

ADD nginx-1.14.2.tar /usr/local 
RUN cd /usr/local/nginx-1.14.2 \
        && ./configure  --prefix=/usr/local/nginx \
        --user=root --group=root --with-http_ssl_module \
        --with-http_flv_module --with-http_stub_status_module \
        --with-http_gzip_static_module \
        --http-client-body-temp-path=/var/tmp/nginx/client/ \
        --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
        --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
        --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi  \
        --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre \
        && make  && make install \
        && echo NGINX_HOME=/usr/local/nginx >> /etc/profile \
        && echo PATH=$PATH:$NGINX_HOME/sbin >> /etc/profile \
        && source /etc/profile \
        && echo ###Nginx need### >> /etc/security/limits.conf \
        && echo *          soft     nproc           65535 >> /etc/security/limits.conf \
        && echo *          hard     nproc           65535 >> /etc/security/limits.conf \
        && echo *          soft     nofile          65535 >> /etc/security/limits.conf \
        && echo *          hard     nofile          65535 >> /etc/security/limits.conf \
        && mkdir -p /var/tmp/nginx/client

CMD cd /usr/local/nginx/sbin/ \
        && mkdir -p /var/tmp/nginx/client \
        && ./nginx -g "daemon off;"

3.2鏡像構(gòu)建、啟動(dòng)、上傳、測(cè)試

#構(gòu)建鏡像 
docker build -t nginx:Vbase .
#啟動(dòng)容器
docker run -d -p 6680:80 nginx:Vbase
#打標(biāo)簽
docker tag nginx:Vbase 155.155.1.54/sdyy/nginx:vbase
#登錄
docker login 155.155.1.54 -u admin
#上傳鏡像
docker push 155.155.1.54/sdyy/nginx:vbase
#訪問(wèn)測(cè)試
curl 127.0.0.1:6680

出現(xiàn) Welcome to nginx! 字樣證明容器正常運(yùn)行。


image.png

4、鏡像構(gòu)建總結(jié);

兩種方式構(gòu)建鏡像

第一種是手動(dòng)構(gòu)建,啟動(dòng)基礎(chǔ)系統(tǒng)容器,通過(guò)docker exec命令進(jìn)入容器內(nèi)部,然后進(jìn)行手動(dòng)敲命令安裝,最后再通過(guò)docker commit 鏡像提交到docker images。通常不推薦這種方法
第二種是通過(guò)dockerfile構(gòu)建鏡像,一般都推薦此種方法構(gòu)建鏡像。首先編寫(xiě)好dockerfile文件,然后docker通過(guò)docker build構(gòu)建鏡像,接著docker tag 給鏡像打標(biāo)簽,最后docker push上傳。

dockerfile 語(yǔ)法


FROM centos:7.6.1810 #在整個(gè)dockfile文件中,除了注釋之外的第一行,要是from,用于指定父鏡像

ADD #用于添加宿主機(jī)本地的文件、目錄、壓縮等資源到鏡像里面去,會(huì)自動(dòng)解壓tar.gz格式的壓縮包,不會(huì)自動(dòng)解壓zip
MAINTAINER   #(鏡像的作者信息)
LABEL #設(shè)置鏡像的屬性標(biāo)簽

COPY #用于添加宿主機(jī)本地的文件、目錄、壓縮等資源到鏡像里面去,不會(huì)解壓任何壓縮包

ENV #設(shè)置容器環(huán)境變量
USER nginx #指定運(yùn)行操作的用戶
RUN yum install vim unzip -y && cd /etc/nginx  #執(zhí)行shell命令,但是一定要以非交互式的方式執(zhí)行
VOLUME #定義volume
WORKDIR #用于定義工作目錄

EXPOSE 80 #生命要把容器的某些端口映射到宿主機(jī)

CMD  #鏡像啟動(dòng)為一個(gè)容器時(shí)候的默認(rèn)命令或腳本, CMD ["/bin/bash"] 
ENTRYPOINT #也可以用于定義容器在啟動(dòng)時(shí)候默認(rèn)執(zhí)行的命令或者腳本,如果是和CMD命令混合使用的時(shí)候,會(huì)將CMD的命令當(dāng)做參數(shù)傳遞給ENTRYPOINT后面的腳本,可以在腳本中對(duì)參數(shù)做判斷并相應(yīng)的容器初始化操作。
    ENTRYPOINT ["top", "-b"] ==  ENTRYPOINT ["top", "-b", "-c"]
    CMD ["-c"]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容