一、Docker简介
1 什么是Docker
Docker 是基于 Go语言实现的开源容器项目。利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量化虚拟化(通俗解释:Docker 内嵌极小型形同,例如Linux只有5M,windows也是)。它是内核级的虚拟化。期望达到使项目运行环境“一次封装,到处运行的目的”。
在Docker里面可以设置使用 Windows 还是 Linux 系统,默认是用Linux系统
利用docker创建的运行环境叫做 docker 容器,容器是通过docker镜像创建的,docker镜像文件也可以放在私有仓库中也可以放在共有仓库中。
2 Docker和VM的对比
2.1 结构区别
2.2 应用区别
Docker:面向内核、软件,docker是秒级的
虚拟机:面向硬件的,分钟级别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRSIWQ0e-1604817671945)(D:\BaiduNetdiskDownload\springboot核心篇+整合篇-尚硅谷\01尚硅谷SpringBoot核心技术篇\Spring Boot 笔记+课件\docker.assets\image-20201106192814124.png)]
3 Docker的特点
3.1 效率高
用户只需要几分钟,就可以把自己的程序“Docker“化。Docker依赖于”写时赋值“(copy- on -write)模型,师修改应用程序也非常迅速,可以说达到”随心所欲,代码即改”的境界.
随后就可以创建容器来运行应用程序。大多数Docker容器只需要不到1秒即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时一台宿主机中也可以运行更多的容器,使用户尽可能充分的利用系统资源
3.2 指责明确
使用 Docker ,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出问题就归结为肯定是运维的问题)”
3.3结构完整
Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不要从该盒子中一件件的取)
3.4 契合微服务架构
Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)
4 Docker的架构
4.1 Docker daemon(Docker 守护进程)
Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可以通过Docker客户端与之通信。
4.2 Client(Docker 客户端)
Docker客户端是Docker的用户界面,它可以接收用户命令和配置标识,并于Docker daemon通信。图中,Docker build等都是Docker的相关命令
4.3 Image (Docker 镜像)
Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——我们使用系统安装光盘安装系统,同理,我们使用Docker镜像运行Docker镜像中的程序
4.4 Container(容器)
容器是镜像的可运行示例。容器和镜像的关系优点类似于面向对象中,类和对象的关系。我们可以通过Docker API或者 CLI 命令来启停、移动、删除容器
4.5 Registry(仓库)
Docker Registry 是一个几种存储于分发镜像的服务。我们构建完Docker镜像后,就可以在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。此时,我们可借助Docker Registry来避免镜像的手动拷贝。
一个Docekr Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像。这跟 Maven 的仓库优点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar的路径,而镜像标间可以理解为 jar 包的版本号
二、Docker的安装与启动
以下安装步骤基于Centos 8 ,并确保虚拟机可以连接外网
1 安装
1.1 下载 docker-ce repo
为本地yum 提供远程repo信息
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
1.2 安装依赖
可以不用这一步
yum install https://download.docker.com/linux/Fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
1.3 安装docker-ce
sudo yum install docker-ce docker-ce-cli containerd.io
2 启动
2.1 启动命令
systemctl start docker
2.2 查看 docker 状态
doceker info
三、镜像加速器
默认情况下Docker 从 Docker Hub上下载镜像资源,但速度很慢,可以通过配置国内的镜像加速器来解决。
本课程以阿里云镜像加速器为例讲解
1 访问阿里云
2 登陆 进入控制台
3 搜索镜像加速器
4 选择对应的 OS 并配置
5 验证镜像加速器的配置
通过docker info命令看到以下内容说明配置成功
四、Docker镜像操作
1 什么是Docker镜像
Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最低端是一个文件引导系统,即 bootfs,这很像经典的 Linux/Unix 的文件引导系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,二引导文件则会被卸载,以理出更多的内存供磁盘镜像使用。Docker容器启动是需要一些文件的,而这些文件可以称为Docker镜像
2 列出镜像
列出docker下的所有镜像,命令: docker images
结果解释:
REPOSITORY: 进项所在的仓库名称
TAG : 镜像标签
IMAGE ID: 镜像ID
CREATE: 镜像的创建日期(不是获取该镜像的日期)
SIZE: 镜像大小
3 搜索镜像
可以使用命令搜索需要的镜像,命令: docker search 镜像名称
结果解释:
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:使用率
OFFICIAL:是否是官方的
AUTOMATED: 是否是自动化的
4 拉取镜像
拉取镜像相当于远程 Registry中下载镜像到本地,命令:docker pull 镜像名称
5 删除镜像
删除本地镜像使用命令:
docker rmi SIMAGE_ID
docker rmi $REPOSISTORY:TAG
五、Docker容器操作
可以把容器看成简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用名称
1 新建容器
docker create [options] 镜像名字 或者 ID [COMMAND][ARG...]
docker create -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql
docker create -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/conf/etc/mysql:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
mysql
1.1 options 参数说明
–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
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/conf/etc/mysql:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-d mysql
3 列出启动容器
列出正在运行的容器: docekr container ls
查看docker 容器的进程信息: docker ps [options]
docker ps
3.1 options 参数说明
-l:显示最近创建的容器
-n 数字:显示最近n个创建的容器
-a:列出所有运行过的容器
-q:列出容器id
4 与运行中的容器交互
docker exec [options] 容器ID 【command】
docker exec -it mysql /bin/bash
3.1 options参数说明
-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
强制删除正在运行中的容器
docker rm -f 容器ID
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:/ect/mysql ~/tmp/conf
六、 Docker File管理(如何自定义镜像)
Docker File
是用来构建 Docker
镜像的构建文件,是由一系列命令和参数构成的脚本。
案例:构建一个java工程镜像
1 使用本地命令创建镜像
1.1 下载JDK镜像
一般使用openJdk镜像
docker search openjdk
docker pull openjdk
1.2 创建构建文件
在 IDEA 新建了一个 spring boot 项目,里面只有一个叫做“/”的控制器,访问后打印demo。把项目打包叫做demojar.jar。并上传到/usr/local/docker中,需要新建docker文件夹
要构建到镜像中的jar文件要和buildFile处于同一目录
vi /usr/local/docekr/buildFile
FROM openjdk:8
VOLUME /var/mydatas
ADD demojar.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
EXPOSE 8080
1.3 构建镜像
docker build -f 构建文件 -t 镜像名称:TAG
# 其中镜像名称和TAG都是自定义的
# 注意:最后有个点
docker build -f /usr/local/docker/buildFile -t demo:1.0 .
1.4 启动
docker run --name eureka - p 8761:8761 -d demo:1.0
1.4.1 语法解释
#指定基础镜像,这个需要根据自己配置的仓库上的版本写
FROM openjdk:latest
#持久化目录
VOLUME /var/mydatas
#指定源包,前者是你的jar包
ADD cloudeureka-1.0.jar app.jar
#指定容器启动时执行的命令
ENTRYPOINT ["java","-jar","app.jar"]
#对外端口
EXPOSE 8761
2. 使用IDEA构建镜像
2.1 修改 Docker 服务配置
vi /usr/lib/systemd/system/docekr.service
# 在 ExecStart 变量末尾,增加下述配置
-H unix:///var/run/docker:sock -H 0.0.0.0:2375
结果如下
2.2 重启 Docker 服务
systemctl daemon-reload
systemctl restart docker
2.3 IDEA 项目 POM 依赖
新增plugin插件配置
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<!-- 如果写了下面一段,在配置maven启动的时候,直接点击maven package就可以 -->
<!-- 将插件绑定在某个phase执行 -->
<executions>
<execution>
<id>build-image</id>
<!-- 将插件绑定在package这个phase上,也就是说
用户只需要执行mvn packege,就会自动执行 mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 指定镜像名称 仓库/镜像名:标签 -->
<imageName>projects/demo:1.0</imageName>
<!-- 指定基础镜像 -->
<baseImage>openjdk:8</baseImage>
<!-- 指定服务器仓库地址 -->
<dockerHost>http://你的ip:2375</dockerHost>
<!-- 容器启动执行的命令 -->
<entryPoint>["java,"-jar","/${project.build.finalName}.jar}"]</entryPoint>
<!-- 指定dockerFile文件的路径 -->
<!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory> -->
<resources>
<resource>
<!-- 指定要复制的目录路径,这里是当前目录 -->
<targetPath>/</targetPath>
<!-- 指定要复制的根目录,这里是target目录 -->
<directory>${project.build.directory}</directory>
<!-- 指定需要拷贝的文件,治理是指最后生成的jar包 -->
<include>${project.build.finalName}</include>
</resource>
</resources>
</configuration>
</plugin>
2.4 新增IDEA启动配置
最终结果如下:
七、本地镜像仓库
1 搭建本地仓库
1.1 下载本地镜像仓库镜像
docker pull registry
1.2 修改 Docker Service 配置
vim /usr/lib/systemd/system/docker.service
# 修改内容如下:
# 找到Service节点,在 ExecStart 属性末尾增加新参数,值为:
--insecure-registry 你的ip:5000
1.3 修改Docker Daemon 配置
vim /etc/docker/daemon.json
# 新增配置内容
{
"insecure-registries":["你的ip: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 镜像
docker tag [ImageId] ip:5000/[镜像名称]:[镜像版本号]
docker push ip:5000/[镜像名称]:[镜像版本号]
# 具体命令如下
docker tag sijdfoiajd 你的ip:5000/demo:1.0
docker push 你的ip:5000/demo:1.0
3 pull 镜像
docker pull ip:5000/[镜像名称]:[镜像版本号]
# 具体命令如下
docker pull 你的ip:5000/demo:1.0
八、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.1 killed by out-of-memory(因内存不足被终止)
宿主机内存被耗尽,也被称为OOM:非计划终止
这时需要杀死最吃内存的容器
然后进行选择操作
1.3.2 container process exited(异常终止)
1.3.3 出现容器被终止后,将进入 Should restart?选择操作:
yes 需要容器,容器执行start命令,转入运行状态。
no 不需要重启,容器转为停止状态。