docker的容器数据卷

1:容器数据卷作用:

在宿主机,容器之间建立一种文件共享机制,可以实现数据的持久化

2:添加容器数据卷的方式

2.1:直接使用命令添加

  • 语法:
    • docker run -d -it --name 名称 -v /宿主机目录:/容器内目录 --privileged=true 镜像
    • #下边这种写法:ro标识readonly,如果是:rw:表示可读可写
    • docker run -d --name 名称 -it -v/宿主机目录:/容器内目录:ro 镜像
    • 例如:docker run -it -d -v /root/mycentos:/root/mycentos --privileged=true centos
--privileged=true 是可以有权限在容器的对应目录有读写权限
  • 查看容器数据卷是否挂载成功
    • docker inspect 容器id
    • 在这里插入图片描述挂载成功后不管是在宿主机或者容器中对应的目录添加文件,对应的目录也会共享这些文件。容器中部署项目就可以直接在宿主机的文件夹下添加war包。
    • 挂载MySQL
      #-e是配置,这里是配置了数据库的密码 -v 挂载了两个数据卷
      docker run -d -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql5.7 9cfcce23593a

2.1.2:具名挂载和匿名挂载

  • 匿名挂载:docker run -d -it -p 端口映射 --name 名称 -v /容器内目录 镜像 #这样就是匿名挂载在这里插入图片描述
  • 具名挂载:docker run -d -it -p 端口映射 --name 名称 -v 卷名称:/容器内目录 容器 #注意卷名称前边没有/,如果有/就表示宿主机的目录了在这里插入图片描述进入docker的主目录/var/lib/docker的/volumes/卷名称/_data/就可以看到同步的数据了
    在这里插入图片描述-v /宿主机目录:/容器目录/ #这就是指定路径挂载

    2.2:使用DockerFile添加

    • 在宿主机的某一个目录下创建一个Dockerfile文件,编辑这个文件
FROM centos
# 这个就是创建数据卷
VOLUME ["/dataContainer1","dataContainer2"]
CMD  /bin/bash
  • 使用build生成一个新的镜像
docker build -f  Dockerfile的目录 -t 镜像名称 .  # 注意后边有个点
  • 最后启动这个镜像得到容器
  • 查看这个容器
docker inspect 容器id #就可以查看到宿主机的文件目录

1.2:数据卷容器:

数据卷容器实现容器之间的数据备份共享。其他容器通过挂载这个父容器实现数据共享,挂载数据卷的容器称为数据卷容器
比如:先启动一个父容器:

docker run -d -it -p 端口映射 --name 名称 -v /宿主机目录:/容器目录   容器id
# 启动另外一个容器
docker run -d -it -p 端口映射 --name 名称 -v /宿主机目录:/容器目录 --volumes-from 父容器id   容器id

3:dockerfile介绍

3.1:什么是dockerfile?

dockerfile就是docker镜像的构建文件,是有一系列命令和参数构成的脚本

3.2:dockerfile的构建步骤

  • 1:编写dockerfile文件
  • 2:docker build 生成新的镜像
  • 3:docker run 运行镜像

2.1基础知识
1,每条保留字指令都必须为大写字母后面要跟随至少一个参数
2,指令从上到下顺序执行
3,#表示注释
4,每条指令都会创建一个新的镜像层,并对镜像进行提交
2.2大致流程

1,docker从基础镜像运行一个容器
2,执行一条指令并对容器进行修改
3,执行类似于docker commit的操作提交一个新的镜像
4,docker再基于刚提交的新的镜像运行一个新的容器
5,执行dockerfile的下一个指令再从执行第2点直到没有指令

3.3 dockerfile的关键字

  • FROM 基础镜像,当前镜像是基于那个镜像
  • MAINTAINER 镜像维护者的信息,名字,邮箱等
  • RUN 容器构建时需要执行的命令
  • EXPOSE 描述当前容器对外暴露的端口(只是描述作用,告诉使用者)
  • WORKDIR 指定在创建容器后,终端默认登陆进来的目录
  • ENV 用来在构建镜像时设置变量
  • ADD 将宿主机目录下的文件拷贝到镜像,ADD命令会自动处理URL和tar包
  • COPY 类似于ADD ,只是拷贝文件到镜像中
  • VOLUME 容器数据卷,用于数据的持久化
  • CMD 指定一个容器启动时需要执行的命令
    -shell:CMD <命令>
    -exec CMD[“可执行文件”,“参数1”,“参数2”]
    可以有多个CMD但是只有最后一个生效,并且会被run后边的参数替换
  • ENTEYPONT 指定容器启动时运行的命令,不会被替换
  • OBBUILD 当构建一个被集成的dockerfile时运行命令,父镜像在被子镜像继承后触发父镜像的onbuild
    在这里插入图片描述例如:创建一个自己的centos,里边有vim
# 基于镜像
FROM centos
# 作者信息
MAINTAINER  彪哥<qq.com>
# 设置变量
ENV ROOT_PATH   /usr/local/
# 工作目录,用户在进入容器后新疆的终端默认进入的目录
WORKDIR   $ROOT_PATH
# 安装vim
RUN  yum  -y  install vim
# 暴露端口介绍
EXPOSE  80

CMD  /bin/bash

build镜像
docker build -f dockerfile目录 -t mycentos:1.0 .

例子二:构建一个基于centos的Tomcat
需要安装jdk,和Tomcat

  • 下载jdk和Tomcat上传到和dockerfile一个目录
  • 编写dockerfile文件
#基于镜像
FROM centos
# 作者
MAINTAINER 彪哥<qq.com>
# 变量
ENV ROOT_PATH   /usr/local/
# 工作目录
WORKDIR  $ROOT_PATH
# 拷贝解压
ADD jdk-8u181-linux-x64.tar.gz     ./
ADD apache-tomcat-8.5.43.tar.gz  ./
# 执行的命令 改名
RUN mv jdk1.8.0.181   jdk1.8
RUN mv apache-tomcat-8.5.43 tomcat
# 配置环境变量
ENV JAVA_HOME  /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat
ENV CATAL_BASE /usr/local/tomcat
ENV PATH $JAVA_HOME/bin;$CATALINA_HOME/lib;$CATALINA_HOME/bin
# 端口描述
EXPOSE 80
#启动Tomcat,并保持Tomcat的进程
CMD tomcat/bin/startup.sh && tail -F tomcat/logs/catalina.out

构造镜像

docker build -f dockerfile的目录 -t mytomcat:1.0   .

4:docker的四种网络模式

1,概述
docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
bridge模式:使–net =bridge指定,默认设置;
host模式:使–net =host指定;
none模式:使–net =none指定;
container模式:使–net =container:NAMEorID指定。
可以使用docker network ls来查看

2,bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将并将一个主机上的Docker容器连接到一个虚拟网桥上。当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理端口,在宿主机上作为一块虚拟网卡使用)。
具体操作:
启动容器:(由于是默认设置,这里没指定网络–net =bridge,可以看到容器内创建了eth0)
在这里插入图片描述使用ping命令连接Host网络发现,容器与Host网络是连通的:
3,host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
使用host模式启动容器:
在这里插入图片描述使用host模式启动容器后可以发现,使用ip addr查看网络环境时,看到的都是宿主机上的信息。这种方式创建出来的容器,可以看到host上的所有网络设备。
容器中,对这些设备有全部的访问权限。因此docker提示我们,这种方式是不安全的。如果在隔离良好的环境中(比如租户的虚拟机中)使用这种方式,问题不大。
4,none模式
在none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
使用–net =none模式启动容器:
在这里插入图片描述

5,container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
使用–net =container模式启动容器:

在这里插入图片描述
通过该例子可以看出来,两者的网络完全相同。
在这里插入图片描述网卡是一对一对出现的。一段连接协议,一段彼此相连。
容器与容器之间也是可以ping通的。
在这里插入图片描述结论:Tomcat01与Tomcat02是共用一个路由器,docker0.
所有的容器在不指定网络的情况下,都是docker0路由,docker会给容器分配一个 可用的IP

4.2:自定义网络

docker0的局限性:docker0网卡不支持使用容器名来进行访问(可以使用–link来解决,但是不支持了,–link就是在hosts文件中进行了绑定)
容器互联:
查询所有的网络
在这里插入图片描述先查询docker network怎么使用
docker network --help
在这里插入图片描述查询docker netword create --help
在这里插入图片描述创建网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway  192.168.0.1 mynet
# 解释
--driver bridge 设置网络模式,默认就是bridge,所以可以不写
--subnet :子网
-- geteway :自己
mynet :自定义网络的名称

在启动容器的时候就需要指定网络

docker run -d -it -p 8080:8080 --name mytomcat --net mynet e010d327a904

网络连通:不同网段之间的容器怎么互联?
不同网段的容器是无法直接连通的,只能是容器连接到另外的网络(一个容器两个IP)
在这里插入图片描述连通的命令
在这里插入图片描述怎么使用?

docker network connect mynet  容器id

在这里插入图片描述执行过后发现容器的网络

docker inspect 容器id

在这里插入图片描述也可以删除这种连接

docker network disconnect mynet 容器id

5:docker安装MySQL

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1

  • -e设置密码
  •  --lower_case_table_names=1 #设置MySQL的表名大小写不敏感
    

如果报错(5.7不会)
在这里插入图片描述发现报错,这是因为docker 的mysql里面的localhost -root 的密码是启动时设置的是123456现%-root的没有设置
下面是解决方法

1, 进入mysql的docker 容器
docker exec -it mysql /bin/bash
2,登陆mysql
mysql -u root -p
输入密码
3,使用mysql数据库
use mysql
4,执行修改密码的命令
update user set password=password(123456) where host=’%’
5,重启mysql的docker 容器
exit退出
exit退出mysql容器
docker restart mysql
再就可以进行远程连接了哦

如果出现使用宿主机IP无法访问的情况 在宿主机里面执行如下命令
请顺序运行以下命令:

nmcli connection modify docker0 connection.zone trusted
systemctl stop NetworkManager.service
firewall-cmd --permanent --zone=trusted --change-interface=docker0
systemctl start NetworkManager.service
nmcli connection modify docker0 connection.zone trusted
systemctl restart docker.service
再重启mysql和tomcat的容器

©️2020 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值