一、容器技术(Container)在虚拟机(VMware)出现之前,由于依赖问题,应用部署往往部署在独立的服务器上另一方面,硬件资源利用率低,VMware的出现完美解决了这个问题。但是,VMware也有缺点。首先,VMware其实是一个虚拟的独立OS,需要额外的CPU、RAM和存储资源;其次,由于虚拟机是一个独立的OS,所以启动比较慢;最后,对于一个独立的操作系统,需要单独的补丁和监控,以及商业应用的系统许可。基于以上原因,以谷歌为代表的大型互联网公司一直在探索用容器技术替代虚拟机模式的弊端。在虚拟机模型中,Hypervisor是硬件虚拟化(HardwareVirtualization)——将硬件资源划分为虚拟资源并封装到VM的软件结构中,而容器模型是操作系统虚拟化(OSVirtualization)。容器共享主机操作系统以实现进程级隔离。与虚拟机相比,容器启动快、资源消耗少、易于迁移。1.1Linux容器现代容器技术起源于Linux,依托于KernelNamespace、ControlGroup、UnionFileSystem等核心技术。KernelNamespace负责隔离容器技术的复杂性,使其难以推广。知道Docker的出现,Docker让容器技术的使用变得简单。目前还没有Mac容器。windows平台win10和winserver2016已经支持windows容器。请注意,由于容器共享主机操作系统,Windows容器无法在Linux系统上运行,但DockerforMac和DockerforWindows通过启动轻量级LinuxVM来支持Linux容器。在windows中,系统必须是64位windows10,并启用了Hyper-V和容器功能。1.2Docker安装省略。Mac安装请参考这里。对于Windows安装,请参阅此处。1.3基本概念1.3.1docker引擎架构安装成功后,执行dockerversion输出类似如下内容:Dockerdaemon镜像管理、镜像构建、API、认证、核心网等。早期的Docker引擎只包含LXC和daemon,daemon耦合了client、API、runtime、image构建等功能。拆解后的守护进程核心功能集中在镜像构建管理和API。containerd封装了容器的执行逻辑,负责容器的生命周期管理。shim用于解耦运行中的容器和daemon(daemon可以独立升级)保持所有STDIN和STDOUT流的开启,将容器的退出状态同步到daemonrunc(containerruntime)OCI容器运行时规范参考实现(所以也是轻量级的Lincontainer打包命令行交互工具唯一的功能就是创建容器1.3.2镜像镜像由多层组成,包括一个流线型的OS和独立的应用对象和依赖包,镜像存放在官方镜像仓库镜像仓库服务,可以使用命令dockerimagepullimagename来拉取镜像,完整的镜像名如下::repository:拉取镜像docker的相关操作imagepullrepository:tag查看本地镜像dockerimagels查看镜像详情dockerimageinspectrepository:tag删除镜像dockerimagermrepository:tag(注意有runningcontainer的镜像不能删除)buildimagebuilddockercontainercommitthroughrunningcontainerthroughDockerfile1.3.3containercontainer是镜像的runtime实例。运行容器$dockercontainerrun[OPIONS]注意,对于Linux容器,默认只有app对应的进程在容器中运行。如果app进程退出,则容器也退出,即kill容器中的主进程,即kill容器。使用Ctr-PQ组合键退出容器并返回宿主机并保持容器在后台运行。这时候可以通过dockercontainerexec-itbash再次进入容器。因为运行容器的参数比较复杂,比如端口映射、挂载磁盘、设置环境变量、设置网络等,尤其是运行多个容器时,更是繁琐,所以一般使用DockerCompose这个工具来整理和管理容器。新版本的Docker中默认安装了DockerCompose。查看正在运行的容器$dockercotainerls[-a]$dockerps[-a]启动或停止容器$dockercontainerstart$dockercontainerstop二.容器化的含义2.1统一开发环境2.2自动化测试2.3部署(CI)容器作为应用程序。3、制作基础环境(镜像)3.1容器化(Containerizing)将应用程序集成到容器中运行的过程称为容器化。容器化的一般步骤:应用代码开发,创建Dockerfile,在Dockerfile上下文中执行dockerimagebuild,启动容器,然后正式进入正题,通过容器化定制一个全栈开发基础环境。3.2自定义开发镜像3.2.1环境要求CentOS7.xgccgcc-c++pcre-developenssl-develmakeperlzlibzlib-develvim/openssh-serverNodeJS12.9.1设??置npmregistry为团队私有仓库挂载项目目录暴露80端口和22端口3.2.1编译DockerfileFROMcentos:7MAINTAINERxuhui120#安装依赖,sshRUNyum-yinstall\gcc\gcc-c++\pcre-devel\openssl-devel\make\perl\zlib\vim\zlib-devel\openssh-服务器\&&ssh-keygen-trsa-f/etc/ssh/ssh_host_rsa_key\&&ssh-keygen-trsa-f/etc/ssh/ssh_host_ecdsa_key\&&ssh-keygen-trsa-f/etc/ssh/ssh_host_ed25519_key\&&/bin/sed-i"s/#UsePrivilegeSeparation.*/UsePrivilegeSeparationno/g"/etc/ssh/sshd_config\&&/bin/sed-i"s/#PermitRootLogin.*/PermitRootLoginyes/g"/etc/ssh/sshd_config\&&/bin/sed-i's/UsePAMyes/UsePAMno/g'/etc/ssh/sshd_config\&&/bin/echo"cd/var/www">>/root/.bashrc#########################安装节点########################USERrootARGNODE_VERSION=12.9.1RUNcd/usr/local/src\&&curl-O-shttps://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz\&&mkdir-p/usr/local/nodejs\&&tarzxfnode-v${NODE_VERSION}-linux-x64.tar.gz-C/usr/local/nodejs--strip-components=1--no-same-owner\&&ls-al/usr/local/nodejs\&&ln-s/usr/local/nodejs/bin/*/usr/local/bin/\&&npmconfigsetregistryhttp://registry.xxx.com\&&cd/usr/local/src\&&rm-rf*.tar.gz#禁用根目录ARGSSH_ROOT_PWD=rootRUN/bin/echo"${SSH_ROOT_PWD}”|passwd--stdinroot#publicdefaultARGLOCAL_SSH_KEYRUNif[-n"${LOCAL_SSH_KEY}"];然后\mkdir-p/root/.ssh\&&chmod750/root/.ssh\&&echo${LOCAL_SSH_KEY}>/root/.ssh/authorized_keys\&&sed-is/\"//g/root/.ssh/authorized_keys\&&chmod600/rroot/.ssh/authorized_keys\;fi#暴露端口EXPOSE22EXPOSE80COPYstartup.sh/RUNchmod+x/startup.shWORKDIR/var/wwwCMD/startup.sh创建容器运行脚本startup.sh:#!/bin/bashsource/etc/profile/usr/sbin/sshd-D最后执行构建命令dockerimagebuild。