一、容器技术(Container)

在虚拟机(VMware)呈现以前,利用的部署因为依赖问题,往往新利用要部署在独立的服务器上,导致硬件资源利用率低下,VMware的呈现完满的解决了这个问题。

然而,VMware也存在有余,首先VMware实际上是虚构独立的OS,这须要额定的CPU、RAM和存储资源;其次,因为虚拟机是独立的OS,因而启动比较慢;最初,对于独立的OS,须要独自的补丁&监控,对于商业利用还须要零碎的受权许可。

基于以上起因,以google为代表的大型互联网公司始终在摸索以容器技术代替虚拟机模型的毛病。

在虚拟机模型中,Hypervisor是硬件虚拟化(Hardware Virtualization)—将硬件资源划分为虚构资源打包进VM的软件结构中,而容器模型则是操作系统虚拟化(OS Virtualization)

容器共享宿主机OS,实现过程级别的隔离,绝对于虚拟机,容器启动快、资源耗费低、便于迁徙

1.1 Linux容器

古代容器技术起源于Linux,依赖的核心技术包含内核命名空间(Kernel Namespace)、控制组(Control Group)、联结文件系统(Union File System)

  • Kernel Namespace

    负责隔离

容器技术的复杂性使其难于推广,晓得Docker的呈现,Docker使得容器技术的应用变得简略。

目前还没有Mac容器,windows平台win10和win server2016曾经反对windows容器。

留神,因为容器是共享宿主机操作系统的,因而windows容器是不能运行在Linux零碎的,但Docker for Mac和Docker for Windows 通过启动一个轻量的Linux VM来反对Linux容器

在windows中,零碎必须是64位windows 10且开启Hyper-V和容器个性。

1.2 Docker装置

略,Mac装置参考这里,windows装置参考这里。

1.3 基本概念

1.3.1 docker引擎架构

装置胜利后,执行docker version输入相似上面的内容:

  • Docker daemon

    • 镜像治理、镜像构建、API、身份验证、外围网络等。

    晚期的Docker引擎只蕴含LXC和daemon,daemon则耦合了客户端、API、运行时、镜像构建等性能,拆解后的daemon的外围性能聚焦在镜像构建治理和API。

  • containerd

    • 封装容器的执行逻辑,负责容器的生命周期治理。
  • shim

    • 用于将运行中的容器和daemon解耦(daemon可独立降级)
    • 放弃所有的STDIN和STDOUT流开启状态
    • 将容器退出状态同步给daemon
  • runc(容器运行时)

    • OCI容器运行时的标准参考实现(因而也称OCI层)
    • 轻量级的Lincontainer包装命令行交互工具
    • 惟一作用是创立容器
1.3.2 镜像

镜像是由多个层组成的,蕴含一个精简的OS和利用和依赖包的独立对象。镜像存储于镜像仓库官网镜像仓库服务。

能够通过命令docker image pull 镜像名拉取镜像,一个残缺的镜像名如下:

<ImageRegistryDomain/><UserId/>:repository:<tag>

  • 相干操作

    • 拉取镜像docker image pull repository:tag
    • 查看本地镜像docker image ls
    • 查看镜像详细信息docker image inspect repository:tag
    • 删除镜像docker image rm repository:tag(留神,存在运行容器的镜像不能删除)
  • 构建镜像的形式

    • 通过运行中的容器构建docker container commit
    • 通过Dockerfile文件
1.3.3 容器

容器是镜像的运行时实例。

  • 运行容器

    $ docker container run [OPIONS] <IMAGE> <APP>

    留神,对于linux容器,容器中默认只运行app对应的过程,如果app过程退出,容器也就退出了,即kill掉容器中的主过程,也就kill掉容器

    通过Ctr-PQ组合键能够退出容器回到宿主机并保留容器后盾运行,这个时候能够通过docker container exec -it <containerId> bash再次进入容器。

    因为运行容器的参数相当简单,比方端口映射、挂载磁盘、设置环境变量、设置网络等等,尤其在运行多容器时更繁琐,因而个别都通过Docker Compose这个工具来编排和治理容器。新版的Docker中默认已装置了Docker Compose。

  • 查看运行的容器

    $ docker cotainer ls [-a]$ docker ps [-a]
  • 启动或进行容器

    $ docker container start <containerId>$ docker container stop <containerId>

二、容器化的意义

2.1 对立开发环境

2.2 自动化测试

2.3 部署(CI)

容器即利用。

三、制作根底环境(镜像)

3.1 容器化(Containerizing)

将利用整合到容器运行的过程称为容器化。

容器化的个别步骤:

  • 利用代码开发
  • 创立Dockerfile
  • 在Dockerfile上下文执行docker image build
  • 启动容器

上面正式进入正题,通过容器化的形式定制一个全栈开发根底环境。

3.2 定制开发镜像

3.2.1 环境要求
  • CentOS7.x
  • gcc
    gcc-c++
    pcre-devel
    openssl-devel
    make
    perl
    zlib
    zlib-devel
  • vim/openssh-server
  • NodeJS 12.9.1
  • 设置npm registory为团队公有仓库
  • 挂载我的项目目录
  • 裸露80、22端口

3.2.1 编制Dockerfile

FROM centos:7MAINTAINER xuhui120 <xuhui120@xxx.com># 装置依赖、sshRUN yum -y install \  gcc \  gcc-c++ \  pcre-devel \  openssl-devel  \  make \  perl \  zlib \  vim \  zlib-devel \  openssh-server \  && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \  && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key \  && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key \  && /bin/sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config \  && /bin/sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config \  && /bin/sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \  && /bin/echo "cd /var/www" >> /root/.bashrc######################## 装置node#######################USER rootARG NODE_VERSION=12.9.1RUN cd /usr/local/src \    && curl -O -s https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz \    && mkdir -p /usr/local/nodejs \    && tar zxf node-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/ \    && npm config set registry http://registry.xxx.com \    && cd /usr/local/src \    && rm -rf *.tar.gz# 批改root明码ARG SSH_ROOT_PWD=rootRUN /bin/echo "${SSH_ROOT_PWD}" | passwd --stdin root# 免明码登录ARG LOCAL_SSH_KEYRUN if [ -n "${LOCAL_SSH_KEY}" ]; then \    mkdir -p /root/.ssh \    && chmod 750 /root/.ssh \    && echo ${LOCAL_SSH_KEY} > /root/.ssh/authorized_keys \    && sed -i s/\"//g /root/.ssh/authorized_keys \    && chmod 600 /root/.ssh/authorized_keys \;fi# 裸露端口EXPOSE 22EXPOSE 80COPY startup.sh /RUN chmod +x /startup.shWORKDIR /var/wwwCMD /startup.sh

创立容器运行脚本startup.sh:

#!/bin/bashsource /etc/profile/usr/sbin/sshd -D

最初执行构建命令docker image build .