前言
docker 的镜像是由多个只读文件系统叠加在一起形成的,当我们在启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层,这是如果修改正在运行的容器中已有的文件,那么这个文件会从只读层复制到读写层。文件中的只读版本还在,只是被上门读写层的该文件副本隐藏,当删除docker 或者重新启动时,之前的更改将会消失。docker中,只读层及在顶部的读写层的组合被称为union file system (联合文件系统)。
- 为了很好的实现数据保存和数据共享,docker提出了volume概念,就是将绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上即数据卷
docker数据管理
docker在容器中管理数据主要由两种方式
数据卷
他是一个可供一个或者是多个容器使用的特殊目录。绕过ufs,可以提供很多有用的特性:数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 数据卷默认会一直存在,即使容器被删除 Docker中提供了两种挂载方式,-v和-mount
[root@localhost ~]
DRIVER VOLUME NAME
[root@localhost ~]
mydata
[root@localhost ~]
[
{
"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
cd /var/www/html
touch abc
[root@localhost ~]
root@8cf48d86e03c:/
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:/
111
root@8cf48d86e03c:/
[root@localhost ~]
[root@localhost html]
[root@localhost html]
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
容器互联(使用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和其通信
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
|