前端需要知道的 Docker

278 阅读7分钟

0.背景

0.1 虚拟机与docker

虚拟机和docker两者的一致性在于他们的目的相同:将编好的应用程序及其对应依赖放在一个可以在任何环境运行的单元中,容器和虚拟机消除了对物理硬件的需求 两者的区别在于他们的实现架构不同

(1)VM 虚拟机

虚拟机是在物理计算机的基础上,独立构建出一套具有相同完整计算机体系的虚拟环境(包括:CPU、内存、网络接口、存储器)。虚拟机允许一台物理机上运行多个操作系统,比如在windows电脑中运行linux系统

(2)Docker

image.png 容器的本质是在隔离环境运行的进程,这个隔离的环境有自己的系统目录文件,有自己的ip地址,主机名等。镜像就像.exe安装包,解压之后就是应用程序。
容器由两部分组成:1.应用程序本身; 2.应用程序的依赖(例如:程序运行所需要的组件库或软件) 容器的运行空间:容器是在宿主系统的用户空间中运行,与操作系统的其他进程隔离(和虚拟机的最大区别)

容器和虚拟机的对比

相同点:都是为应用提供封装和隔离的
区别:虚拟机要打包内核和虚拟硬件。而容器只打包用户空间,所以容器之间是共享主机系统的内核的。换句话说就是,虚拟机技术(VMware),目标是创建完整的虚拟机,即除了要安装自身的程序和程序的依赖之外,还要安装整个操作系统。但是容器不需要安装操作系统,而是共享宿主的操作系统,只安装自身程序和依赖即可。这也是docker易迁移、启动快的原因。

image.png

如果看的不清楚,还有另一个对比图: image.png 最下面一层是服务器,硬件,往上一层是host OS,Linux操作系统,再往上,传统的有一个Hypervisor,就比如KVM,需要安装一个KVM的服务来驱动虚拟化,docker需要安装一个docker的服务,第三层是类似的,再往上就不一样了,docker不需要安装客户虚拟机,而传统的安装完KVM以后还需要新建虚拟机,在这个虚拟机上再去安装一个操作系统。
Docker也叫容器虚拟化,因为少了一层操作系统,所以也是轻量虚拟化。 www.cnblogs.com/supersnowya…

0.2 为什么需要容器

在谈论为什么使用容器之前,先看一下之前为什么用不着容器。之前的系统,几乎所有的系统均采用三层架构就可以很好的解决使用需求。而当今的系统,需要使用更多的服务,比如MQ、缓存、数据库来构建和组装应用。而且应用程序很可能被部署到不同的环境,比如虚拟服务器、私有云、公有云上。

  这里有一篇很好的例子来解释为什么需要docker?juejin.cn/post/705030…
场景一: image.png 场景二: image.png 对于上述两个场景,历史的解决方案是使用虚拟机,但是虚拟机最大的问题就是启动慢、损耗大,因为需要在虚拟机上安装每个项目下所需的操作系统,启动的时候先启动操作系统,然后再启动项目,十分浪费时间。 使用Docker解决上述问题: image.png   所以,对于当今系统一方面应用中包含了多种服务,这些服务有自己所依赖的组件库或软件包;另一方面存在多种部署环境,应用在运行时可能需要动态迁移到不同的环境中,如何保证各个服务能够在各种环境中正常运行就是一个很难解决的问题。使用容器的原因就是:容器使软件具备了超强的可移植能力

容器的特性图
image.png

注意点1:容器打包的内容只有两个:运行的程序及其依赖。容器对于硬件要求:可以无修改的运行在虚拟机、物理机、私有云、公有云上。
注意点2: 对于开发人员,容器意味着环境隔离和移植使用。对于运维人员来说,容器意味着要配置容器需要的标准运行环境,这样服务器就可以运行任何容器。

0.3 目前的容器生态

www.cnblogs.com/supersnowya…

0.4 docker的安装与启动

step1: mac系统可以通过mac专门的包/软件管理器homeBrew来下载(第一次在根目录下报错,后面切换到desktop中执行install命令可以下载成功):
brew install --cask --appdir=/Applications docker image.png step2: 授权 image.png image.png step3: 查看docker是否安装成功-终端中输入docker --version查看是否安装成功 blog.csdn.net/gongzi_9/ar…
step4: 启动docker- 这个时候打开docker的桌面快捷方式,就相当于启动了docker 这里注意一下:如果我们在运行docker images或者docker ps的时候,出现如下报错(www.cnblogs.com/jas0203/p/1… Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。这个时候可以重新打开打开docker的桌面快捷方式,就可以啦~

学习目标

  • 初阶: 了解 docker 常见操作,如构建镜像、运行容器、进入容器执行命令
  • 高阶: docker 原理,如何模拟 docker 隔离环境及限制资源
  • 面试: Dockerfile、Image、Container 的区别

1. docker 基本知识点

1.1 Docker的组成

Docker主机(Host):
服务器
客户端
仓库
镜像
容器
www.cnblogs.com/yinzhengjie…

1.2.Docker的生命周期

1.3.常见的Docker命令

(1) Docker 运行相关命令

通过docker来获取特定镜像 比如当我们要部署vue项目的时候,那么我们需要提前拉去node的镜像和nginx的镜像,对应的命令如下:

 docker pull node:14 
 docker pull nginx // 如果不指定版本后就是下载最新的,此时nginx就是最新的版本

下载好了之后可以通过docker images命令,查看本地的镜像,如下,tag中nginx是最新的lastes版本,但是node因为指定版本是14。 image.png

(2) dockerFile文件相关命令

命令集合

  • FROM:基于一个基础镜像来修改
  • WORKDIR:指定当前工作目录
  • COPY:把容器外的内容复制到容器内
  • EXPOSE:声明当前容器要访问的网络端口,比如这里起服务会用到 8080
  • RUN:在容器内执行命令
  • CMD:容器启动的时候执行的命令
// 以下是dockerfile中的
FROM nginx  
COPY dist/ /usr/share/nginx/html/  
COPY default.conf /etc/nginx/conf.d/default.conf 

创建容器命令解析

docker run --name myNginx -p 8001:80 -d nginx
// 1.docker run: 创建并运行一个容器
// --name myNginx: 给容器起一个名字,值为myNginx
// -p 命令: 将宿主机端口与容器端口映射,冒号左边是宿主机端口8001,冒号右边是容器端口80
// -d 命令: 后台运行容器
// nginx

1.4.Docker实现隔离原理

docker中容器通过linux namespace、cgroup特性实现资源的隔离与限制juejin.cn/post/698721… 3.demo:
安装docker juejin.cn/post/684490…
使用docker启动一个vue项目
4.前端项目中如何使用docker: juejin.cn/post/715766…
4.1 dockerFile文件解析:juejin.cn/post/716097…
5.docker在CI/CD中的应用
juejin.cn/post/715766…

2. Demo: 部署vue项目

参考文献: 1.www.cnblogs.com/newcapecjmc… 2.www.cnblogs.com/zouzou-busy…

3. 通过Docker实现CICD

相关问题

如下图一个宿主机运行了N个容器,多个容器带来的以下问题怎么解决:
    1>.怎么样保证每个容器都有不同的文件系统并且能互不影响?
    2>.一个docker主进程内的各个容器都是其子进程,那么如何实现同一个主进程下不同类型的子进程的隔离?各个进程间通信能相互访问(内存数据)吗?
    3>.同一个宿主机每个容器怎么解决IP及端口分配的问题?
    4>.同一个宿主机多个容器的主机名能一样吗?
    5>.同一个宿主机每个容器都要不要有root用户?怎么解决账户重名问题?
以上问题怎么解决?
  详情请参考:https://www.cnblogs.com/yinzhengjie/p/12183066.html

重点参考文献:zhuanlan.zhihu.com/p/446646193