Docker:应用容器引擎
主要内容
1.Docker简介
2.Docker安装与启动
3.镜像加速器配置
4.Docker镜像操作
5.Docker容器操作
6.DockerFile
7.推送镜像到阿里云及本地仓库
8.Docker容器生命周期
9.Docker数据管理
一.Docker简介
1.什么是Docker
Docker是基于Go语言实现的开源容器项目.利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化(通俗解释:Docker内嵌极小型系统,例如Linux只有5M多,windows也是).它是内核级的虚拟化.期望达到使项目运行环境"一次封装,到处运行的目的"
在Docker里面可以设置使用Windows还是Linux系统,默认是用Linux系统,基于Ubuntu的,只有5M多,包含了最基本功能
利用docker创建的运行环境叫做docker容器,容器是通过docker镜像创建的,docker镜像文件可以放在私有仓库中也可以放在共有仓库中
官网地址:https://www.docker.com
总结:
学习Docker主要做两件事情:
1.在Docker安装软件
2.把项目不好到Docker
2.Docker和VM对比
Docker和VM(虚拟机)的功能特别像.下面对比了两者区别
2.1结构区别
2.2应用区别
Docker:面向内核,软件,docker是秒级别的
虚拟机:面向硬件的,分钟级别
3.Docker特点
3.1效率高
用户只需要几分钟,就可以把自己的程序"Docker化".Docker依赖于"写时复制"(copy-on-write)模型,是修改应用程序也非常迅速,可以说达到"随心所欲,代码即改"的境界.
随后,就可以创建容器来运行应用程序了.大多数Docker容器只需要不到1秒中即可启动.由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源
3.2职责明确
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员需要关心如何管理容器.Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性.从而降低那种"开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后处理问题就归结为肯定是运维的问题)"
3.3结构完整
Docker的目标之一就是缩短代码从开发,测试到部署,上限运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的key直接将该大盒子拿走,而不需要从该盒子中一件件的取)
3.4契合微服务架构
Docker还鼓励面向服务的体系结构和微服务架构.Docker推荐单个容器值运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性.(可以在一个容器中运行多个应用程序)
4.Docker架构(重点)
4.1Docker daemon(Docker守护进程)
Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程.我们可以通过Docker客户端与之通信
4.2Client(Docker客户端)
Docker客户端是Docker的用户界面,它可以接受用户命令的配置标识,并与Docker daemon通信.图中,docker build等都是Docker的相关命令
4.3Images(Docker镜像)
Docker镜像是一个只读模板,它包含创建Docker容器的说明
和虚拟机中快照是类似的.在虚拟机汇总根据快照克隆一台虚拟机
在Docker中根据Images创建容器
4.4Container(容器)
容器是镜像的可运行实例
容器就相当于VMware中每一个克隆出来的虚拟机.但是容器要比虚拟机体积小很多
4.5Registry(仓库)
Docker Registry是一个集中存储于分发镜像的服务.我们构建完Docker镜像后,就可以在当前宿主机上运行.但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝.此时,我们可借助Docker Registry来避免镜像的手动拷贝
一个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像.这跟Maven的仓库优点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号
二.Docker安装与启动
Docker有windows和linux版本.已安装在Linux上进行演示的
以下安装步骤基于CentOS8,并确保该虚拟机可以连接外网
1.安装
1.1.下载docker-ce repo
为本地yum提供远程repo信息
curl https://download.docker.com/linux/centos/docker-ce.repo -o/etc/yum.rep.os.d/docker-ce.repo
1.2安装依赖
yum install -y https://download.docker.com/linux/fedors/3.0/x86_64/stable/PACKAGES/CONTAINERD.IO-1.2.6-3.3.FC30.x86_64rpm
1.3安装docker-ce
yum install -y docker-ce
2.启动
2.1启动命令
systemctl start docker
2.2查看Docker状态
docker info
结果如下:
三.镜像加速器配置
默认情况下Docker从Docker Hub上下载镜像资源,单速度很慢,可以通过配置国内的镜像加速器来解决
本次使用阿里云镜像加速器为例
1.访问阿里云
https://www.aliyun.com/
2.登录
登录自己的账号
3.进入容器镜像服务
4.进入控制管理台
5.进入镜像加速器
6.选择对应的OS并配置
把配置镜像加速器里面所有命令执行一遍
注意:
第2到第6行是一个命令,需要赋值这5行一起执行
7.验证镜像加速器配置
通过docker info命令验证镜像加速器配置,结果如下
四.Docker镜像操作
1.什么是Docker镜像
Docker镜像是由文件系统叠加而成(是一种文件的存储形式).最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统.Docker用户几乎永远不会和引导系统有什么交互.实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用.Docker容器启动是需要一些文件的,而这些问阿金就可以称为Docker镜像
2.列出镜像
列出docker下的所有镜像,命令:docker images
结果解释:
REPOSITORY:镜像所在的仓库名称
TAG:镜像标签(其实就是版本)
IMAGE ID:镜像ID
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
3.搜索镜像
可使用命令搜索需要的镜像,命令:docker search镜像名称
结果解释:
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AOTUMATED:自动创建,表示该镜像由Docker Hub自动构建流程创建的
4.拉取镜像
拉取镜像相当于从远程Registry中下载镜像到本地
命令:docker pull镜像名称:tag
其中:tag可以省略,省略时下载镜像最新版本(lastest)
5.删除镜像
删除本地镜像使用命令:
docker rmi $IMAGE_ID
docker rmi $REPOSITORY:TAG
五.Docker容器操作
可以把容器看成简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序
1.新建容器
docker create[options]镜像名字或者ID[COMMAND][ARG..]
下面命令中
--name是容器名字.名称随意
MYSQL_ROOT_PASSWORD:root用户的密码
最后的mysql是镜像,没有tag时表示:lastest最新版本
docker create -p 3306:3306 --name bjsxt -e MYSQL_ROOT_PASSWORD=bjsxt mysql:5.7
写法二:
docker create -p 3306:3306 --name mysql_new -e MYSQL_ROOT_PASSWORD=root\
-v /usr/local/docker/mysql/conf/etc/mysql\
-v /usr/local/docker/mysql/logs:/var/log/mysql\
-v /usr/local/docker/mysql/data:/var/lib/mysql\
mysql
1.1options参数说明
--name:给容器器一个名字.为容器制定一个名称
-i:以交互模式运行容器,通常与-t连用
-t:为容器重新分配一个伪终端,通常与-i连用
-P:随机端口映射
-p:指定端口映射,hostPost:containerPort
-e:配置信息
-d:后台运行
-v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
2.新建并启动容器
docker run[options]镜像名字或者ID [COMMAND][ARG..]
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -p 3306:3306 --name mysql_new -e MYSQL_ROOT_PASSWORD=root\
-v /usr/local/docker/mysql/conf:/etc/mysql\
-v /usr/local/docker/mysql/logs:/var/log/mysql\
-v /usr/local/docker/mysql/data:/var/lib/mysql\
2.1可用参数说明
docker run --help
-d --detach=false 指定容器运行于前台还是后台,默认为false
-i,--interactive=false 打开STDIN,用于控制台交互
-t,--tty=false 分配tty设备,该可以支持终端登录,默认为false
-u,--user="" 指定容器的用户
-a,--atach=[] 登录容器(必须是以docker run -d启动的容器)
-w,--workdir="" 指定容器的工作目录
-c,--cpu-shares=0 设置容器的CPU权重,在CPU共享场景使用
-e,--env=[] 配置信息
-m,--memory="" 指定容器的内存上限
-P,--publish-all=false 指定容器暴露的端口
-p,--publish=[] 指定容器暴露的端口
-h,--hostname="" 指定容器的主机名
-v,--volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-form=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID的值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用那些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器的关联,使用其他容器的IP,env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和POST等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有root权限
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置有代理接受并处理信号,但是SIGCHLD,SIGSTOP和SIGKILL不能被代理
3.列出启动容器
列出正在运行的容器:docker container ls
查看docker容器进程信息:docker ps[options]
docker ps
3.1options参数说明
-l:显示最近创建的容器
-n:数字:显示最近n个创建的容器
-a:列出所有的运行过的容器
-q:列出容器id
4.云运行中的容器交互
docker exec [options]容器ID[command]
docker exec -it mysql /bin/bash
4.1options参数说明
-i:以交互模式运行容器,通常与-t连用
-t:为容器重新分配一个伪终端,通常与-i连用
5.停止容器
docker stop容器ID
docker stop mysql
6.启动容器
docker start 容器ID
docker start mysql
7.强制停止容器
不推荐使用,容易造成容器服务不正常关闭,影响后续使用
docker kill 容器ID
docker kill mysql
8.删除容器
要删除的容器,必须是关闭状态的
docker rm 容器ID
docker rm mysql
9.查看容器日志
docker logs -f -t --tail行数 容器ID
docker logs -f -t --tail 5 mysql
10.查看容器中运行的进程
可以知道容器中到底运行的是哪个应用程序
docker top容器ID
docker top mysql
11.查看容器内部详情
docker inspect容器ID
docker inspect mysql
12.复制容器数据到宿主机
docker cp 容器ID:容器内路径 宿主机路径
复制MySQL配置到宿主机:docker cp mysql:/etc/mysql ~/tmp/conf
六.Docker File管理(如何自定义镜像)
Docker File是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本.通过构建一个java项目镜像来演式Docker File
1.使用本地命令构建镜像
1.1下载JDK镜像
一般使用openjdk镜像
docker search openjdk
docker pull openjdk:8
1.2创建构建文件
在IDEA新建一个spring boot项目,里面只有一个叫做"/"的控制器,访问后打印demo.把项目打包叫做demojar.jar.并上传到/usr/local/docker中,需要新建docker文件夹
要构建到镜像中的jar文件需要和buildFile处于同一个目录
vim /usr/local/docker/buildFile
FROM openjsk:8
VOLUME /var/mydatas
ADD demojar.jar app.jar
ENTRYPOINT["java","-jar","/app.jar"]
EXPOSE 8080
#指定基础镜像,这个需要根据自己配置的仓库上的版本写
FROM openjdk:latest
#持久化目录
VOLUME /var/mydats
#指定源包,前者是你的jar包
ADD cloudeureka-1.0-SNAPSHOT.jar app.jar
#指定容器启动时执行的命令
ENTRYPOINT["java","-jar","/app.jar"]
#对外端口
EXPOSE 8761
1.3构建镜像
docker build -f 构建文件 -t 镜像名称:TAG
其中镜像名称heTAG都是自己定义的
注意最后面有个点
docker build -f /usr/local/docker/buildFile -t demo:1.0.
1.4启动
docker rn --name demo -p 8080:8080 -d demo:1.0
2.使用IDEA构建镜像
2.1修改Docker服务配置
vim /usr/lib/systemd/system/docker.service
在ExceStart变量末尾,增加下述配置:
-H unix:///var/run/docker:sock -H 0.0.0.0:2375
结果如下:
2.2重启docker服务
systemctl dameon-reload
systemctl restart docker
2.3IDEA项目POM依赖
新增plugin插件配置:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>demo:2.0</imageName><!--指定镜像名称 仓库/镜像名:标签-->
<baseIamge>openjdk:8</baseImage><!--指定基础镜像-->
<dockerHost>http://192.168.232.132:2375</dockerHost><!--指定服务器仓库地址-->
<entryPoint>["java","-jar","/${project.build.fileName}.jar"]</entryPoint><!--容器启动执行命令-->
<resources>
<resource>
<targetPath>/</targetPath><!--指定要复制的目录路径,这里是当前目录-->
<directory>${project.build.directory}</ditectory><!--指定要复制的根目录,这里是target目录-->
<include>${project.build.finalName}.jar</include><!--指定需要拷贝的文件,这里指最后生成的jar包-->
</resource>
</resources>
</configuration>
</plugin>
2.4新建IDEA启动配置
最终结果如下:
七.阿里云镜像仓库
可以把自己的DockerFile上传到阿里云镜像仓库中.上传后可以通过仓库地址随时下载仓库内容
登录阿里云后进入容器镜像服务->控制提艾,按照下面步骤完成
1.新建命名空间
命名空间就是公司名,组织或者个人
一个命名空间下可以有多个仓库
2.新建仓库
点击创建镜像仓库按钮按照提示填写信息
仓库名称就相当于是镜像名称.例如以前下载MySQL时镜像叫做mysql.mysql就是仓库名
选择本地仓库,镜像存储在本地仓库中
3.创建docker密码
docker login时需要输入面膜,需要设置固定密码或临时密码
演示时以固定密码举例
4.点击创建好的镜像仓库
点击创建的镜像仓库名称
按照提示命令进行完成
其中镜像笨笨就是软件版本.例如:mysql:5.7中5.7就是镜像版本
八.本地镜像仓库
通过构建Docker本地库,可以让项目组内多个Docker的Image公用
1.搭建本地仓库
1.1下载本地仓库镜像
docker pull registry
1.2修改Docler Service配置
vim /usr/lib/systemd/system/docker.service
修改内容如下:
找到Service节点,在ExceStart属性末尾增加新参数
其中IP设置为Docker所咋IDE服务器ip即可.5000端口随意的
--insecure-registry 192.168.232.132:5000
1.3修改Docker Daemon配置
vim /etc/docker/daemon.json
新增配置内容:注意IP和端口根上main的配置相同的
{
"insecure-registries":["192.168.232.132:5000"]
}
具体如下:
1.4重启Docker服务
systemctl daemon-reload
systemctl restart docker
1.5启动容器
docker run -p 5000:5000 -v /opt/registry:/var/lib/registry --name registry -d registry
1.6容器启动状态
docker ps -l
1.7浏览器查看本地仓库
http://ip:5000/v2
2.push镜像
命令中使用IP进行push的,要知道本地registry和docker不是必须在一台服务器的.
docker tag[ImageId]ip:5000/[镜像名称]:[镜像版本号]
docker push ip:5000/[镜像名称]:[镜像版本号]
棘突命令如下:两个命令必须按照顺序都执行
docker tag df689c674c72 192.168.232.132:5000/demo:1.0
docker push 192.168.232.132:5000/demo:1.0
3.pull镜像
docker pull ip:5000/[镜像名称]:[镜像版本号]
具体命令如下:
docker pull 192.168.232.132:5000/demo:1.0
九.Docker的数管理
1.数据卷管理
数据卷的作用是将宿主机的某个磁盘目录映射到容器的某个目录,从而实现宿主机和容器之间的数据共享
docker run/create --name [容器名称] -v[宿主机目录]:[容器目录][镜像名称]
参考新建容器或新增并启动容器
2.数据卷容器管理
数据卷容器的作用是实现多个容器之间的数据共享.其实,数据卷容器也是一个容器,但是与其他Docker容器不一样的是,数据卷容器是专门用来日工数据卷给其他容器进行挂载操作
2.1创建数据卷容器
创建容器,并在容器中创建目录/datas.其中/datas是共享目录
docker create --name my_datas -v /datas eureka:1.0
2.2创建容器并使用数据卷容器
命令格式:
通过--volumes-form参数设定从那个数据卷容器创建新的容器,必须通过数据卷容器进行创建,苟泽无法共享
docker run --volumes-from[数据卷容器名或ID][options][镜像名或ID]
具体如下:
docker run --volumes-from my_datas -tid --name eureka1 -p 8761:8761 eureka:1.0
docker run --volumes-from my_datas -tid --name eureka2 -p 8761:8761 eureka:1.0
具体如下:
docker run --volumes -from my_datas -tid --name eureka1 -p 8761:8761 eureka:1.0
docker run --volumes -from my_datas -tid --name eureka2 -p 8761:8761 eureka:1.0
2.3测试
2.3.1访问eureka1容器并在共享目录中写入数据
docker exec -it eureka1 bash
>ls /
>mkdir /datas/test
>touch /datas/test/readme
>echo this text from eureka1>>/datas/test/readme
>exit
2.3.2访问eureka2容器并读取共享目录中的数据
docker exec -it eureka2 bash
>ls /datas/test
>cat /datas/test/readme
3.数据备份
将某容器中的数据目录备份.此过程需要一个备份容器作为中间过程辅助完成
测试发现:备份的目录必须是创建数据容器卷是指定的挂载目录
3.1创阿金无主机备份目录
mkdir /bjsxt/
3.2通过容器备份数据
命令格式:
docker run --rm --volumes -from[数据卷容器ID或名称]-v[宿主机目录]:[容器目录][镜像名称][备份命令]
其中-rm是自动删除容器参数,代表此容器执行完备份命令后,自动删除
具体如下:
-v挂载目录
-e mysql镜像要求的参数
-d后台运行
mysql:5.7镜像及版本
tar -cf打包的命令
/bjsxt/abc.tar.gz把打包后的内容存放在宿主计算机中那个目录中
/datas创建数据卷容器是指定的关在目录
docker run -rm --volumes-from my_datas -v /bjsxt/:/bjsxt/ -e MYSQL_ROOT_PASSWORD=bjsxt -d mysql:5.7 tar -cf/bjsxt/abc.tar.gz /datas
备份成功后,查看宿主机中/backup目录备份结果
4.数据还原
将备份的数据问阿金还原到某容器,这个过程也需要一个容器辅助完成
本质就是把压缩的文件解压会挂载目录
4.1删除容器中的数据文件
删除改在目录中内容,后面使用数据还原之前数据
docker exec -it my_datas bash
>cd /datas
>rm -f*
4.2通过容器还原备份数据
命令格式:
docker run --rm -itd --volumes -from [数据要恢复到的容器] -v[宿主机备份目录]:[容器备份目录][镜像名称][解压命令]
具体如下:
tar -xf解压命令
-C / 把数据解压到my_datas中根目录
docker run -rm -itd --volumes-from my_datas -v /bjsxt/:/bjsxt/ -e MYSQL_ROOT_PASSWORD=bjsxt -d mysql:5.7 tar -xf /bjsxt/abc.tar.gz -C/
4.3查看还原结果
docker exec -it my_datas bash
>ls /data/test
>cat /datas/test/readme
十.Docker容你生命周期
Docker的生命周期其实就是Docker容器从创建到被销毁的过程
在课堂撒花姑娘使用过docker start 和docker stop,图中的命令也是docker支持的命令
1.状态介绍
1.1.圆形
圆形代表的是稳定状态
代表容器的五种状态:
created:初建状态
running:运行状态
stopped:停止状态
paused:暂停状态
deleted:删除状态
1.2长方形
代表容器在执行某种命令后进入的状态:状态是临时状态
docker create:创建容器后,不立即启动运行,容器进入初建状态
docker run:创建容器,并立即启动运行,进入运行状态
docker start:容器转为运行状态
docker stop:容器将转入停止状态
docker kill:容器在故障(死机)时,执行kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必须,否则不建议使用
docker restart:重启容器,容器转入运行状态
docker pause:容器进入暂停状态
docker unpause:取消暂停状态,容器进入运行状态
docker rm:删除容器,容器转入删除状态(如果没有保存相应的数据库,则状态不可见)
1.3菱形
需要根据实际情况选择的操作
1.3.1killed bh out-of-memory(in内存不足被终止)
宿主机内存被耗尽,也被称为OOM:非计划终止
这是需要杀死最吃内存的容器
然后进行选择操作
container process exit de(异常终止)
出现容器被终止后,将进入Should restart>选项操作:
yes需要重启,容器执行start命令,转为运行状态
no不需要重启,容器转为停止状态