Docker

项目部署存在的问题

Docker_第1张图片

Docker

Docker_第2张图片

Docker_第3张图片

Docker_第4张图片

Docker_第5张图片

Docker将用户程序与所需要调用的系统函数库一起打包,这样程序会去调用他打包好的系统函数库,不用再管系统应用具体是什么,只要他们的内核一样就可以。

无视具体的系统应用。

Docker_第6张图片

总结

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置-起打包,形成可移植镜像

  • Docker应 用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内
    核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术:

1.可以将程序及其依赖、运行环境一 起打包为一-个镜像,可以迁移到任意Linux操作系统
2.运行时利用沙箱机制形成隔离容器,各个应用互不干扰.
3.启动、移除都可以通过一-行命令完成,方便快捷

Docker与虚拟机

Docker是直接调用操作系统内核的,它的性能会比虚拟机好很多。

虚拟机是在一个操作系统中运行另一个操作系统,一层一层的调用最后去调用计算机硬件,性能不太好。

Docker_第7张图片

Docker_第8张图片

Docker和虚拟机的差异:

  • docker是一个系统进程(直接与操作系统内核做交互);虛拟机是在操作系统中的操作系统
  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

容器和镜像

镜像就是硬盘中的文件。容器就是我们把mysql这个应用跑起来,形成的进程就是容器。只不过容器在Docker里面还要做隔离。

镜像都是只读的,容器在运行过程中,不能向镜像当中去写东西。你可以基于镜像去创建容器,容器可以在镜像当中读数据,不能写。

当容器需要写操作的时候,可以拷贝一份镜像当中的data文件到自己的容器中,

Docker_第9张图片

那怎么把镜像分享给别人使用呢?使用DockerHub

Docker和DockerHub

Docker_第10张图片

Docker架构

1、想办法获得镜像

2、把镜像创建成容器运行,完成部署即可。

Docker_第11张图片

总结

Docker_第12张图片

安装Docker

Docker基本操作

镜像相关命令

  • 镜像名称一般分两部分组成: [repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像
Docker_第13张图片

镜像操作命令

Docker_第14张图片

查看帮助文档

docker --help

案例:从DockerHub中拉取一个nginx镜像并查看

Docker_第15张图片

利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

Docker_第16张图片

Docker_第17张图片

Docker_第18张图片 Docker_第19张图片

Docker_第20张图片

Docker_第21张图片

容器相关命令

容器暂停:操作系统会将容器内的进程挂起,容器关联的内容暂存起来,cpu不再执行这个进程。如果你把他给回恢复了,内存空间被恢复,程序接着运行。

容器停止:操作系统会将容器内的进程杀死,所占内存回收。保留下来的只是容器的文件系统,一些静态的东西。只能用start重新生成。

Docker_第22张图片

删除容器不仅把里面的进程干掉,里面的文件删除,删的干干净净。

Docker基本操作—容器

创建Nginx容器

案例:创建运行一个Nginx容器

基于最新版本的nginx创建一个容器,并起个名字为mn,且做了一个端口映射,在后台运行。

Docker_第23张图片

容器是对外隔离的

Docker_第24张图片
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx

端口映射的目的:将原本完全隔离的容器暴露一个窗口,让你通过它可以访问。

左边为宿主机的端口,只要没有被其他的占用些什么都可以。

Docker_第25张图片

Docker_第26张图片

80端口可以不写

持续查看监控日志

Docker_第27张图片

和tail -f 一样

总结

docker run命令的常见参数有哪些?

  • –name: 指定容器名称

  • -p:指定端口映射办

  • -d:让容器后台运行

查看容器日志的命令:

  • docker logs
  • 添加-f参数可以持续查看 日志
    查看容器状态:
  • docker ps

进入Nginx容器里面

案例:进入Nginx容器,修改HTML文件内容,添加"欢迎您”

Docker_第28张图片

Docker_第29张图片

容器的内部有自己的文件系统

Docker_第30张图片

nginx没有封装vi命令,那怎么修改index.html?进行内容的替换

Docker_第31张图片

去浏览器再刷新下页面就知道是否修改成功。

从容器中退出来exit,

Docker_第32张图片

Docker_第33张图片

Docker_第34张图片

总结

查看容器状态:

  • docker ps
  • 添加-a参数查看所有状态的容器

删除容器:

  • docker rm
  • 不能删除运行中的容器,除非添加-f参数

进入容器:

  • 命令是docker exec -it [容器名] [要执行的命令]
  • exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的(因为在容器内修改文件任何人是都不知道的,你自己以后也可能忘记了)

创建Redis容器

Docker_第35张图片

Docker_第36张图片

$ docker run --name mr -p 6379:6379 -d redis redis-server --save 60 1 --loglevel warning

进入redis容器

进入redis容器,并执行redis-cli客户端命令,存入num=666

docker run -it --network some-network --rm redis redis-cli -h mr

Docker_第37张图片

Docker_第38张图片

数据卷

容器与数据耦合的问题

Docker_第39张图片

Docker_第40张图片

数据卷就相当于是一个桥梁,将容器里面的文件数据和宿主机文件系统上的数据关联映射到一起,在宿主机上进行相关文件的修改后,容器里面的文件也会发生相应的改动。

解决了修改不方便,以及在创建容器想要数据一致的问题(让他也指向相同的数据卷)、容器删除了之后数据卷还在三个问题。

操作数据卷

Docker_第41张图片

创建数据卷

案例:创建一个数据卷 ,并查看数据卷在宿主机的目录位置

Docker_第42张图片

Docker_第43张图片 Docker_第44张图片

数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

数据卷操作:

  • docker volume create
  • docker volume ls
  • docker volume inspect
  • docker volume rm
  • docker volume prune

挂载数据卷

我们在创建容器时,可以通过-V参数来挂载一个数据卷到某个容器目录

Docker_第45张图片

案例:创建一 个nginx容器, 修改容器内的html目录内的index.html内容

需求说明:.上个案例中, 我们进入nginx容器内部,已经知道nginx的html目录所在位置
/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-V参数挂载数据卷

-v参数前面是数据卷名称,后面是容器内的对应文件所在位置

Docker_第46张图片

Docker_第47张图片

Docker_第48张图片

Docker_第49张图片

在做数据卷挂载时,如果数据卷不存在,dockerhi自动创建对应的数据卷。

Docker_第50张图片

案例:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

宿主机文件会直接覆盖容器内文件的内容

Docker_第51张图片

Docker_第52张图片

导入镜像:

Docker_第53张图片

创建多级目录:mkdir -p mysql/data

Docker_第54张图片

Docker_第55张图片

Docker_第56张图片

docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3006:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

Docker_第57张图片

测试是否能连接成功,连接的时候注意端口号映射为了3006

Docker_第58张图片

数据卷挂载的方式对比

Docker_第59张图片

数据卷挂载:当我们使用数据卷时,docker会全自动的创建数据卷对应的目录,这样数据卷就指向了目录,而docke挂载时只需要挂载在数据卷上即可,不需要关心目录在哪里,这种方式相当于全权交给了docker去处理,我们不用去操心。劣势就是目录文件不是我们自己创建的,文件目录比较深,我们不知道去哪里去找。

目录挂载:目录是我们自己创建的,挂载的时候也没有人做代理,直接挂上去。将来想要定位到这个文件在哪,一目了然。

一个是自动化隐藏了细节,一个是需要自己去实现细节,但是比较清晰。

总结

Docker_第60张图片

数据卷挂载:-v volume 数据卷名称:容器内目录

宿主机挂载:-v 宿主机目录:容器内目录

Dockerfile自定义镜像

镜像结构

  • 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

Docker_第61张图片

镜像是分层结构,每一层称为一个Layer

  • Baselmage层:包含基本的系统函数库、环境变量、文件系统
  • Entrypoint:入口,是镜像中应用启动的命令
  • 其它:在Baselmage基础上添加依赖、安装程序、完成整个应用的安装和配置

什么是Dockerfile

Dockerfile就是一-个文本文件, 其中包含-一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每
一个指令 都会形成一层Layer。

Docker_第62张图片

案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目

Docker_第63张图片

先创建目录文件

Docker_第64张图片

上传文件到虚拟机

Dockerfile文件里面的内容

Docker_第65张图片

创建镜像:

docker build -t javaweb:1.0 .

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qROAMWch-1648084811496)(C:/Users/大 大/AppData/Roaming/Typora/typora-user-images/image-20220322144924876.png)]

Docker_第66张图片

Docker_第67张图片

案例:基于java;8-alpine镜像,将一个Java项目构建为镜像

采用分层的思想,将对jdk的安装封装为一个镜像

Docker_第68张图片 Docker_第69张图片

Docker_第70张图片

Docker_第71张图片

总结

  1. Dockerfile的本质是- -个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一 行必须 是FROM,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如Ubuntu。 也可以是其他人制作好的镜像,例如: java:8-alpine

DockerCompose

什么是DockerCompose

  • Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一一个个创建和运行容器!
  • Compose文件是一 -个文本文件,通过指令定义集群中的每个容器如何运行。

分布式应用部署的帮手

Compose文件可以看作n个docker run命令的集合,

Docker_第72张图片

在微服务集群配置当中,mysql仅仅是统计给服务内的集群中用的,端口不需要暴漏,内部能访问就可以了。

Docker_第73张图片 Docker_第74张图片

DockerCompose有什么作用?
帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。

Docker_第75张图片

curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

DockerCompose部署为服务集群

案例:将之前学习的cloud-demo微服务集群利用DockerCompose部署**

Docker_第76张图片 Docker_第77张图片 Docker_第78张图片

启动镜像

image-20220322190932058

Docker_第79张图片

image-20220322191146254

Docker_第80张图片

在浏览器验证

image-20220322191333153

Docker镜像仓库

镜像仓库( Docker Registry )有公共的和私有的两种形式:

  • 公共仓库:例如Docker官方的Docker Hub,国内也有一 些云服务商提供类似于Docker Hub的公开服务,比如网
    易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。
  • 除了使用公开仓库外,用户还可以在本地搭建私有Docker Registry。 企业自己的镜像最好是采用私有Docker
    Registry来实现。

私有镜像仓库

1、首先配置Docker的信任地址

Docker_第81张图片

Docker_第82张图片

2、写docker-compose.yml文件

Docker_第83张图片

需要注意的是docker-compose的版本与docker引擎的版本要一一对应,版本之间有对应关系。

version: '3.8'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8086:80
    environment:
      - REGISTRY_TITLE=我的私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

Docker_第84张图片

Docker_第85张图片

在私有镜像仓库推送或拉取镜像

Docker_第86张图片

Docker_第87张图片

本质是一样的,只不过是重命名的而已.

Docker_第88张图片

Docker_第89张图片

在浏览器中查看是否推送成功

Docker_第90张图片

从仓库中拉取镜像到本地

Docker_第91张图片

Docker_第92张图片

Docker_第93张图片

推送镜像到仓库之前一定要重命名,并且以镜像仓库地址为前缀.

总结

1.推送本地镜像到仓库前都必须重命名(docker tag)镜像,以镜像仓库地址为前缀

2.镜像仓库推送前需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任

3.推送使用docker push命令

4.拉取使用docker pull命令

你可能感兴趣的:(SpringCloud,java)