- 前言
- docker数据管理
- 数据卷
- 挂载
- 数据卷容器
- 容器互联(使用centos镜像)
- 暴露端口
- ① -p:指定端口
- ② -P:随机端口
- /sbin/init 内核启动时主动呼叫的第一个进程
docker 的镜像是由多个只读文件系统叠加在一起形成的,当我们在启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层,这是如果修改正在运行的容器中已有的文件,那么这个文件会从只读层复制到读写层。文件中的只读版本还在,只是被上门读写层的该文件副本隐藏,当删除docker 或者重新启动时,之前的更改将会消失。docker中,只读层及在顶部的读写层的组合被称为union file system (联合文件系统)。
- 为了很好的实现数据保存和数据共享,docker提出了volume概念,就是将绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上即数据卷
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 两个目录
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:在宿主机环境执行容器内命令
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



