zoukankan      html  css  js  c++  java
  • Docker初涉

    Docker是什么

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,实现虚拟化。

    Docker的logo

    “The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you.”

    “一只载着一堆集装箱的鲸鱼,正在运向你”

      

    Docker和虚拟机的区别

     docker:一种虚拟化的解决方案,但是和虚拟机是完全不同的虚拟方案

     

     虚拟机:服务器---宿主机OS(内核)--虚拟机管理系统--应用(虚拟化OS内核+各种依赖+app),一般每个应用都会很大,并消耗很多cpu和内存

    docker:服务器---宿主机OS(内核)-- docker engine--虚拟化软件(没有虚拟化内核,直接使用宿主机内核)

    每个bins/libs相当于从服务器中划分出的独立的资源,可以理解成为轻量的虚拟化技术(各种依赖)

    docker engine相当于docker的“服务器”,可以接收并解析、执行docker  命令,可直接与Host OS 进行通信,为每个docker容器分配资源

    虚拟机在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用

    docker是在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用

    Docker的优势

    虚拟机引导、加载操作系统内核是一个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的

    docker由于直接利用宿主机的操作系统,省略了这个过程,因此新建一个docker容器只需要几秒钟

    另外,现代操作系统是复杂的系统,在一台物理机上新增加一个操作系统的资源开销是比较大的,因此,docker对比虚拟机在资源消耗上也占有比较大的优势

    事实上,在一台物理机上我们可以很容易建立成百上千的容器,而只能建立几个虚拟机

    Docker能做什么

    解决虚拟机不方便的场景,在虚拟机的基础上扩展更多的服务

    【搭建测试环境,解决环境不一致的问题】docker是通过镜像启动每个容器,只要镜像是一致的,环境基本就是一样的

    举例:以前,A机器上运行的程序想部署一套到B机器上去,如果采取传统到方式进行文件拷贝等,有可能出现问题,如果采用容器的方式进行运输、部署,就可以避免因环境不一致导致的问题

    【搭建各类基础服务】jenkins、jira等都可以使用docker搭建;有镜像的话 直接去官方下载或者使用别人打好的镜像,直接使用,节省学习成本

    Docker思想

    99%的场景是不挑内核的,所以可以共享宿主机内核

    Docker优缺点

    优点

    1、轻量级:

    虚拟机是虚拟化一个完整的内核,资源开销大,磁盘空间、cpu等要占用很大一部分空间

    docker不需要虚拟化内核,直接共享 宿主机的内存,节省了开销,同样的资源条件,docker可以比虚拟机启动更多的软件

    缺点:

    1、一旦 一个容器把服务器内核搞崩了,那么 所有的容器都崩了(共享 宿主机的缺点)(在一个容器把磁盘/cpu打满,可能就会把服务器搞崩)

    2、一旦某个应用是 挑内核(只能在linux版本 xxx的环境下运行)不能拿docker做后端的兼容测试(OS的兼容测试,有的系统只支持Ubuntu x.x.x系统,docker是共享内核 单独在镜像中的os服务兼容规范的话,没有用的,会使用宿主机内核的)(有些C++ 是挑内核的)


    Docker镜像

    镜像可以简单理解成一个压缩包,这个包中,有你的程序或代码,还有一个文件系统,所谓文件系统,就是打包了一个标准操作系统的所有必须文件,可执行程序、运行库等

    Docker 之所以解决了程序执行环境一致性问题,就是将应用程序和文件系统打包到了一起,程序运行时,从你打包的镜像文件系统中加载依赖

    docker运行容器前,需要本地存在对应的镜像,如果不存在,docker会从镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载

    Docker容器

    可以简单理解镜像是“死的”,是磁盘上储存的“静态的”文件,而容器是运行起来的、内存中的、“动态的”实例

    (容器也不一定是运行着的,容器也能停止)

    通过 docker run 命令可以从一个镜像启动一个容器,一个镜像可以启动无限个容器副本,每个容器还互相隔离,可以将一个个容器理解成一个个虚拟机,每个容器都有自己的 IP、文件系统等等

    启动方式:

    (1)基于镜像新建一个容器并启动

    (2)在终止状态的容器,重新启动

    PS:当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
    1.检查本地是否存在指定的镜像,不存在就从公有仓库下载
    2.利用镜像创建并启动一个容器
    3.分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    5.从地址池配置一个 ip 地址给容器
    6.执行用户指定的应用程序
    7.执行完毕后容器被终止

    Dockerfile

    Dockerfile 是生成镜像的配置文件,该文件中首先声明了镜像的基础镜像,一般情况下,构建镜像需要依赖一个基础镜像

    Dockerfile 中还包含着一些其他信息的声明,比如环境变量、标注需要开放的端口等

     
     
    备份文件

    可以使用docker save命令,将你电脑上生成的镜像导出成 tar 打包文件,然后用来数据备份,或将文件拷贝到其他电脑上,用 docker load 命令导入镜像,实现镜像的分发

    但是,这样操作非常麻烦,尤其是远程传输。请使用镜像仓库来进行统一管理和分发。

     
     
    镜像仓库

    镜像仓库就是一个在线提供镜像存储的服务,使用 docker pull 从镜像仓库中拉取(下载)镜像

    Docker Hub:https://hub.docker.com/search?q=&type=image

     
     

    docker隔离的关键技术(利用的linux的技术)

    1、Namespace(隔离 名称空间)

    2、联合文件系统(构建docker镜像)

    3、Cgroups(隔离资源:cpu、内存等)

     docker共享内核,是不隔离内核的


    Docker命令

    docker pull
    不加版本号的话,默认会拉 latest版本;
    docker镜像基本都是由多层组成,所以拉取镜像也是 分层拉取的
    docker images  
    当前所有镜像
     
    docker rmi <image id>
    删除镜像
    docker run jenkins/jenkins  启动容器
     
    docker run -d   后台运行,以免终端关闭 停止启动容器
     
    docker logs -f ,可以看运行日志

      

    docker run -d --name liuweijianjenkins jenkins/jenkins   以“liuwiejianjenkins"命名 启动jenkins
     
    docker ps
    当前正在运行的 容器列表
    docker stop liuweijianjenkins  停止容器
     
    docker rm liuweijianjenkins   删除容器
    一般都是先停止 ,在删除;也可以强制删除  docker rm -f liuweijianjenkins  
     

     docker run -d --name lwjjenkins  -p 8081:8080 jenkins/jenkins

    -p 8081:8080 通过端口映射的方式做了转发规则,往宿主机8081端口发送请求,docker帮忙把请求转发到8080端口

    docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的

    没有做端口映射

    做了端口映射

    首次进入jenkins需要密码:

    搭建jenkins遇坑:

    1、选择安装的插件,报错No such plugin: cloudbees-folder:

    原因是因为下载的Jenkins.war里没有cloudbees-folder插件,需手动下载到/var/jenkins_home/war/WEB-INF/detached-plugins 路径下

    http://www.mamicode.com/info-detail-2905692.html

     如果下载好,还是报错的话,需要看下启动容器是否报错

    有IO报错,要更新jenkins插件的 更新站点:https://blog.csdn.net/ezreal_tao/article/details/94362654

     
     
     
     
     
     
  • 相关阅读:
    正则二三事
    docker elasticsearch 5.6.13 安装ik分词器
    centos docker 防火墙设置(多个ip之间互相访问)
    ElasticSearch结构化搜索和全文搜索
    Jest — ElasticSearch Java 客户端
    提高redis cluster集群的安全性,增加密码验证
    spring boot 设置 gzip 压缩
    centos 7磁盘空间满了导致redis cluster问题和kafka的问题
    SpringBoot之MySQL数据的丢失的元凶--事务(转)
    mysql mycat 1.6.6.1-release 批量 insert 数据丢失问题(续)
  • 原文地址:https://www.cnblogs.com/lwj-0923/p/12913243.html
Copyright © 2011-2022 走看看