温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Docker的数据管理方式

发布时间:2020-05-25 16:01:29 来源:亿速云 阅读:325 作者:鸽子 栏目:云计算

一.Docker数据管理方式简介

Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs。

1.Volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。

2.bind mounts:可以挂载在宿主机系统的任意位置。

3.tmpfs: 挂载存储在宿主机系统的内存中,而不会写入宿主机的文系统。

二管理volume卷

1.管理volume卷

#显示卷

[root@docker sky9890]# docker volume ls

DRIVER              VOLUME NAME

local          0b37cdeff2004e6f6293ba0175df953e93a0244c945dd030a27c9c2d70015473

……

#创建卷

 [root@docker sky9890]# docker volume create nginx-vol

nginx-vol

[root@docker sky9890]# docker volume ls

local               nginx-vol

[root@docker sky9890]# docker volume inspect nginx-vol

[

    {

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",

        "Name": "nginx-vol",

        "Options": {},

        "Scope": "local"

    }

]

2.用卷创建一个容器:

[root@docker sky9890]#

docker run -d  --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx        

unknown flag: --mount

[root@docker sky9890]# docker run -d -it --name=nginx-001  -v nginx-vol:/usr/share/nginx/html nginx   

2c3e14431a622a4c9af303596853cc5b59696c42c4da5e264dfc190e7f5f4c71

#执行nginx-001容器

[root@docker sky9890]# docker exec -it nginx-001 bash

root@2c3e14431a62:/#

root@2c3e14431a62:/# cd /usr/share/nginx/html/

root@2c3e14431a62:/usr/share/nginx/html# ls

50x.html  index.html

#在容器中创建一个test.html文件

root@2c3e14431a62:/usr/share/nginx/html# touch test.html

root@2c3e14431a62:/usr/share/nginx/html# ls

50x.html  index.html  test.html

root@2c3e14431a62:/usr/share/nginx/html# vim test.html

<html>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<h2>欢迎学习Docker!</h2>

</html>

#在volumes数据卷中同步了容器中创建的文件

[root@docker sky9890]# cd /var/lib/docker/volumes/nginx-vol/_data/

[root@docker _data]# ls

50x.html  index.html

[root@docker _data]# ls

50x.html  index.html  test.html

#删除所有容器

#Docker rm –f $(docker ps –q –a)

#Docker ps -a

#创建nginx-003容器 

[root@docker _data]# docker run -d -it --name=nginx-003  -p 8081:80 -v nginx-vol:/usr/share/nginx/html nginx    

7aacbe13f3817e54965e0c7d48969d465665a28e4413b418066385805a08b60f

#停止nginx-test容器

[root@docker _data]# docker container stop nginx-test

nginx-test

#删除nginx-test容器

[root@docker _data]# docker container rm nginx-test

nginx-test

#无法删除nginx-vol卷,原因是还在使用

[root@docker _data]# docker volume rm nginx-vol

Error response from daemon: Unable to remove volume, volume still in use: remove nginx-vol: volume is in use - [2c3e14431a622a4c9af303596853cc5b59696c42c4da5e264dfc190e7f5f4c71, e64dab498554ee101b0157cbbf4fbe5d5295ec2519327c6afbe042e60222d618, 7aacbe13f3817e54965e0c7d48969d465665a28e4413b418066385805a08b60f]

docker stop nginx-vol

docker volume rm nginx-vol

docker stop nginx-001

docker stop nginx-002

docker stop nginx-003

[root@docker _data]# docker ps

#将所有容器停止了也法删除nginx-vol卷

小结:

1.如果没有指定卷,则会自动创建。

2.教练建议使用—mount,更通用。但是使用mount就报错。

三.Bind Mounts

#先删除所有容器

[root@docker sky9890]# docker rm -f $(docker ps -q -a)

7aacbe13f381

e64dab498554

2c3e14431a62

01791c36ed28

......

fe6672a1ba22

#创建卷

#方式一:必须先创建原有目录,否则报错

[root@docker sky9890]# mkdir -p /app/wwwrott

[root@docker sky9890]#

docker run -d -it --name=nginx-test

--mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx

unknown flag: --mount 

#mount报错

 方式二:

[root@docker sky9890]# docker run -d -it --name=nginx-test

-v  /app/wwwroot:/usr/share/nginx/html nginx

ee97dec7d52b310eb3d93f42e05f272e3f97e23b5c49625966310d86b834ab0d

#执行容器

[root@docker sky9890]# docker exec -it nginx-test bash

root@ee97dec7d52b:/#

root@ee97dec7d52b:/usr/share/nginx/html# ls

root@ee97dec7d52b:/usr/share/nginx/html# ls

index.html

root@ee97dec7d52b:/usr/share/nginx/html# cat index.html

<html>

<meta http-equive="Cent-Type" content="text/html; charset=utf-8" />

<h2>欢迎学习Docker!</h2>

</html>

 #在宿主机上创建index.html,会同步到容器指定目录中

[root@docker wwwroot]# pwd

/app/wwwroot

[root@docker wwwroot]# ls

[root@docker wwwroot]# touch index.html

[root@docker wwwroot]# ls

index.html

[root@docker wwwroot]# vim index.html

<html>

<meta http-equive="Cent-Type" content="text/html; charset=utf-8" />

<h2>欢迎学习Docker!</h2>

</html>

#验证绑定

[root@docker wwwroot]# docker inspect nginx-test

#docker container stop nginx-test

#docker container rm nginx-test

小结:

1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误 。

2.如果挂载目录在容器中非空目录,则该目录现有内容将被隐藏。

四.创建数据卷容器过程中的问题

在使用volume与Bind Mounts创建容器中使用的mount参数会报如下错误:

Docker Unknown flag --mount

原因如下:

docker run support for the --mount option was only introduced in Docker 17.06. You are using Docker 1.13.1. You have two choices:

1. Update to Docker 17.06 or later if you can;

2. Use the -v approach to bind mount the volume you require e.g. docker run -v $(pwd):/home

解决步骤:升级docker版本

1.查找主机上相关软件包

[root@docker /]# rpm -qa|grep docker

docker-1.13.1-108.git4ef4b30.el7.centos.x86_64

docker-client-1.13.1-108.git4ef4b30.el7.centos.x86_64

docker-common-1.13.1-108.git4ef4b30.el7.centos.x86_64

2.卸载软件相关包

[root@docker /]# yum remove docker-1.13.1-108.git4ef4b30.el7.centos.x86_64

警告:/etc/sysconfig/docker-storage 已另存为 /etc/sysconfig/docker-storage.rpmsave

警告:/etc/docker/daemon.json 已另存为 /etc/docker/daemon.json.rpmsave

[root@docker /]#yum remove docker-client-1.13.1-108.git4ef4b30.el7.centos.x86_64

[root@docker /]# ym remove docker-common-1.13.1-108.git4ef4b30.el7.centos.x86_64

[root@docker sky9890]# docker

bash: docker: 未找到命令

3.升级到最新版本

 [root@docker sky9890]# curl -fssl https://get.docker.com/ |sh

If you would like to use Docker as a non-root user, you should now consider

adding your user to the "docker" group with something like:

   sudo usermod -aG docker your-user

 Remember that you will have to log out and back in for this to take effect!

 WARNING: Adding a user to the "docker" group will grant the ability to run

         containers which can be used to obtain root privileges on the

         docker host.

         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface

         for more information.

4.重启Docker

#systemctl rstart docker

5.设置开机启动

#systemctl enable docker

6.查看docker版本信息

[root@docker sky9890]# docker version

Client: Docker Engine - Community

 Version:           19.03.7

 API version:       1.40

 Go version:        go1.12.17

 Git commit:        7141c199a2

 Built:             Wed Mar  4 01:24:10 2020

 OS/Arch:           linux/amd64

 Experimental:      false

......

7.查看容器信息

[root@docker sky9890]# docker info

Client:

......

 Kernel Version: 3.10.0-862.11.6.el7.x86_64

 Operating System: CentOS Linux 7 (Core)

 OSType: linux

 Architecture: x86_64

 CPUs: 1

 Total Memory: 983.3MiB

 Name: docker

 ID: E33X:T43J:BY3N:CFKG:6L7Q:XSGB:JZPA:GFNI:QHT5:LSAU:YDZW:BPAI

 Docker Root Dir: /var/lib/docker

 Debug Mode: false

 Registry: https://index.docker.io/v1/

 Labels:

 Experimental: false

 Insecure Registries:

  127.0.0.0/8

 Live Restore Enabled: false

WARNING: IPv4 forwarding is disabled

WARNING: bridge-nf-call-iptables is disabled

WARNING: bridge-nf-call-ip6tables is disabled

8.查看镜像

[root@docker sky9890]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

sky9899             self                1302c27299d6        20 hours ago        1.22MB

busybox             v2                  6e9545b1e2a2        20 hours ago        1.22MB

tomcat              latest              4e7840b49fad        6 days ago          529MB

nginx               latest              a1523e859360        7 days ago          127MB

python              3.5                 0320ef7199ca        7 days ago          909MB

mysql               latest              c8ad2be69a22        7 days ago          465MB

php                 latest              e66ae809d99a        7 days ago          405MB

httpd               latest              c5a012f9cf45        7 days ago          165MB

mongo               latest              bcef5fd2979d        12 days ago         386MB

ubuntu              latest              72300a873c2c        12 days ago         64.2MB

centos              latest              470671670cac        6 weeks ago         237MB

busybox             latest              6d5fcfe5ff17        2 months ago        1.22MB

nginx               1.11                5766334bdaa0        2 years ago         183MB

nginx               1.11                5766334bdaa0        2 years ago         183MB

nginx               v1                  5766334bdaa0        2 years ago         183MB

 WARNING: IPv4 forwarding is disabled

 WARNING: bridge-nf-call-iptables is disabled

WARNING: bridge-nf-call-ip6tables is disabled

9.解决上述三年报警问题

[root@docker sky9890]# vim /etc/sysctl.conf

net.ipv4.ip_forward=1

net.bridge.bridge-nf-call-ip6tables=1

net.bridge.bridge-nf-call-iptables=1

[root@docker sky9890]# sysctl -p

10.测试mount

[root@docker sky9890]# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx

Unable to find image 'nginx:latest' locally

latest: Pulling from library/nginx

68ced04f60ab: Already exists

28252775b295: Pull complete

a616aa3b0bf2: Pull complete

Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b

Status: Downloaded newer image for nginx:latest

docker: Error response from daemon: Conflict. The container name "/nginx-test" is already in use by container "ee97dec7d52b310eb3d93f42e05f272e3f97e23b5c49625966310d86b834ab0d". You have to remove (or rename) that container to be able to reuse that name.

See 'docker run --help'.

[root@docker sky9890]# docker run -d -it --name=nginx  --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx    

15ef64d51e113d571b0cb6fb89d3b891bcba826f4cc2ae2e3ad584294274aa9d

[root@docker sky9890]# docker start nginx

nginx

[root@docker sky9890]# docker exec -it nginx bash

root@15ef64d51e11:/#

root@15ef64d51e11:/# ls /usr/share/nginx/html/test.html

/usr/share/nginx/html/test.html

root@15ef64d51e11:/# cat  /usr/share/nginx/html/test.html  

<html>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<h2>

Sovle Docker Unknown flag --mount

</h2>

</html>

#在宿舍机上创建一个文件,会同步到容器指定目录下

[root@docker wwwroot]# vim  test.html

<html>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<h2>

Sovle Docker Unknown flag --mount

</h2>

</html>

 #重新创建一个容器,并指一个端口 

[root@docker sky9890]# docker run -d -it --name=nginx01  -p 8080:80  --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx    

6cc7f85a4cd1cc0fb23f2a60a1ae74bec2812d7a607ce7800f9f2db97ba8a052

#测试成功

Docker的数据管理方式

Docker的数据管理方式


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI