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)行空間的相互隔離

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)行。

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"]