1、掌握namespace、cgroup在容器中的作用;
1.1、namespace
namespace 是 Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空问被部署在核内,各个docker 容器运行在同一个docker 主进程并且共用同一个宿主机系统内核,各docker 容器运行在宿主机的用户空问,每个容器都要有类似于虛拟机一样的相互隔离的运行空问,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统间、网络空间、进程空问等,目前主要通过以下技术实现容器运行空间的相互隔离
1.2、cgroup
cgroup可以限制单个容器使用宿主机的资源,一般包括CPU、内存。
2、编排工具及依赖技术总结;
2.1、编排工具
Docker swarm: docker 开发的容器编排引擎。
Kubernetes: google 领导开发的容器编排引擎,内部项目为Borg,且其同时支持docker fu CoreOS.
Mesos+Marathon:通用的集群组员调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能
docker-compose:docker自带的单机容器编排工具,不能跨虚拟机使用。
2.2、依赖技术
2.2.1、容器网络:
docker 自带的网络docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico. flannel 等。
2.2.2、服务发现:
容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合kube-dns 服务解析内部域名。
2.2.3、容器监控:
可以通过原生命令docker ps/top/stats 查看容器运行状态,另外也可以使heapster/ Prometheus 等第三方监控工具监控容器的运行状态。
2.2.4、数据管理:
容器的动态迁移会导致其在不同的Host 之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。
2.2.5、日志收集:
docker 原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。
3、基于dockerfile制作一个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镜像构建、启动、上传、测试
#构建镜像
docker build -t nginx:Vbase .
#启动容器
docker run -d -p 6680:80 nginx:Vbase
#打标签
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
#访问测试
curl 127.0.0.1:6680
出现 Welcome to nginx! 字样证明容器正常运行。
4、镜像构建总结;
两种方式构建镜像
第一种是手动构建,启动基础系统容器,通过docker exec命令进入容器内部,然后进行手动敲命令安装,最后再通过docker commit 镜像提交到docker images。通常不推荐这种方法
第二种是通过dockerfile构建镜像,一般都推荐此种方法构建镜像。首先编写好dockerfile文件,然后docker通过docker build构建镜像,接着docker tag 给镜像打标签,最后docker push上传。
dockerfile 语法
FROM centos:7.6.1810 #在整个dockfile文件中,除了注释之外的第一行,要是from,用于指定父镜像
ADD #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,不会自动解压zip
MAINTAINER #(镜像的作者信息)
LABEL #设置镜像的属性标签
COPY #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何压缩包
ENV #设置容器环境变量
USER nginx #指定运行操作的用户
RUN yum install vim unzip -y && cd /etc/nginx #执行shell命令,但是一定要以非交互式的方式执行
VOLUME #定义volume
WORKDIR #用于定义工作目录
EXPOSE 80 #生命要把容器的某些端口映射到宿主机
CMD #镜像启动为一个容器时候的默认命令或脚本, CMD ["/bin/bash"]
ENTRYPOINT #也可以用于定义容器在启动时候默认执行的命令或者脚本,如果是和CMD命令混合使用的时候,会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本,可以在脚本中对参数做判断并相应的容器初始化操作。
ENTRYPOINT ["top", "-b"] == ENTRYPOINT ["top", "-b", "-c"]
CMD ["-c"]