乐趣区

关于工程化:全栈工程化实战之一容器化和基础环境

一、容器技术(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:7

MAINTAINER xuhui120 <xuhui120@xxx.com>


# 装置依赖、ssh
RUN 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 root
ARG NODE_VERSION=12.9.1
RUN 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=root
RUN /bin/echo "${SSH_ROOT_PWD}" | passwd --stdin root


# 免明码登录
ARG LOCAL_SSH_KEY
RUN 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 22
EXPOSE 80

COPY startup.sh /
RUN chmod +x /startup.sh

WORKDIR /var/www

CMD /startup.sh

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

#!/bin/bash

source /etc/profile

/usr/sbin/sshd -D

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

退出移动版