1 概述
-
Go语言编写的开源的应用容器引擎,是容器技术的代表;可移植;采用沙箱机制-线程资源隔离;将应用及依赖打包到该容器中,便可发布到任何Linux服务器上,可实现虚拟化
-
口号1:build创建,ship运输,run运行;口号2:build once,run anywhere创建一次,到处运行
-
类比解释:
-
Docker容器为口袋;放入文件并系封口袋(只读)的过程为创建镜像build
-
仓库docker hub,用于存放各式各样的口袋;口袋的复制并获取自用,为镜像运输ship;源口袋中的文件统称镜像文件,复制出的口袋成为容器;一个镜像可复制任意个容器
-
解开口袋(可写)并运行里面的软件文件,为run
-
整个过程谁都可操作,可移植,不必关心底层实现;Docker将任何应用程序及其依赖打包成轻量级、可移植、自给自足的标准化容器Container(集装箱)
-
快:运行时性能极大提升,管理操作(启动,停止,开始,重启等)常达到秒或毫秒级
-
成本低:占用硬件资源少
-
资源隔离,安全性高:利用Llinux kernel的资源分配机制CGroup和核心命名空间namespace技术进行资源隔离,容器中的环境和主机运行环境互不干扰,容器崩溃不影响主机
-
版本控制:Docker通过镜像文件进行分发,每个镜像文件可标注自己的tag来辨别版本
-
环境统一:统一各种运行时环境、运行时库、各种构建工具、软件版本等
-
获取便利:镜像仓库包含众多镜像文件,拉取方便(不过国内一般不连接docker hub镜像源)
-
-
对比虚拟机:
-
服务器演变过程:
-
物理机时代:部署慢,每台服务器都要安装操作系统,配置应用所需环境;资源浪费,硬件利用率低;物理服务器成本高,价格贵;扩展和迁移笨拙,需重新复刻整套环境
-
虚拟机时代:解决物理机服务器的缺点;但每个VM都需要安装操作系统
-
容器时代:解决虚拟机服务器的缺点
-
特性 虚拟机 容器 隔离级别 操作系统级别 进程级别 隔离策略 Hypervisor CGroups 系统资源 5-15% 0-5% 启动时间 分钟级 秒级 镜像存储 GB-TB KB-MB 集群规模; 上百 上万 高可用策略 备份、容灾、迁移 弹性、负载、动态 -
容器是应用层抽象,用于将代码和依赖资源打包为一体;多个容器可运行在一个机器上,共享操作系统内核,而又在各自独立的进程中运行
-
VM是物理硬件层抽象,用于将一台服务器变成多态服务器;管理程序运行多个VM在一台机器上,每个VM都包含整套操作系统和应用
-
2 安装
-
构成:
-
镜像image:模板;以该模板创建N个容器服务,来提供服务;如tomcat镜像 ==》 run ==》 tomcat1-N个容器
-
容器container:容器技术运行和管理由镜像创建的N个容器,包括容器的启动,停止,删除等
-
仓库repository:存放镜像
-
-
环境:Linux服务器并且能连接和登录;命令cat /etc/os-release可以查看环境信息和配置
-
安装文档参考:在Linux服务器上跟着官网文档:Docker Documentation | Docker Documentation步骤及其命令操作
-
卸载旧版本 ==》 选择合适的安装方式 ==》 设置镜像仓库(最好选用国内的镜像仓库) ==》 下载Docker引擎(推荐ce社区版;可选择指定版本进行安装或更行) ==》 启动Docker(docker version检查是否安装成功;run运行hello-world镜像) ==》 查看镜像 ==》 卸载
-
可选:阿里云镜像加速:登录阿里云网站,找到镜像加速器,根据文档配置使用
-
-
可视化工具:portainer、Rancher
3 原理与使用
-
run运行镜像:Docker在本机寻找镜像,无则从设置的镜像仓库pull;pull失败则报错,成功则启动运行
-
Docker:传统CS(Client-Server)结构系统,基于Socket从客户端访问服务器
-
Docker镜像加载原理:镜像由联合文件系统UnionFS组成;RootFS信息可看到所有的层(在pull时显示的进度,每一行就是在pull一层,显示Already exists的说明已经存在,可以公用)
-
Docker命令:命令帮助文档参考官方:https://docs.docker.com/engine/reference;强迫自己查看英文文档!!!列举几个重要命令:
-
镜像命令:参考:https://docs.docker.com/engine/reference/images
-
docker image --help
-
docker images:查看本地存在的镜像,包括:REPOSITORY镜像的仓库源,TAG镜像标签,IMAGE ID镜像ID,CREATED创建时间,SIZE大小;命令可选项:-a查看所有,-q只显示IMAGE ID
-
docker search 镜像名:搜索仓库中的镜像,如docker search mysql;可选项:--filter按照条件搜索
-
docker pull 镜像名:[TAG]:下载镜像;可选项:tag指定下载版本(官网可查的支持的版本),否则默认latest最新版;下载采用分层下载(查询到存在的层,因为公用而不必重复下载),联合文件系统
-
docker rmi []:通过镜像名或ID删除镜像,指定列表批量删除;-f强制删除
-
-
容器命令:
-
docker run --help:--name容器名,-d后台方式运行(启动后如果没有前台进程,docker认为没有服务,ps查看到此容器已关闭),-it交互方式运行(可进入容器内查看可操作即前台进程),-p对外暴露指定端口如3305:3306即容器中MySQL的3306映射到本地的3305;-e环境配置如配置MySQL启动密码;其他
-
docker run 镜像名:创建并启动容器;如docker run -it mysql /bin/bash,创建容器并启动后进入容器的bin目录;exit停止容器并退出;快捷键ctrl+p+q仅退出容器
-
docker ps:在运行的容器列表;-a列出所有容器,-n=?最近创建的容器,-q只显示容器编号
-
docker rm 容器ID:删除未运行的容器;docker rm -f $(docker ps -aq)强制删除所有查询到的容器
-
docker start/restart/stop/kill 容器ID:启停
-
docker exec -it 容器ID:进入在运行的容器,开启了新的终端,所以可进行操作;docker attach 容器ID:进入容器但还是原来的终端
-
-
其他:
-
docker logs [--help]:
-
docker top 容器ID:容器内进程信息
-
docker inspect 容器ID:容器元数据详细信息;包括RootFS信息
-
其他常用操作命令,如docker cp复制
-
docker commit:提交容器使之成为一个新个副本;docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名: [TAG]
-
-
4 容器数据卷
-
应用和环境被打包成镜像,而如果数据也存在于容器中,删除容器时数据丢失;所以数据需要持久化,容器之间需要有数据共享技术,将容器中产生的数据,同步到本地,即卷技术,目录的挂载,将容器内目录挂载到Linux上指定路径下,建立映射关系;数据会双向绑定,即使容器停止,挂载卷中修改后,将容器启动也会查看到数据变化;所以各种操作如配置文件,都可以在本地修改而不必进入容器
-
数据券容器:将挂载卷设置到另一个容器上,实现这两个容器的数据共享/备份
-
命令方式挂载:docker run -it --name 卷名 -v 主机目录:容器内目录;ocker inspect 容器ID命令的Mounts信息下可看到挂载信息如挂载目录;可再接:ro设置只读,:rw读写权限
-
匿名挂载:省略主机目录的指定;指定了目录则为具名挂载;所有匿名挂载的卷都可在/var/lib/docker/volumes下可查看
-
docker volume ls:查看所有卷;docker volume inspect 卷名
5 DockerFile
-
DockerFile:用来构建docker镜像的构建文件,如生成自定义镜像并进行卷挂载,是一组命令脚本;一条命令对应镜像的一层
-
构建步骤:
-
编写文件:使用Dockerfile命令;
-
FROM 基础镜像名(DockerHub中常见镜像,使用的基础进项一般都是FROM scratch)
-
MAINTAINER:作者
-
RUN:镜像构建时需要运行的命令
-
ADD:需要添加的资源,如Tomcat(提供压缩包,会自动解压)
-
WORKDIR:镜像的工作目录
-
VOLUME:挂载目录
-
EXPORS:暴露端口
-
CMD:容器启动时需要运行的命令;多个CMD只有最后一个生效
-
ENTRYPOINT:容器启动时需要运行的命令;多个命令则命令追加,如先写了ls -a命令,再写一个l,最终命令为ls -al
-
ONBUILD:
-
COPY:类似ADD,将文件复制到镜像中
-
ENV:设置环境变量
# 改版centos镜像,官方centos镜像构建文件可百度 FROM centos MAINTAINER userName<abc.@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH # 打印信息 CMD echo "===end===" CMD /bin/bash # 自定义tomcat镜像 ... ADD jdk-....x64.tar.gz /usr/local # 需要依赖jdk ADD apache-tomcat-9.tar.gz /usr/local # 需要依赖tomcat ENV JAVA_HOME /usr/local/jdk... ENV CLASSPATH $JAVA_HOME/lib... ...
-
-
buildg构建使之成为镜像(之前传统方式是提供项目的jar/war包,而通过Docker部署则是提供构建的镜像):在文件所在目录下执行:docker -f 构建文件名 -t 镜像名:TAG .;可以使用官方默认命名文件名Dockerfile,以自动找到构建文件
-
run运行镜像:
-
push发布镜像到仓库:
-
docker history 镜像ID:查看镜像的生成过程
-
6 Docker网络
-
容器内与外的通信机制;安装了docker的服务器,默认成为docker0
-
ip addr:查看所有网关;docker exec -it 容器名 ip addr:查看docker为容器分配的网关IP地址;ping该IP可联通
-
......
7 Docker Compose
-
容器编排:批量处理容器,轻松、高效的定义、运行和管理容器
-
下载安装compose,参考官网
-
编写docker-compose.yaml文件:
version: # 与docker对应的版本 services: # 应用服务列表及其配置,如web,mysql,redis...;具体有的配置参考官网 web: . build: ports: - "3306":33060" volumes: - .:/code - logloume01:/var/log links: - redis redis: image: redis # 其他配置,如挂载卷,网络,全局规则 volumes: networks: configs:
-
在yaml文件目录下构建和运行与停止所有服务:docker-compose up/down .
8 Docker Swarm
-
集群方式部署