Docker的学习第五天

容器数据卷

什么是容器数据卷

将应用和环境打包成一个镜像

数据?如果数据在容器中,那么我们容器删除,数据就会丢失,需求:数据可以持久化

mysql 容器删除了,删库跑路,需求:mysql 数据可以存储到本地

容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地,这就是卷技术,其实就是目录的挂载,将容器内的目录挂载到linux上面。

 

 

 总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的

使用数据卷:

方式一:直接使用命令来挂载   -v

docker run -d -v 主机目录:容器内目录 -p 8080:8080 tomcat

以下实例是挂载centos,将/home/dockerhome 与容器内的/home目录挂载,然后在容器的home 目录下添加a.java,然后发现主机内的/home/dockerhome也会添加一个文件

[root@fengfang home]# docker run -d -it -v /home/dockerhome:/home centos /bin/bash   #在运行命令时添加挂载
7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8
[root@fengfang home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
7037b6dad3e0        centos              "/bin/bash"         5 seconds ago       Up 4 seconds                                 nostalgic_kepler
485841b533c9        tomcat              "catalina.sh run"   4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang home]# docker inspect 7037b6dad3e0
[
    {
        "Id": "7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8",
        "Created": "2020-07-24T07:07:05.47552362Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 11574,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-07-24T07:07:05.862310225Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f",
        "ResolvConfPath": "/var/lib/docker/containers/7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8/hostname",
        "HostsPath": "/var/lib/docker/containers/7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8/hosts",
        "LogPath": "/var/lib/docker/containers/7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8/7037b6dad3e0685b2b0c693fc29dc2e6559305118f9c626abafb00c7c28735b8-json.log",
        "Name": "/nostalgic_kepler",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/home/dockerhome:/home"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/57ccb698bbb0c3b628e2e0c9a6fe3b709162be9ee2165afce0a98140f7e7a02c-init/diff:/var/lib/docker/overlay2/90d1bf1010ba7baa53e0c501ef54f03d712cdb502e5bcd641290231e641baf98/diff",
                "MergedDir": "/var/lib/docker/overlay2/57ccb698bbb0c3b628e2e0c9a6fe3b709162be9ee2165afce0a98140f7e7a02c/merged",
                "UpperDir": "/var/lib/docker/overlay2/57ccb698bbb0c3b628e2e0c9a6fe3b709162be9ee2165afce0a98140f7e7a02c/diff",
                "WorkDir": "/var/lib/docker/overlay2/57ccb698bbb0c3b628e2e0c9a6fe3b709162be9ee2165afce0a98140f7e7a02c/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [    #以下为挂载的信息
            {
                "Type": "bind",
                "Source": "/home/dockerhome",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "7037b6dad3e0",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200611",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "c75ecfb87d294aeaea5dc7336a88fcbf396a3686a117c4c3731474f7b9c6fecb",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/c75ecfb87d29",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "528ae202042ddab9bbbcb9fd8c50baacb51f7cf2ae14b071f857b588c31a7cc9",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "cf46d1c8ba62a61e8dc02417d0882c3b89811d9a741374166d5eb94f760aa8ab",
                    "EndpointID": "528ae202042ddab9bbbcb9fd8c50baacb51f7cf2ae14b071f857b588c31a7cc9",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@fengfang home]# docker attach 7037b6dad3e0
[root@7037b6dad3e0 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7037b6dad3e0 /]# cd home
[root@7037b6dad3e0 home]# touch a.java    #添加文件命令
[root@7037b6dad3e0 home]# ls
a.java
[root@7037b6dad3e0 home]# read escape sequence
[root@fengfang home]# ls
dockerhome  lxh
[root@fengfang home]# cd dockerhome/
[root@fengfang dockerhome]# ls
a.java

 挂载成功后,在主机上修改文件,发现容器内的文件也会同步,所以是双向的同步

[root@fengfang dockerhome]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
7037b6dad3e0        centos              "/bin/bash"         7 minutes ago       Up 7 minutes                                 nostalgic_kepler
485841b533c9        tomcat              "catalina.sh run"   4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang dockerhome]# cat a.java   #在主机上修改文件内容为这样
import java.lang;

class A{
    private int a;
}
[root@fengfang dockerhome]# 
[root@fengfang dockerhome]# docker attach 7037b6dad3e0
[root@7037b6dad3e0 home]# ls
a.java
[root@7037b6dad3e0 home]# cat a.java 
import java.lang;

class A{
    private int a;
}
[root@7037b6dad3e0 home]# 

 实战:安装 mysql

思考:mysql的数据持久化的问题

1、下载mysql镜像

docker pull mysql:5.7

2、安装mysql,并挂载目录到主机上,安装mysql需要配置密码的,可以参照官方命令参数: -e MYSQL_ROOT_PASSWORD=my-secret-pw

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@fengfang /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec8c9369e08: Pull complete 
177e5de89054: Pull complete 
ab6ccb86eb40: Pull complete 
e1ee78841235: Pull complete 
09cd86ccee56: Pull complete 
78bea0594a44: Pull complete 
caf5f529ae89: Pull complete 
4e54a8bcf566: Pull complete 
50c21ba6527b: Pull complete 
68e74bb27b39: Pull complete 
5f13eadfe747: Pull complete 
Digest: sha256:97869b42772dac5b767f4e4692434fbd5e6b86bcb8695d4feafb52b59fe9ae24
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@fengfang /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat_aaron        1.0                 671de9f0cd4f        4 hours ago         652MB
tomcat              9.0                 b4f6a90c69a4        23 hours ago        647MB
tomcat              latest              b4f6a90c69a4        23 hours ago        647MB
mysql               5.7                 8679ced16d20        35 hours ago        448MB
centos              latest              831691599b88        5 weeks ago         215MB
[root@fengfang /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7
95f36a56e533f39e8fc9af32715c97cddfa20d7503f50620f3a8152d4c121e0d
[root@fengfang /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
95f36a56e533        mysql:5.7           "docker-entrypoint.s…"   4 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   upbeat_torvalds
485841b533c9        tomcat              "catalina.sh run"        4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp              tomcat02

然后使用navicat premium 去连接,发现是可以连接成功,那表示我们的mysql是启动成功的,并在容器的数据库中添加数据库test,然后我们查看/home/mysql/data 目录,你会发现文件是同步成功的

[root@fengfang data]# cd /
[root@fengfang /]# cd /home/mysql
[root@fengfang mysql]# ls
conf  data
[root@fengfang mysql]# cd data
[root@fengfang data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test
[root@fengfang data]# ll
总用量 188484
-rw-r-----. 1 polkitd input       56 7月  24 15:28 auto.cnf
-rw-------. 1 polkitd input     1676 7月  24 15:28 ca-key.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 ca.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 client-cert.pem
-rw-------. 1 polkitd input     1680 7月  24 15:28 client-key.pem
-rw-r-----. 1 polkitd input     1353 7月  24 15:28 ib_buffer_pool
-rw-r-----. 1 polkitd input 79691776 7月  24 15:28 ibdata1
-rw-r-----. 1 polkitd input 50331648 7月  24 15:28 ib_logfile0
-rw-r-----. 1 polkitd input 50331648 7月  24 15:28 ib_logfile1
-rw-r-----. 1 polkitd input 12582912 7月  24 15:30 ibtmp1
drwxr-x---. 2 polkitd input     4096 7月  24 15:28 mysql
drwxr-x---. 2 polkitd input     8192 7月  24 15:28 performance_schema
-rw-------. 1 polkitd input     1680 7月  24 15:28 private_key.pem
-rw-r--r--. 1 polkitd input      452 7月  24 15:28 public_key.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 server-cert.pem
-rw-------. 1 polkitd input     1680 7月  24 15:28 server-key.pem
drwxr-x---. 2 polkitd input     8192 7月  24 15:28 sys
drwxr-x---. 2 polkitd input       20 7月  24 15:35 test

后期我们将容器删除,再查看主机的文件是没有被删除的,也即容器删除,数据是可以持久化的

[root@fengfang data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
95f36a56e533        mysql:5.7           "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   upbeat_torvalds
485841b533c9        tomcat              "catalina.sh run"        4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp              tomcat02
[root@fengfang data]# docker rm -f 95f36a56e533    #删除容器
95f36a56e533
[root@fengfang data]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
485841b533c9        tomcat              "catalina.sh run"   4 hours ago         Up 4 hours          0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS                    NAMES
7037b6dad3e0        centos              "/bin/bash"         31 minutes ago      Exited (127) 19 minutes ago                            nostalgic_kepler
485841b533c9        tomcat              "catalina.sh run"   4 hours ago         Up 4 hours                    0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang data]# cd /
[root@fengfang /]# cd /home/mysql/
[root@fengfang mysql]# ll
总用量 4
drwxr-xr-x. 2 root    root    6 7月  24 15:28 conf
drwxr-xr-x. 6 polkitd root 4096 7月  24 15:35 data
[root@fengfang mysql]# cd data
[root@fengfang data]# ll  #查看目录 ,文件还是存在的
总用量 188484
-rw-r-----. 1 polkitd input       56 7月  24 15:28 auto.cnf
-rw-------. 1 polkitd input     1676 7月  24 15:28 ca-key.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 ca.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 client-cert.pem
-rw-------. 1 polkitd input     1680 7月  24 15:28 client-key.pem
-rw-r-----. 1 polkitd input     1353 7月  24 15:28 ib_buffer_pool
-rw-r-----. 1 polkitd input 79691776 7月  24 15:28 ibdata1
-rw-r-----. 1 polkitd input 50331648 7月  24 15:28 ib_logfile0
-rw-r-----. 1 polkitd input 50331648 7月  24 15:28 ib_logfile1
-rw-r-----. 1 polkitd input 12582912 7月  24 15:30 ibtmp1
drwxr-x---. 2 polkitd input     4096 7月  24 15:28 mysql
drwxr-x---. 2 polkitd input     8192 7月  24 15:28 performance_schema
-rw-------. 1 polkitd input     1680 7月  24 15:28 private_key.pem
-rw-r--r--. 1 polkitd input      452 7月  24 15:28 public_key.pem
-rw-r--r--. 1 polkitd input     1112 7月  24 15:28 server-cert.pem
-rw-------. 1 polkitd input     1680 7月  24 15:28 server-key.pem
drwxr-x---. 2 polkitd input     8192 7月  24 15:28 sys
drwxr-x---. 2 polkitd input       20 7月  24 15:35 test
[root@fengfang data]# 

 什么是具名挂载、匿名挂载?

-v 容器内路径       #匿名挂载

docker run -d -P --name nginx01 -v /etc/nginx nginx    #-P(大写P)表示随机端口

# 查看所有的 volume 的列表

docker volume ls   #查看所有卷的情况 ,都是匿名的,这里发现路径都是随机生成的目录,如下图这样的

 

 

 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx  #使用具名挂载启动nginx,再使用docker volume ls查看时,如下图这样

 

 

通过-v 卷名:容器路径   这样表示具名挂载,而若直接 -v 容器路径,则表示是匿名挂载,至于挂载的位置在那里,若是具名的可以使用下面的命令

docker volume inspect juming-nginx    #查看具名的挂载路径

查看挂载的路径

 

 

 所有的docker容器的卷,没有指定目录的情况下,即匿名挂载时,都是在/var/lib/docker/volumes/xxxxx,都是在这个目录 ,

我们通过具名挂载,可以方便的在/var/lib/docker/volumes这个目录 下找到我们卷,大多数情况下都是使用具名挂载。

 

 

 在上面框中得到nginx的配置文件,通过修改这个配置文件可以修改容器的配置文件。

如何确定是具名挂载还是匿名挂载,或都是指定路径挂载呢?

-v 容器内路径             #匿名挂载

-v 卷名:容器内路径     #具名挂载

-v /宿主机路径:容器内路径   #指定路径挂载

扩展内容

通过   -v   容器内容路径:ro  /rw   改变读写权限

ro      readonly    只读

rw     readwrite    可读可写

#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了

docker run -d -P  --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P  --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

备注:ro,只要看到这个,就说明只能通过宿主机来操作,容器内部无法操作

 

初识Dockerfile

Dockerfile 就是用来构建Docker的镜像文件的命令脚本,通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本是一个一个的命令

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------------end-------------"
CMD /bin/bash

以下为通过dockerfile 来生成一个镜像的示例:

步骤:

1、创建一个dockerfile文件,名称可以随机,一般建议使用Dockerfile

2、文件中的命令(大写),参数

3、每个命令就是镜像的一层

[root@fengfang home]# pwd
/home
[root@fengfang home]# ls
dockerhome  docker-test-volume  lxh  mysql
[root@fengfang home]# cd docker-test-volume/
[root@fengfang docker-test-volume]# pwd
/home/docker-test-volume
[root@fengfang docker-test-volume]# vim dockerfile
[root@fengfang docker-test-volume]# cat dockerfile 
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------------end-------------"
CMD /bin/bash
[root@fengfang docker-test-volume]# docker build -f dockerfile -t aaron/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 831691599b88
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 844924b73eaa
Removing intermediate container 844924b73eaa
 ---> 00adde9b1ac2
Step 3/4 : CMD echo "------------end-------------"
 ---> Running in 4fc503c188cc
Removing intermediate container 4fc503c188cc
 ---> fc128039aa6f
Step 4/4 : CMD /bin/bash
 ---> Running in 17c7a2eb59af
Removing intermediate container 17c7a2eb59af
 ---> c20bce8652d2
Successfully built c20bce8652d2
Successfully tagged aaron/centos:1.0
[root@fengfang docker-test-volume]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
aaron/centos        1.0                 c20bce8652d2        59 seconds ago      215MB
tomcat_aaron        1.0                 671de9f0cd4f        2 days ago          652MB
tomcat              9.0                 b4f6a90c69a4        3 days ago          647MB
tomcat              latest              b4f6a90c69a4        3 days ago          647MB
mysql               5.7                 8679ced16d20        4 days ago          448MB
nginx               latest              8cf1bfb43ff5        4 days ago          132MB
centos              latest              831691599b88        5 weeks ago         215MB
[root@fengfang docker-test-volume]# 

以下为启动自己生成的镜像实例:

[root@fengfang docker-test-volume]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
aaron/centos        1.0                 c20bce8652d2        59 seconds ago      215MB
tomcat_aaron        1.0                 671de9f0cd4f        2 days ago          652MB
tomcat              9.0                 b4f6a90c69a4        3 days ago          647MB
tomcat              latest              b4f6a90c69a4        3 days ago          647MB
mysql               5.7                 8679ced16d20        4 days ago          448MB
nginx               latest              8cf1bfb43ff5        4 days ago          132MB
centos              latest              831691599b88        5 weeks ago         215MB
[root@fengfang docker-test-volume]# cd /
[root@fengfang /]# docker run -it c20bce8652d2 /bin/bash
[root@75154fd46e97 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01    volume02
[root@75154fd46e97 /]# ll
bash: ll: command not found
[root@75154fd46e97 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jul 27 01:58 dev
drwxr-xr-x.   1 root root  66 Jul 27 01:58 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Jun 11 02:35 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 163 root root   0 Jul 27 01:58 proc
dr-xr-x---.   2 root root 162 Jun 11 02:35 root
drwxr-xr-x.  11 root root 163 Jun 11 02:35 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jul 24 03:29 sys
drwxrwxrwt.   7 root root 145 Jun 11 02:35 tmp
drwxr-xr-x.  12 root root 144 Jun 11 02:35 usr
drwxr-xr-x.  20 root root 262 Jun 11 02:35 var
drwxr-xr-x.   2 root root   6 Jul 27 01:58 volume01    #刚自己挂载的目录 
drwxr-xr-x.   2 root root   6 Jul 27 01:58 volume02
[root@75154fd46e97 /]# 

通过我们查看这个容器的id信息,可以看到是有匿名挂载了两个目录的,在容器中创建了一个文件,也发现在挂载目录中文件是有同步过来的,如下面命令2中红色部分

[root@75154fd46e97 /]# cd volume001
bash: cd: volume001: No such file or directory
[root@75154fd46e97 /]# cd volume01
[root@75154fd46e97 volume01]# ls
[root@75154fd46e97 volume01]# cat test.java
cat: test.java: No such file or directory
[root@75154fd46e97 volume01]# touch test.java
[root@75154fd46e97 volume01]# ls
test.java
[root@75154fd46e97 volume01]# 

 

[root@fengfang conf]# docker inspect 75154fd46e97
[
    {
        "Id": "75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9",
        "Created": "2020-07-27T01:58:04.500855774Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 21432,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-07-27T01:58:04.963285901Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:c20bce8652d243e59a534c27f776e10d104815312f3517d465188955d2d27d9a",
        "ResolvConfPath": "/var/lib/docker/containers/75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9/hostname",
        "HostsPath": "/var/lib/docker/containers/75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9/hosts",
        "LogPath": "/var/lib/docker/containers/75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9/75154fd46e977dff9582c28748c731314c320b76660401c00dd5423714f5fec9-json.log",
        "Name": "/reverent_mendeleev",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/68a2fff3bf87d14849a98ff13b217e876e3da63e138c107d30881e5efc90eaad-init/diff:/var/lib/docker/overlay2/90d1bf1010ba7baa53e0c501ef54f03d712cdb502e5bcd641290231e641baf98/diff",
                "MergedDir": "/var/lib/docker/overlay2/68a2fff3bf87d14849a98ff13b217e876e3da63e138c107d30881e5efc90eaad/merged",
                "UpperDir": "/var/lib/docker/overlay2/68a2fff3bf87d14849a98ff13b217e876e3da63e138c107d30881e5efc90eaad/diff",
                "WorkDir": "/var/lib/docker/overlay2/68a2fff3bf87d14849a98ff13b217e876e3da63e138c107d30881e5efc90eaad/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "d83d2e65aafea735ad04993e9515ad21cf84ce20d66bf7bc5fce9149d760bb03",
                "Source": "/var/lib/docker/volumes/d83d2e65aafea735ad04993e9515ad21cf84ce20d66bf7bc5fce9149d760bb03/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "4ae0190142893f43a21d4a787061df3296493c6e689ae1ccad408c922ce19537",
                "Source": "/var/lib/docker/volumes/4ae0190142893f43a21d4a787061df3296493c6e689ae1ccad408c922ce19537/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "75154fd46e97",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "c20bce8652d2",
            "Volumes": {
                "volume01": {},
                "volume02": {}
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200611",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "b360674a4921097cc76e9dbfa825437368014e1693eccf35d64691adf025a935",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/b360674a4921",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "0dc8628aea735e6c363fa52ab7320ac726b89143fb043f65f70134f5ac1be33c",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.5",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:05",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "cf46d1c8ba62a61e8dc02417d0882c3b89811d9a741374166d5eb94f760aa8ab",
                    "EndpointID": "0dc8628aea735e6c363fa52ab7320ac726b89143fb043f65f70134f5ac1be33c",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.5",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:05",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@fengfang conf]# cd /home/
[root@fengfang home]# ls
dockerhome  docker-test-volume  lxh  mysql
[root@fengfang home]# cd docker-test-volume/
[root@fengfang docker-test-volume]# ls
dockerfile
[root@fengfang docker-test-volume]# cd dockerfile 
-bash: cd: dockerfile: 不是目录
[root@fengfang docker-test-volume]# cd /
[root@fengfang /]# cd /var/lib/docker/volumes/d83d2e65aafea735ad04993e9515ad21cf84ce20d66bf7bc5fce9149d760bb03/_data
[root@fengfang _data]# ls
test.java
[root@fengfang _data]# 

 假设构建镜像时候没有挂载卷,要手动镜像挂载,-v 卷名:容器内路径

数据卷容器

多个mysql同步数据实例

 

 启动三个容器,通过我们自己生成的镜像来启动,通过docker02 启动时使用 --volumes-from docker01,从docker01中继承过来,最后发现在docker01里面的挂载目录下变更会同步到docker02相同目录 中

[root@fengfang /]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
1dbf1fa79834        aaron/centos:1.0    "/bin/bash"         41 minutes ago      Up 41 minutes                                friendly_wescoff
485841b533c9        tomcat              "catalina.sh run"   2 days ago          Up 2 days           0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker stop 1dbf1fa79834
1dbf1fa79834
[root@fengfang /]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
485841b533c9        tomcat              "catalina.sh run"   2 days ago          Up 2 days           0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                    NAMES
2b3d38fefa45        aaron/centos:1.0    "/bin/sh -c /bin/bash"   40 minutes ago      Exited (127) 2 minutes ago                             docker02
1dbf1fa79834        aaron/centos:1.0    "/bin/bash"              42 minutes ago      Exited (0) 4 seconds ago                               friendly_wescoff
75154fd46e97        c20bce8652d2        "/bin/bash"              About an hour ago   Exited (127) 44 minutes ago                            reverent_mendeleev
f51c96a3220f        nginx               "/docker-entrypoint.…"   About an hour ago   Exited (0) 43 minutes ago                              nginx02
d634ebb25c16        nginx               "/docker-entrypoint.…"   2 hours ago         Exited (0) 43 minutes ago                              nginx01
7037b6dad3e0        centos              "/bin/bash"              2 days ago          Exited (127) 2 days ago                                nostalgic_kepler
485841b533c9        tomcat              "catalina.sh run"        2 days ago          Up 2 days                     0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker rm 2b3d38fefa45
2b3d38fefa45
[root@fengfang /]# docker rm 1dbf1fa79834
1dbf1fa79834
[root@fengfang /]# docker rm 7037b6dad3e0
7037b6dad3e0
[root@fengfang /]# docer ps -a
-bash: docer: 未找到命令
[root@fengfang /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                    NAMES
75154fd46e97        c20bce8652d2        "/bin/bash"              About an hour ago   Exited (127) 45 minutes ago                            reverent_mendeleev
f51c96a3220f        nginx               "/docker-entrypoint.…"   2 hours ago         Exited (0) 44 minutes ago                              nginx02
d634ebb25c16        nginx               "/docker-entrypoint.…"   2 hours ago         Exited (0) 43 minutes ago                              nginx01
485841b533c9        tomcat              "catalina.sh run"        2 days ago          Up 2 days                     0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker rm 75154fd46e97,f51c96a3220f,d634ebb25c16
Error: No such container: 75154fd46e97,f51c96a3220f,d634ebb25c16
[root@fengfang /]# docker rm 75154fd46e97 f51c96a3220f d634ebb25c16
75154fd46e97
f51c96a3220f
d634ebb25c16
[root@fengfang /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
485841b533c9        tomcat              "catalina.sh run"   2 days ago          Up 2 days           0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# clear
[root@fengfang /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
aaron/centos        1.0                 c20bce8652d2        About an hour ago   215MB
tomcat_aaron        1.0                 671de9f0cd4f        2 days ago          652MB
tomcat              9.0                 b4f6a90c69a4        3 days ago          647MB
tomcat              latest              b4f6a90c69a4        3 days ago          647MB
mysql               5.7                 8679ced16d20        4 days ago          448MB
nginx               latest              8cf1bfb43ff5        5 days ago          132MB
centos              latest              831691599b88        5 weeks ago         215MB
[root@fengfang /]# docker run -it --name docker01 aaron/centos:1.0  
[root@09b47d5a1b05 /]# [root@fengfang /]# 
[root@fengfang /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
09b47d5a1b05        aaron/centos:1.0    "/bin/sh -c /bin/bash"   12 seconds ago      Up 12 seconds                                docker01
485841b533c9        tomcat              "catalina.sh run"        2 days ago          Up 2 days           0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker run -it --name docker02 --volumes-from docker01 aaron/centos:1.0
[root@bc827fb3a502 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jul 27 03:02 dev
drwxr-xr-x.   1 root root  66 Jul 27 03:02 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Jun 11 02:35 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 160 root root   0 Jul 27 03:02 proc
dr-xr-x---.   2 root root 162 Jun 11 02:35 root
drwxr-xr-x.  11 root root 163 Jun 11 02:35 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jul 24 03:29 sys
drwxrwxrwt.   7 root root 145 Jun 11 02:35 tmp
drwxr-xr-x.  12 root root 144 Jun 11 02:35 usr
drwxr-xr-x.  20 root root 262 Jun 11 02:35 var
drwxr-xr-x.   2 root root   6 Jul 27 03:01 volume01
drwxr-xr-x.   2 root root   6 Jul 27 03:01 volume02
[root@bc827fb3a502 /]# [root@fengfang /]# 
[root@fengfang /]# docker attach 09b47d5a1b05
[root@09b47d5a1b05 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jul 27 03:01 dev
drwxr-xr-x.   1 root root  66 Jul 27 03:01 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Jun 11 02:35 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 160 root root   0 Jul 27 03:01 proc
dr-xr-x---.   2 root root 162 Jun 11 02:35 root
drwxr-xr-x.  11 root root 163 Jun 11 02:35 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Jul 24 03:29 sys
drwxrwxrwt.   7 root root 145 Jun 11 02:35 tmp
drwxr-xr-x.  12 root root 144 Jun 11 02:35 usr
drwxr-xr-x.  20 root root 262 Jun 11 02:35 var
drwxr-xr-x.   2 root root   6 Jul 27 03:01 volume01
drwxr-xr-x.   2 root root   6 Jul 27 03:01 volume02
[root@09b47d5a1b05 /]# cd volume001
bash: cd: volume001: No such file or directory
[root@09b47d5a1b05 /]# cd volume01
[root@09b47d5a1b05 volume01]# ls
[root@09b47d5a1b05 volume01]# touch test.java    #在容器1内创建文件
[root@09b47d5a1b05 volume01]# ls
test.java
[root@09b47d5a1b05 volume01]# read escape sequence
[root@fengfang /]# docker attach bc827fb3a502
[root@bc827fb3a502 /]# ls 
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01    volume02
[root@bc827fb3a502 /]# cd volume01
[root@bc827fb3a502 volume01]# ls   #在容器2内发现也有创建这个文件
test.java 
[root@bc827fb3a502 volume01]# 

使用--volumes-from 可以实现多个容器之间的数据同步,就算源容器删除了,同步的容器的数据不会被删除,通过这种方式可以实现多个数据库同步到一个数据库中,实现的方式是双向拷贝方式。

docker01的数据会同步到docker02,docker02数据也会同步到docker01中

以下删除了docker01后,docker02中的文件也是一样可以访问的

[root@fengfang /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bc827fb3a502        aaron/centos:1.0    "/bin/sh -c /bin/bash"   9 minutes ago       Up 9 minutes                                 docker02
09b47d5a1b05        aaron/centos:1.0    "/bin/sh -c /bin/bash"   10 minutes ago      Up 10 minutes                                docker01
485841b533c9        tomcat              "catalina.sh run"        3 days ago          Up 3 days           0.0.0.0:8080->8080/tcp   tomcat02
[root@fengfang /]# docker rm -f 09b47d5a1b05
09b47d5a1b05
[root@fengfang /]# docker attach bc827fb3a502
[root@bc827fb3a502 volume02]# ls
test.java
[root@bc827fb3a502 volume02]# 

多个mysql实现数据共享:

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#这样可以实现两个容器的数据同步

结论:

容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦你持久化到本地,这个时候,本地的数据是不会删除的。

 

posted @ 2020-07-24 15:49  aaron616  阅读(398)  评论(0)    收藏  举报