什么Docker
Docker 最早是dotCloud公司的内部项目,它使用 Go 语言进行开发实现的开源容器项目。
Docker 和 VM的区别
• 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+ 。
加速
阿里镜像加速(网易、七牛云等都有)
常用命令
docker 启动、暂停、重启
docker 启动关闭等这里就不演示,像mac os 版本,就普通应用的启动便可。 Centos版本,可以使用
sudo service docker start/stop/restart
查看docker 信息
docker info
获取镜像
列出本地镜像
移除镜像
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
创建镜像通常有三种方式:
- 基于已有的镜像的容器创建
- 基于本地模板导入
- 基于Dockerfile创建
什么是Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Spring boot 项目打镜像
这里主要讲下基于Dockerfile创建,这里用一个很简单是Spring boot项目来演示,
https://github.com/MeYoung/spring_boot_docker
大体步骤:
- 新建一个Spring boot 项目
略
- mvn package 打包
略
- 编写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 文件
- 启动容器并关联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]
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)
测试应用场景
快速构建测试环境
如果公司服务都Docker化,那么刚也看到了要起一个新服务是非常快的,所以可以用来快速构建一套干净的测试环境。
同时也可以避免现每个环境都单独打包部署一次,docker可以一次构建任何环境部署。
搭建测试服务
WebUI自动化 Selenium Grid 的痛点
- 机器资源浪费
- 容器造成Grid服务资源耗尽,宕机
- Grid服务维护麻烦,每次Chrome等版本升级都得逐台Grid升级
docker 化的 Selenium Grid 解决痛点
Demo演示
https://www.yuque.com/miyang.meyoung/automation_web/xg5rhm