Docker初识、容器、镜像、数据卷

项目部署存在的问题

image-20220320193413522

Docker

image-20220320193547027

image-20220320193615842

image-20220320193756734

image-20220320193905923

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

无视具体的系统应用。

image-20220320194150287

总结

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

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

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

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

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

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

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

Docker与虚拟机

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

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

image-20220320195030479

image-20220320195108408

Docker和虚拟机的差异:

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

容器和镜像

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

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

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

image-20220320200059100

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

Docker和DockerHub

image-20220320200253367

Docker架构

1、想办法获得镜像

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

image-20220320200642770

总结

image-20220320200726926

安装Docker

Docker基本操作

镜像相关命令

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

镜像操作命令

image-20220320204412984

查看帮助文档

docker --help

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

image-20220320204905244

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

image-20220320205013235

image-20220320205230873

image-20220320205429836 image-20220320205537474

image-20220320205700956

image-20220320205829795

容器相关命令

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

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

image-20220321105704744

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

Docker基本操作—容器

创建Nginx容器

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

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

image-20220321110830991

容器是对外隔离的

image-20220321110458218
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx

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

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

image-20220321111309768

image-20220321112023539

80端口可以不写

持续查看监控日志

image-20220321111507451

和tail -f 一样

总结

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

  • –name: 指定容器名称

  • -p:指定端口映射办

  • -d:让容器后台运行

查看容器日志的命令:

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

进入Nginx容器里面

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

image-20220321140759415

image-20220321140913209

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

image-20220321141209337

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

image-20220321141346553

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

从容器中退出来exit,

image-20220321141632731

image-20220321141754001

image-20220321141951489

总结

查看容器状态:

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

删除容器:

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

进入容器:

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

创建Redis容器

image-20220321143038753

image-20220321143134295

$ 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

image-20220321145135808

image-20220321162158946

数据卷

容器与数据耦合的问题

image-20220321162413247

image-20220321163046958

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

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

操作数据卷

image-20220321163210201

创建数据卷

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

image-20220321163955091

image-20220321163619186 image-20220321163834287

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

数据卷操作:

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

挂载数据卷

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

image-20220321165620593

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

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

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

image-20220321172628345

image-20220321165907669

image-20220321170027192

image-20220321172702475

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

image-20220321172716579

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

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

image-20220321172958897

image-20220321173009707

导入镜像:

image-20220321193219398

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

image-20220321193342489

image-20220321193533060

image-20220321195344855

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

image-20220321195318741

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

image-20220321195431045

数据卷挂载的方式对比

image-20220321192407579

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

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

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

总结

image-20220321195620491

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

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

Dockerfile自定义镜像

镜像结构

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

image-20220322143454561

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

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

什么是Dockerfile

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

image-20220322143851310

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

image-20220322144307780

先创建目录文件

image-20220322145727137

上传文件到虚拟机

Dockerfile文件里面的内容

image-20220322145525621

创建镜像:

docker build -t javaweb:1.0 .

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

image-20220322145128780

image-20220322151219929

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

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

image-20220322151538888 image-20220322151829062

image-20220322152135448

image-20220322152041579

总结

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

DockerCompose

什么是DockerCompose

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

分布式应用部署的帮手

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

image-20220322152613295

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

image-20220322152932127 image-20220322153128728

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

image-20220322155007418

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部署**

image-20220322162027174 image-20220322185751007 image-20220322185949344

启动镜像

image-20220322190932058

image-20220322191016736

image-20220322191146254

image-20220322191244702

在浏览器验证

image-20220322191333153

Docker镜像仓库

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

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

私有镜像仓库

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

image-20220324090456422

image-20220322193644699

2、写docker-compose.yml文件

image-20220322193821695

需要注意的是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

image-20220324090721635

image-20220324090158548

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

image-20220322200146636

image-20220322200302162

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

image-20220322200324549

image-20220324091242308

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

image-20220324091346856

从仓库中拉取镜像到本地

image-20220324091622056

image-20220322200539752

image-20220324091743847

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

总结

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

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

3.推送使用docker push命令

4.拉取使用docker pull命令

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值