什么Docker

Docker 最早是dotCloud公司的内部项目,它使用 Go 语言进行开发实现的开源容器项目。

Docker 和 VM的区别

image.png
image.png
• Hypervisor虚拟机管理系统:利用Hypervisor可以在主操作系统之上运行多个不同的从操作系统
• Guest OS从操作系统:运行在虚拟机里面的操作系统,可以是Windows、Linux等
• Docker Engine:Docker守护进程替代Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器

总的来说 Docker 和 VM 虚拟化方式的不同,VM是在硬件层面上的虚拟化,docker在操作系统层面上实现虚拟化,直接复用了主机的操作系统。因此容器要比传统虚拟机更为轻便。

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
资源利用 更高效 高效
系统支持量 单机支持上千个容器 一般几十个
一致的运行环境 容易 较难

等等 更容易迁移、维护、扩展等等。

使用Docker

基本概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期。

镜像

简单说镜像就是一个只读的模板。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了用户需要的其它应用程序,这个跟我们以前 Ghost 系统镜像类似,我们通过Ghost系统镜像来还原创建一个系统。
Docker 镜像可以类似理解,但是Docker的镜像目的是用来创建 Docker 容器。

容器

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。
容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
容器的存储层的生命周期和容器一样,所以一旦容器被删除,那么存储在容器内的信息都会被删除。当然如果不想一些重要信息如数据库的数据信息,不想因为容器删除而消失,我们可以把他挂载到主机目录上。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库

构建镜像后,如果需要放到N台服务器使用,如果靠拷贝到一台一台服务上,势必是非繁琐的事情,所以仓库它就一个可以集中存储镜像和分发镜像的服务。如果再不好理解,想想Apple的 APP Store ,安卓各种应用商店,maven 仓库,都是一样一样的东西,就是存放的东西不一样而已。
那像Maven 有公共(中央)仓库,私服仓库,docker一样也都有,官方的就是 Docker Hub,最早叫Docker Store,可以自己注册账号上传公开镜像。
当然使用公开镜像时也得注意,之前看到过一篇文章,docker 镜像存在挖矿程序,而且这个镜像被下载了500W+次,这个跟迅雷在你机器上挖矿一样一样的可恶。
除了中央仓库,docker同样有私服仓库,私服的搭建可以使用开源的 harbor 来搭建。

安装

目前Docker 分Docker-CE 和Docker-EE 两个版本,ce开源免费,ee是闭源商业版本。 那平时个人使用是ce版本而且一般安装稳定版本如19.03.12,支持win 10 ,mac os,各大Linux 发行版。因为我只再Mac 和 Centos 安装过,Mac安装就跟普通软件安装没啥特别,但是Centos 安装需要注意,虽然官方说支持Centos 6.5+,但是谁用谁知道,我建议还是还是的Centos 7+ 。

加速

阿里镜像加速(网易、七牛云等都有)
image.png

常用命令

docker 启动、暂停、重启

docker 启动关闭等这里就不演示,像mac os 版本,就普通应用的启动便可。 Centos版本,可以使用

  1. sudo service docker start/stop/restart

查看docker 信息

docker info

获取镜像

docker pull 镜像名

列出本地镜像

docker images

移除镜像

docker rmi 镜像
其中镜像可以是 镜像ID(长短都可以) 也可以是镜像名
如果镜像被运行,也就是创建了对应容器,则要删除容器才能删除对应的镜像

新建并启动容器

docker run

docker run --name mysql5.7 -p 13306:3306 -v /Users/meyoung/Documents/docker/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.25
  • —name 给启动的容器设置名字
  • -p 指定本地端口映射容器端口 主机端口:容器端口 -P就是 容器内部段鸥随机映射到主机端口
  • -v 绑定一个卷也即是容器文件挂载到主机硬盘 主机地址:容器内地址。好处是啥
  • -e 设置环境变量,例子中设置的 mysql的root账号的密码
  • -d 后台运行,并返回容器ID
  • mysql:5.7.25 镜像名:tag号,不写tag号就默认用latest
  • —restart=always 容器随docker启动

    启动容器

    如果一个镜像被新建过容器,那么下次不再需要又一次新建这个容器,只需要启动这个容器。

docker start 容器ID

查看所有容器

docker ps -a

查看已经启动的容器

docker ps

关闭容器

docker stop 容器ID

删除容器

docker rm 容器ID
注意的是容器被删除,那么存储在容器内的信息都会被删除,除非挂载到本地磁盘。

Dockerfile

创建镜像通常有三种方式:

  1. 基于已有的镜像的容器创建
  2. 基于本地模板导入
  3. 基于Dockerfile创建

什么是Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

Spring boot 项目打镜像

这里主要讲下基于Dockerfile创建,这里用一个很简单是Spring boot项目来演示,
https://github.com/MeYoung/spring_boot_docker
大体步骤:

  1. 新建一个Spring boot 项目

  1. mvn package 打包

  1. 编写Dockerfile ```shell

    FROM 定制的镜像都是基于XXX的镜像,例如基于jdk 1.8

    FROM java:8

    定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

    作用:

    避免重要的数据,因容器重启而丢失,这是非常致命的。

    避免容器不断变大。

    VOLUME /tmp

    端口申明 方便使用者映射

    EXPOSE 8091

    复制文件或者目录到容器里指定路径

    COPY tz-docker-demo.jar tz-docker-demo.jar

    用于运行指令

    ENTRYPOINT [“java”,”-jar”,”tz-docker-demo.jar”]

其它指令 如CMD RUN ENV(设置环境变量给后续指令使用)


4. 创建镜像:
```shell
docker build -t docker_demo:1.0 .
  • -t : —tag 后面跟镜像名和tag 名
  • docker_demo 设置的镜像名
  • 1.0 设置的tag
  • . 表示当前目录的Dockerfile 文件


  1. 启动容器并关联mysql容器:
    docker run --rm -p 8091:8091 --name demo  --link mysql5.7:mysql-docker docker_demo:1.0
    
  • —rm 容器结束时,直接删除容器(可选)
  • —link 链接其它容器,这里链接了mysql的容器
  • mysql5.7 容器名
  • mysql-docker 参数别名,这里和spring boot mysql地址配置一样
  • docker_demo:1.0 刚创建的镜像名和tag

登录容器

docker login

docker login host
host为私服仓库
然后输入账号密码

上传镜像

docker push xxx/项目名/IMAGES[:TAG]

image.png

Docker-compose

上面我们知道通过Dockerfile 可以方便的定义一个单独的应用容器,然后日常工作我们经常是需要多个容器配合来完成服务搭建,例如刚Spring boot 项目,除了自身的web服务容器外,还需要加上mysql等等,如果都通过 docker run 指令来运行,势必命令会特别长,而且不方便。

Compose 恰好就可以满足这个需求。Compose项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,通过 Compose,我们可以使用 docker-compose.yml 文件来编排应用程序需要的所有服务。然后,使用一个命令,就可以从 yml 文件配置中创建并启动所有服务。
简单说 docker-compose 在我理解就是docker的自动化 ,把繁琐的docker操作命令配置到yml文件,然后一条命令自动化完成。

安装

略 python 编写可以用pip 安装。 mac 和 win 桌面版已经自带有,不需要单独安装。

场景案例

刚web站点,除了需要web应用还需要mysql数据库。

version: '3'
services:
  mysql-docker:
    image: mysql:5.7.25
    container_name: mysql_demo
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "13306:3306"
    volumes:
      - /Users/meyoung/Documents/docker/MySQL/data:/var/lib/mysql

  spring-boot-demo:
    image: spring-boot-demo
    container_name: spring_demo
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - mysql-docker
    ports:
      - "8092:8091"

https://docs.docker.com/compose/compose-file/

K8S(Rancher)

http://10.104.130.97/login
image.png
image.png

测试应用场景

快速构建测试环境

如果公司服务都Docker化,那么刚也看到了要起一个新服务是非常快的,所以可以用来快速构建一套干净的测试环境。
同时也可以避免现每个环境都单独打包部署一次,docker可以一次构建任何环境部署。

搭建测试服务

WebUI自动化 Selenium Grid 的痛点

  1. 机器资源浪费
  2. 容器造成Grid服务资源耗尽,宕机
  3. Grid服务维护麻烦,每次Chrome等版本升级都得逐台Grid升级

docker 化的 Selenium Grid 解决痛点
Demo演示
https://www.yuque.com/miyang.meyoung/automation_web/xg5rhm