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

docker怎么用tar文件为image_docker


ps:清理:! (小主这里上面创建了一个新的是test1,所以删除就是1了)
#docker container stop nginx-test1
#docker container rm nginx-test1
#docker volume rm nginx-vol

  1. 如果没有指定卷,自动创建。
#docker run -d -it -p 80:80 --name=nginx-test1 --mount src=(这里不指定,为空),dst=/usr/share/nginx/html nginx

就会自动创建一个这样的:

docker怎么用tar文件为image_nginx_02


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
注意:

  1. 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
  2. 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

官网链接: https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount