docker 存储
容器删除数据会丢失,可以通将数据从宿主机挂载到容器中做持久化。
Docker 提供三种不同的方式将数据从宿主机挂载到容器中
- volumes:Docker 管理宿主机文件系统的一部分**(/var/lib/docker/volumes)**。
- bind mounts:可以存储在宿主机系统的任意位置。
- tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统
安装 docker-ce 版本
如果装了 docker的低版本 要卸载掉:
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm
#安装常用文件
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#同步阿里云仓库的docker-ce
yum makecache fast
yum install docker-ce
systemctl start docker
systemctl enable docker
[root@localhost ~]# docker -v
Docker version 19.03.2, build 6a30dfc
可以做国内加速 请看小主的上篇文章–docker篇章02!
volume
1.管理卷:
创建一个卷,做为 wwwroot 目录
[root@localhost ~]# docker volume
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
[root@localhost ~]# docker volume create nginx-vol(自己取名字)
nginx-vol
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2019-09-24T07:20:46-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
用卷创建一个容器:
[root@localhost ~]# docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# --name=nginx-test 容器的名字
# --mount src=nginx-vol 源 本地的卷
#dst=/usr/share/nginx/html 目标 默认的安装目录 yum安装的默认目录
#nginx 镜像
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
Digest: sha256:9688d0dae8812dd2437947b756393eb0779487e361aa2ffbc3a529dca61f102c
Status: Downloaded newer image for nginx:latest
03c2da484c7ab4e571da51e4ef69121b10a8d9116251783556c2721b173fdf87
[root@localhost ~]# cd /var/lib/docker/volumes/nginx-vol/_data/
[root@localhost _data]# ls
50x.html index.html
[root@localhost _data]# echo ralph > 1.html
查看容器内部:(目录内容都保存在宿主机里面)
[root@localhost _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03c2da484c7a nginx "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp nginx-test
[root@localhost _data]# docker exec -it 03c2da484c7a bash
root@03c2da484c7a:/# cd /usr/share/nginx/html/
root@03c2da484c7a:/usr/share/nginx/html# ls
1.html 50x.html index.html
删除原来的容器,再重新创建一个,能看到原来保存的1.html的共享文件
#删除容器 数据不会丢失
[root@localhost _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03c2da484c7a nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx-test
[root@localhost _data]# docker rm -f 03c2da484c7a
03c2da484c7a
[root@localhost _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#再次创建容容使用这个这个卷 -p 宿主机端口:容器的端口
[root@localhost _data]# docker run -d -it -p 80:80 --name=nginx-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
0d8477a15c10a6c9e7b163ca8ea239b6c8452fedeeafda23f02b386700fb2621
ps:清理:! (小主这里上面创建了一个新的是test1,所以删除就是1了)
#docker container stop nginx-test1
#docker container rm nginx-test1
#docker volume rm nginx-vol
- 如果没有指定卷,自动创建。
#docker run -d -it -p 80:80 --name=nginx-test1 --mount src=(这里不指定,为空),dst=/usr/share/nginx/html nginx
就会自动创建一个这样的:
2. 建议使用–mount,更通用。
官方文链接: https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume
以上是自动创建在 volumes 里面的;如果目录的空间不够了,我们可以指定目录 就用了到了bind mount
bind mount
用卷创建一个容器:
[root@localhost _data]# mkdir /ralph/wwwroot -p (创建一个你要存储的目录)
[root@localhost _data]# docker run -d -it --name=nginx-test2 --mount type=bind,src=/ralph/wwwroot,dst=/usr/share/nginx/html nginx
#--mount type=bind 设置类型
5868ea1db63500c2d487fb595ccc255d11c9738b92a1c7a080ba722c85b04f9a
[root@localhost _data]# vi /ralph/wwwroot/index.html
[root@localhost _data]# cat /ralph/wwwroot/index.html
<h1>hello,i am ralph</h1> #做了一个测试页
[root@localhost _data]# docker exec -it nginx-test2 bash
root@5868ea1db635:/# cat /etc/hosts #进到容器里查看IP
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 5868ea1db635
root@5868ea1db635:/# read escape sequence
[root@localhost _data]# curl 172.17.0.2
<h1>hello,i am ralph</h1>
清理:
#docker container stop nginx-test11
#docker container rm nginx-test11
注意:
- 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
- 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
官网链接: https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount