docker之数据挂载&&端口暴漏

前言

docker 的镜像是由多个只读文件系统叠加在一起形成的,当我们在启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层,这是如果修改正在运行的容器中已有的文件,那么这个文件会从只读层复制到读写层。文件中的只读版本还在,只是被上门读写层的该文件副本隐藏,当删除docker 或者重新启动时,之前的更改将会消失。docker中,只读层及在顶部的读写层的组合被称为union file system (联合文件系统)。

  • 为了很好的实现数据保存和数据共享,docker提出了volume概念,就是将绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上即数据卷

docker数据管理

docker在容器中管理数据主要由两种方式

  • 数据卷
  • 挂载主机目录

数据卷

他是一个可供一个或者是多个容器使用的特殊目录。绕过ufs,可以提供很多有用的特性:数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 数据卷默认会一直存在,即使容器被删除 Docker中提供了两种挂载方式,-v和-mount


[root@localhost ~]# docker volume ls  #查看所有数据卷
DRIVER    VOLUME NAME
[root@localhost ~]# docker volume create mydata  #创建mydata数据卷
mydata
[root@localhost ~]# docker volume inspect mydata  #查看Mydata数据卷的详细
[
    {
        "CreatedAt": "2021-11-29T21:33:25+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/mydata/_data",
        "Name": "mydata",
        "Options": {},
        "Scope": "local"
    }
]
  • 注:Mountpoint为数据在本机存储的位置,如果磁盘存储空间不足可修改此位置

挂载

方式一:

格式:docker run -v 宿主机目录:挂载容器中的目录

#例
docker run -it -v /var/www/html:/data1 --name xiaobai nginx /bin/bash

#这时候另开一个终端,去宿主机创建一个abc
cd /var/www/html
touch abc

#再回到上一个终端查看/data1目录下就会多出一个abc
[root@localhost ~]# docker run -it -v /var/www/html:/data1 --name xiaobai nginx /bin/bash
root@8cf48d86e03c:/# ls
bin    dev                   etc   lib64  opt   run   sys  var
boot   docker-entrypoint.d   home  media  proc  sbin  tmp
data1  docker-entrypoint.sh  lib   mnt    root  srv   usr
root@8cf48d86e03c:/# ls /data/
111
root@8cf48d86e03c:/# etit

[root@localhost ~]# cd /var/www/html/
[root@localhost html]# touch 111
[root@localhost html]# ls
111

数据卷容器

原理:让两个容器实现数据共享

1.创建一个数据卷容器,指定名字为web100,两个卷:/data1 和 /data2
docker run -it --name web100 -v /data1 -v /data2 nginx /bin/bash

2.另起一个终端,将这个数据卷容器挂载到centos:7的容器上
docker run -it --name db1 --volumes-from web100 nginx /bin/bash
#此时 ls / 查看就会发现有 /data1 和 /data2 两个目录

在这里插入图片描述
在这里插入图片描述

容器互联(使用centos镜像)

docker run -itd -P --name web1 centos:7 /bin/bash		//创建并运行容器取名web1,端口号随机映射
docker exec -it 容器ID /bin/bash

#另起一个终端
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash	//创建并运行容器取名web2,链接到web1和其通信
#--link:打通隧道
docker exec -it 容器ID /bin/bash

#两个容器都下载
yum -y install net-tools	//各自下载ifconfig的工具
验证:
进web2容器 ping web1

在这里插入图片描述

暴露端口

① -p:指定端口

docker run -itd -p 8081:80 nginx:latest /bin/bash	
//暴露端口8081,相当于把容器的80端口映射到宿主机上的8081端口

docker exec -it d144113140b5 /bin/bash -c nginx
//进入这个容器并启动nginx
//-c:在宿主机环境执行容器内命令

在这里插入图片描述
在这里插入图片描述

② -P:随机端口

docker run -itd -P nginx:latest /bin/bash

docker exec -it 12fda7fd0f3c /bin/bash -c nginx

在这里插入图片描述

在这里插入图片描述
在宿主机环境执行容器内命令

docker exec -it 容器ID /bin/bash -c 'nginx'
docker exec 容器ID/容器 name 执行的命令

怎么把宿主机的文件传入到容器内部

docker cp 源文件路径 容器ID:目标文件路径
docker cp /opt/abc 容器ID:/opt/abc

进入容器没有systemctl命令解决方法:

添加--privileged=true(指定此容器是否为特权容器),使用此参数,则不能用attach

docker run -itd --name test02 --privileged=true centos:7 /sbin/init

/sbin/init 内核启动时主动呼叫的第一个进程

#可以使用docker inspect 容器ID

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值