Docker学习:Docker镜像、Docker本地镜像发布到阿里云和私有库 、Docker容器数据卷挂载 、Docker常规软件Tomcat和MySQL和Redis安装

1、Docker学习

1. Docker镜像

  1. 是什么
    1. 是一种独立软件包,包含运行某个软件所需的所有内容,把应用和环境配置打包形成可交付的运行环境就是image镜像文件,只有根据镜像才可以创建容器实例,一个容器就是运行了镜像的简易版的Linux环境,在其内运行了指定的镜像文件 ![[Pasted image 20241107081014.png]]
  2. UnionFS联合文件系统
    1. docker中的镜像文件使用了Union联合文件系统,将多个不同目录挂载到同一个虚拟文件系统下,内部的文件是分层的,通过一层层文件的堆叠实现不同的功能叠加,可以实现不同镜像层的复用,docker的镜像只包含了运行所必须的资源,最底层是 bootfs 引导文件,引导加载Linux内核,且会使用宿主机的内核,然后加载 rootfs文件来加载简易版的OS(不同发行版的rootfs不同),加载好OS后,再加载镜像中打包的项目的其他环境,均是以分层的形式添加不同的功能,从而实现镜像的复用,每次根据镜像创建一个容器(运行该镜像文件的简易版Linux系统),都会在镜像层上创建一个可写的容器层,镜像层是只读的,只可以在容器层进行操作添加新的功能,然后通过commit命令将容器打包为一个新的镜像,从而添加新的功能,当多个镜像共用同一个base层时,只会加载一次,从而实现镜像层的复用
    2. Union文件系统可以将不同目录挂载到同一个虚拟文件系统下,内部可以是多个文件系统,但会把各个叠加到一个,从而实现镜像文件的不断分层叠加
    3. 镜像是分层的,基于基础镜像来不断添加不同的功能支持对文件的修改作为一次提交来一层层叠加相当于类的继承,不断添加新的功能 ![[Pasted image 20241107081535.png]]
  3. 镜像加载原理
    1. Docker的镜像文件实际上由一层一层的文件系统组成,就是Union文件系统,镜像文件是由一层层不同的文件堆叠而成
    2. 通过镜像文件创建容器实例时,就会启动镜像内的引导系统bootfs(基本一致)来启动Linux内核(复用主机的内核),然后再启动rootfs(对应OS版本)加载简易版的操作系统,只加载简易版的OS,镜像文件就是多个文件系统的叠加,一层一层实现多应的功能,就是多个文件系统的叠加
    3. 容器是一个简易版的Linux系统,只加载运行所需的资源,不需要整个Linux系统的资源,其rootfs很小,只包含最基本的命令底层使用主机的Linux内核,故Docker必须部署在Linux系统上,Docker镜像只包含最基本的命令,复用宿主机的Linux内核,故Docker必须部署到Linux系统上才可以正常运行 ![[Pasted image 20241107082408.png]]
  4. 为什么采用分层结构呢?复用
    1. 当多个镜像从相同的base镜像构建而来时,此时只需要保存一份base镜像即可,且只需要加载一份base镜像即可;当添加新功能时,只需要在原来的基础上添加即可无需重新创建镜像,镜像文件是分层的,从而实现了基础镜像的复用,只需要在原有镜像的基础上进行功能添加即可
    2. 方便资源共享、复制迁移为了复用基础镜像![[Pasted image 20241107082904.png]]
    3. 当根据镜像启动容器实例时,会在镜像的顶部加载一个可写层,称为容器层,之下的都是镜像层只读![[Pasted image 20241107083319.png]]
    4. 镜像层都是只读的,容器层是可写的 ![[Pasted image 20241107083130.png]]
  5. 镜像commit操作
    1. 通过commit将某个容器提交为新的镜像并保存到本地仓库中,通过docker images查看所有镜像通过docker ps 查看所有容器
    2. 将某个容器提交为新的镜像保存到本地仓库中,此时镜像会保留容器内的所有操作,当根据该镜像创建一个容器实例时,会保留之前容器所做的一切操作,将容器打包为新的镜像,会包含容器中所有的数据
    3. docker commit将自己的容器提交为一个新的镜像,此时该镜像仅仅存放在本地仓库中也可以通过 docker import\export 将容器数据导出或者导入以进行备份和加载 ![[Pasted image 20241107084007.png]]![[Pasted image 20241107084034.png]]![[Pasted image 20241107084608.png]]
  6. 小总结
    1. 通过镜像的分层结构,可以在base镜像的基础上不断添加新的功能形成新的镜像,从而实现镜像的复用,且只会加载一个base镜像
    2. 只有容器层可写镜像层是只读的,每次根据镜像创建一个容器实例时均会在最上层创建一个容器层保存当前的操作,容器就是一个运行镜像文件的简易版的Linux环境,使用宿主机的内核,停止容器就是停止容器中运行的镜像文件服务,只有容器层是可写的
    3. 对容器可以commit提交为一个新的镜像,此时镜像中包含容器的所有操作并保存到本地仓库中

2. Docker本地镜像发布到阿里云

  1. 先对容器commit提交生成新的镜像文件,其本质就是在原来镜像的基础上创建一个容器层保存各种操作,然后将容器层变为镜像层打包进入新的镜像文件中,实现分层;然后在阿里云中镜像资源管理创建命名空间,然后根据镜像名创建镜像仓库(镜像仓库中存放同一个镜像的不同版本TAG),再通过给定的脚本将生成的镜像推送push到指定的阿里云仓库中,此时也可以直接从阿里云仓库中pull拉取指定的镜像到本地仓库中
  2. 生成镜像
    1. 直接将创建的容器实例commit提交为新的镜像并保存到本地仓库中,此时镜像中包含了容器层的所有操作,包含容器的所有操作,且原来的容器层会变为新的一次镜像层装载到原来镜像文件中,镜像文件是分层的每次commit都是提交一层,不会影响原来的镜像层 ![[Pasted image 20241107085137.png]]
    2. 或者使用 dockerfile 创建新的镜像文件,在高阶篇中学习
    3. 可以对自己的容器使用 docker commit 命令将其提交为新的镜像,其会在原有镜像的基础上新加一层镜像层,或者使用 dockerfile创建新的镜像
    4. Docker的镜像文件是分层的,使用union文件系统,将不同的镜像层记载
  3. 将镜像推送到阿里云
    1. 一个镜像仓库是只装不同版本TAG的同一个镜像,如redis镜像仓库就是包含不同版本TAG的redis镜像
    2. redis就是一个镜像仓库,内部有不同TAG版本标签的镜像
    3. 一个镜像仓库就是镜像的名,且同一个镜像仓库中可以有多个TAG版本标签不同的镜像,但都是同一个应用的镜像同一个镜像仓库中的不同镜像仅仅是版本TAG不同
    4. 先在阿里云创建命名空间,然后在命名空间中创建镜像仓库(镜像名),选择代码源为本地仓库
    5. 根据管理界面的脚本推送镜像到阿里云服务器上

3. Docker本地镜像发布到私有库

  1. 私有库是通过 registry 镜像来实现的,先将registry镜像拉取到本地仓库中,然后对其进行配置以实现本地私有库,如要开启私有库,并将创建的镜像通过 docker tag 来修改命名规范,要符合私有库的规则,并修改配置文件使得私有库支持 http 访问,然后就可以通过指定的IP+端口号将镜像推送或者拉取到私有库中
  2. hub.docker.com 中的仓库也是公有库,但是网速很慢
  3. 使用Docker Registry来构建私有镜像库
  4. docker pull registryregistry是专门由于构建私有库的镜像
  5. 运行私有库Registry相当于本地有一个私有DockerHub
  6. -p 指定端口映射,即当使用该参数启动容器后,别的客户端可以通过主机IP+设置的主机端口去映射到Docker中指定的容器端口-p是指定端口映射,此时访问主机的该端口就可以直接访问到docker容器中的服务
  7. 通过commit提交的新镜像修改符合私服规范的TAG必须以指定的IP和Port来对镜像进行命名
  8. 修改配置文件使私有库支持http默认不支持http方式推送镜像修改后重启systemstl restart docker
  9. push推送到私服库Repository

4. Docker容器数据卷挂载

  1. 在创建容器时可以通过 -v 宿主机绝对路径:容器内路径 来实现数据卷的挂载,此时指定的两个命令就可以实现实时数据同步要使用 --previleged=true 来开启挂载权限,这样就可以对容器中服务的数据文件进行实时备份到宿主机中,或者在宿主机中修改容器服务的配置文件然后重启容器的服务,如果容器服务不进行数据卷的挂载时,此时当容器被删除时,其内的所有数据修改均会被删除,数据卷是宿主机的一部分,不会被删除,可以多个容器挂载同一个数据卷(宿主机下的目录)
  2. 开启root权限
    1. 默认挂载目录是不安全的被禁止故要使用 --privileged=true 开启权限,使得目录可以被挂载Docker容器的指定目录下,此时就可以实现宿主机目录和容器目录的同步
    2. 容器卷记得加入参数 --privileged=true开启权限,否则容器内的root没有真正的root权限,无法实现数据卷的挂载
  3. docker run -v
    1. -v 宿主机路径:容器内路径 :表示添加容器卷映射,实现宿主机和容器内文件的备份和持久化
    2. -v 后不加映射时默认仓库创建在容器的 var/lib/registry 目录下,建议自行用容器卷映射,默认映射在容器的 var/lib/registry 目录下
    3. 通过容器数据卷映射完成数据持久化,把容器内的数据备份+持久化到宿主机目录
  4. 是什么:容器文件持久化
    1. 数据卷就是目录或者文件,可以由docker挂载到多个容器中数据卷是宿主机的一部分不属于镜像的联合文件系统,但可以被容器进行访问,从而实现数据的持久化,因为不属于镜像容器的一部分,故不会在删除容器时删除其挂载的数据卷数据卷不属于镜像的部分,是宿主机下的目录,但可以被挂载的容器通过指定的目录进行访问,从而实现数据共享或者持久化备份
    2. 类似于Redis的RDB和AOF文件
    3. 将Docker容器内的数据保存到宿主机的指定目录下
  5. 能干嘛:容器数据持久化和共享
    1. 就是将宿主机的目录或者文件数据卷在容器运行时挂载到容器的指定目录下,此时该数据卷就可以被容器内部访问,且删除容器时不会删除数据卷,从而实现数据的持久化
    2. 通过 docker run -d/it -v 宿主机数据绝对路径:容器内目录 镜像ID : 来实现数据卷挂载,数据卷的挂载需要root权限,故要使用 –privileged=true开启root权限
    3. 此时将需要持久化的文件存放到指定的挂载目录下是就可以实现持久化,会保存到宿主机目录下,容器删除时不会删除数据卷内的数据,如果不进行持久化,则容器删除后数据就都会被删除
  6. 实现 -v(volume)
    1. 宿主机与容器之间添加数据卷映射,可以同时挂载多个数据卷,一个容器可以同时挂载多个数据卷,一个数据卷也可以被多个容器挂载
      1. 在运行容器时通过 -v 宿主机绝对路径:容器内目录 来实现数据卷的映射,将其挂载到容器内,要使用宿主机的绝对路径如果没有将会自建目录 ![[Pasted image 20241107095521.png]]
      2. 挂载成功后会实时共享数据,会实时同步,可以同时挂载多个数据卷,且docker停止后重新启动也会重新加载挂载数据卷中的数据,也会同步,重新启动后会瞬间加载数据卷中的所有数据
      3. 通过docker inspect 容器ID:以JSON字符串格式查看与该容器有关的所有信息
    2. 读写规则限制容器只读:ro
      1. 默认规则是同时支持读写操作相当于加了一个:rw
      2. 可以在容器目录后面使用 :ro 实现容器对该数据卷的只读限制![[Pasted image 20241107100649.png]]
      3. 只限制容器对数据卷的只读不会限制宿主机
    3. 数据卷映射规则的继承和共享
      1. -v 是 --volumes(容量/卷) 的简写通过 --volumes-from 父类容器ID 来继承某个容器的数据卷映射,此时会共享同一个数据卷
      2. 仅仅是继承的数据卷映射规则,当父类容器停止时,子类容器的映射仍然存在,–volume-from 容器ID 仅仅是继承指定容器的数据卷映射规则,相当于共享同一个数据卷
      3. 在运行容器时通过 --name 指定容器的名字,不用加=
      4. ![[Pasted image 20241107100956.png]]
    4. 只要没有删除容器停止后重新启动仍会进行数据卷的同步,只要没有删除容器,就算停止后再重新启动依旧会立刻实现数据卷的同步
    5. 数据卷中的更改是实时同步的,数据卷的更改是同步的
  7. 优点:1、可以通过挂载同一个数据卷实现容器共享数据;2、数据卷中的更改实时生效;3、数据卷的更改不会包含在镜像更新中,数据卷是宿主机的一部分,不会保存到镜像更新中;4、数据卷会一直持续到没有容器挂载为止;5、实现容器数据的持久化

5. Docker常规安装

  1. 总体步骤
    1. 对于需要暴露端口供外界访问的服务的容器,必须要使用 -p 来指定端口映射规则,此时直接访问宿主机的端口就会映射到容器中的服务
    2. docker search 镜像
    3. docker pull 镜像
    4. docker images:查看所有镜像
    5. docker run -d/it [-v --previleged=true] -p --name 镜像ID/NAME:根据镜像创建容器实例运行,并设置端口映射
    6. docker stop/kill 容器ID:仅仅是停止容器中的服务,但不会删除容器
    7. docker rm 容器ID(irm是删除镜像),会删除容器中的所有数据,除非使用数据卷实现持久化,数据卷的更改不会保存到镜像更新中
  2. 安装Tomcat
    2. 根据拉取到的Tomcat镜像创建容器实例, 对于需要外部访问的应用,必须使用 -p 为容器指定端口号映射,此时就可以通过指定访问主机的端口来映射到容器中的应用,如果使用-P来端口映射,则会随机分配主机的端口号进行映射
    3. 运行后通过主机映射的端口号访问Tomcat发现报404未找到页面,此时是因为Tomcat软件内部原因,要通过 docker exec -it tomcat容器ID bash 进入该容器(Linux环境)后并新建命令行,然后将Tomcat文件夹下的 webapp删除,并将webapp.dist改名为 webapp,也可以不下载最新版本的Tomcat
    4. 容器就是一个简易版的Linux,通过exec进入容器进入的是Linux环境并执行命令,docker就是一个Linux微系统,所有的应用都运行在容器的Linux环境下,进入容器就是进入Linux环境
    5. 通过exec进入容器的Linux环境中并执行输入的命令,容器就是一个简易版的Linux,应用在容器中运行,此时使用exit退出的是命令行程序,不会停止容器本身
    6. 容器就是一个简易版的Linux在其内部运行镜像
  3. 安装MySQL:要通过数据卷共享配置字符集并持久化数据
    1. docker容器是一个简易版的Linux环境,在其内部运行镜像;根据镜像创建容器实例就是创建一个Linux环境来运行该镜像,此时进入容器是进入Linux环境中,使用命令行来交互
    2. 简单版
      1. 根据MySQL镜像创建容器时,要使用 -e MYSQL_ROOT_PASSWORD=XXXXXX 来指定MySQL服务器的密码,且在启动MySQL时要通过 -p 设置端口映射,要确保自己主机的端口未被占用
      2. 且在创建MySQL容器时,一定要使用数据卷映射对MySQL数据库中数据进行持久化,否则当容器被删除时会导致MySQL中所有的数据均被删除
      3. 对于MySQL插入中文会报错,因为docker容器中运行的MySQL默认使用 Latin 字符集编码,要修改字符集为 utf-8
    3. 实战班:utf-8+数据卷持久化
      1. mysql容器就是运行了mysql镜像的Linux简易版环境,默认使用Latin编码且没有实现数据持久化
      2. 对于简单版使用容器运行MySQL,此时只是在容器的Linux环境下运行镜像文件中的MySQL服务,此时会出现中文乱码,因为默认使用latin字符集而不是utf-8,而且当容器删除时数据会丢失因为没有映射数据卷进行持久化
      3. 镜像就是模板,包含某个应用运行所需的资源,容器就是一个简易版的Linux环境,来运行指定镜像中的应用MySQL容器就是运行MySQL应用的一个简易版Linux环境
      4. 在创建MySQL容器时,要使用 -v 指定多个数据卷实现MySQL 数据/配置/日志 的持久化
      5. 根据数据卷映射规则在配置的文件夹中新建 my.cnf 文件来修改docker容器中MySQL服务器的配置文件,来修改字符集解决中文乱码,改完以后要重新启动容器,让其中的MySQL服务重新运行关闭容器就是关闭容器Linux环境下运行的服务停止容器是停止容器中运行的服务
      6. 在docker上运行MySQL时,一定要进行数据卷的映射,并修改配置文件解决中文乱码;设置数据卷映射规则,将MySQL的DATA\LOG\CONF文件全部与宿主机上的文件同步,此时删除容器后数据也不会丢失,下次只需要以相同的映射方式重新启动一个MySQL容器即可瞬间同步
      7. MySQL容器就是一个运行MySQL服务的简易版Linux环境
      8. 对于要暴露端口供外界访问的服务,在启动时必须使用-p指定端口映射,此时客户端就可以通过访问宿主机的端口来映射到容器中的服务
  4. 安装Redis:必须指定配置文件来启动redsi服务,先创建配置文件,然后-v数据卷映射,再指定对应数据卷下的的配置文件启动redis
    1. 仍要容器数据卷以实现数据持久化配置文件的指定运行
    2. Redis的运行一定要指定配置文件redis.conf,通过-v数据卷的形式启动,先在宿主机中创建配置文件,再通过在 docker run 末尾天剑 redis-server 以指定的配置文件启动redis服务,此时配置文件会直接映射到容器中对应的目录下,并对配置文件进行修改才可在docker上正常运行
    3. 指定配置文件来启动redis容器,在docker run 最后添加 redis-server redis.conf 来启动redis容器并执行命令指定配置文件
  5. 安装Nginx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值