machine管理虚拟机器volume数据卷操作

Posted qlqwjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了machine管理虚拟机器volume数据卷操作相关的知识,希望对你有一定的参考价值。

1.machine操作

  Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。(我们按照docker的时候安装了virtualbox)

  Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。

  Docker Machine 管理的虚拟主机可以是机上的,也可以是云供应商,如阿里云,腾讯云,AWS,或 DigitalOcean。

  使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信

安装 Docker Machine 之前你需要先安装 Docker。

Docker Mechine 可以在多种平台上安装使用,包括 Linux 、MacOS 以及 windows。

1.linux下面安装docker machine

$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

 

2.windows下面安装docker machine

windows下面可以用git bash操作,git bash实际上是一个虚拟的linux环境。

$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  mkdir -p "$HOME/bin" &&
  curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" &&
  chmod +x "$HOME/bin/docker-machine.exe"

查看是否安装成功:

C:UsersAdministrator>docker-machine version
docker-machine version 0.14.0, build 89b8332

  windows安装docker的时候默认已经安装了docker-machine,可以直接使用。

 

3.基本使用

(1)列出可用的机器

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5

(2)创建机器

创建一台名为 test 的机器。

docker-machine create --driver virtualbox test

--driver:指定用来创建机器的驱动类型,这里是 virtualbox。

(3)查看机器的IP

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5
test      -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.5

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ip test #查看test机器的IP
192.168.99.101

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ip
192.168.99.100

(4)停止机器

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine stop test
Stopping "test"...
Machine "test" was stopped.

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5
test      -        virtualbox   Stopped                                       Unknown

(5)启动机器

$ docker-machine start test
Starting "test"...
(test) Check network to re-create if needed...
(test) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(test) Waiting for an IP...
Machine "test" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

(6)进入机器

docker-machine ssh test

(7)docker-machine 命令参数说明

docker-machine active:查看当前激活状态的 Docker 主机。

config:查看当前激活状态 Docker 主机的连接信息。

creat:创建 Docker 主机

env:显示连接到某个主机需要的环境变量

inspect: 以 json 格式输出指定Docker的详细信息

ip: 获取指定 Docker 主机的地址

kill: 直接杀死指定的 Docker 主机

ls: 列出所有的管理主机

provision: 重新配置指定主机

regenerate-certs: 为某个主机重新生成 TLS 信息

restart: 重启指定的主机

rm: 删除某台 Docker 主机,对应的虚拟机也会被删除

ssh: 通过 SSH 连接到主机上,执行命令

scp: 在 Docker 主机之间以及 Docker 主机和本地主机之间通过 scp 远程复制数据

mount: 使用 SSHFS 从计算机装载或卸载目录

start: 启动一个指定的 Docker 主机,如果对象是个虚拟机,该虚拟机将被启动

status: 获取指定 Docker 主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等

stop: 停止一个指定的 Docker 主机

upgrade: 将一个指定主机的 Docker 版本更新为最新

url: 获取指定 Docker 主机的监听 URL

version: 显示 Docker Machine 的版本或者主机 Docker 版本

help: 显示帮助信息

 

2.volume数据卷操作

  volume提供独立于容器之外的持久化存储,我们知道在容器内部修改之后是不会做持久化存储的。并且volume可以提供容器与容器直接共享的数据。

1. 命令行基本操作

 (1)命令行启动nginx,并且加-v参数指定volume(容器中的路径),--name指定容器名称,-p指定端口映射。

docker run -d --name nginx -v /usr/share/nginx/html -p 8085:80 hub.c.163.com/library/nginx

 

(2)查看所有容器

$ docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
56871ddcbecd        hub.c.163.com/library/nginx   "nginx -g ‘daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:8085->80/tcp   nginx

 

(3)检查容器:以JSON格式打印容器信息

$ docker inspect nginx

 

主要查看下面信息:

        "Mounts": [
            {
                "Type": "volume",
                "Name": "fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73",
                "Source": "/mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

Source指的是本地真实的路径,/mnt 目录一般用于挂载 ,Destination指的是容器里面的路径。

 

(4)由于我们是windows环境,所有本地真实路径实际是虚拟linux机器里面的路径,我们进入虚拟linux环境(docker-machine进入虚拟环境)

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5
test      -        virtualbox   Running   tcp://192.168.99.101:2376           v19.03.5

Administrator@MicroWin10-1535 MINGW64 /e/docker/dockerTest
$ docker-machine ssh default
   ( >)
  /) TC (   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-)           www.tinycorelinux.net

docker@default:~$

 

查看 /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data 目录下文件

docker@default:~$ sudo -i #切换root用户
root@default:~# ls /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data #查看目录内容
50x.html    index.html
root@default:~# cat /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data/index.html #查看index.html的内容
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

(5)进入容器查看内容:

C:UsersAdministrator>docker exec -it 56871ddcbecd bash  #进入容器
root@56871ddcbecd:/# ls /usr/share/nginx/html/
50x.html  index.html
root@56871ddcbecd:/# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

(6)从linux虚拟环境修改nginx主页index.html

root@default:~# echo "it is monday!" > /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data/index.html
root@default:~# cat /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data/index.html
it is monday!

 

(7)再次从容器查看

root@default:~# echo "it is monday!" > /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data/index.html
root@default:~# cat /mnt/sda1/var/lib/docker/volumes/fa9e2d47d162cd7d5859d454727b724847d3720d67b584f1de6cc6ed6b3e6d73/_data/index.html
it is monday!

 

(8)从浏览器查看

技术图片

 

2.运行的时候指定本地路径和容器挂载的路径

docker run -v 本地路径:容器中路径 镜像名称

  代表本地路径挂载到容器中的路径。如果不知道本地路径,会默认分配一个路径,见上面1中操作。

 

(1)启动nginx的时候挂载目录

root@default:~# pwd
/root
root@default:~# docker run -d -p 8085:80 -v $PWD/html:/usr/share/nginx/html --name nginx hub.c.163.com/library/nginx

 

  $PWD/html 代表/root/html目录,这个目录不存在也可以,会自动创建目录,是本地目录。

  /usr.share/nginx/html 代表的是容器中的目录。

(2)inspect 检查容器

root@default:~# docker inspect nginx

 

重要的信息如下:

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

 

(3)本地/root/html目录下新增index.html

root@default:~/html# echo "test" > index.html
root@default:~/html# ls
index.html
root@default:~/html# cat index.html
test

 

(4)进入容器查看

root@default:~/html# docker exec -it 6 bash #交互式进入容器
root@6dd41bf46f52:/# cat /usr/share/nginx/html/index.html  #查看内容
test

 

(5)浏览器访问

技术图片

 

3.--volumes-from 指定从另一个容器中挂载数据目录实现容器间数据共享

  如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载,不启动容器,只是用来作为数据容器。

(1)创建数据目录,并且创建数据容器。因为是数据容器所以只创建不启动,也就是docker create。

root@default:~# mkdir ./container_data #创建数据目录
root@default:~# ls
container_data  html
root@default:~# docker create -v $PWD/container_data:/var/mydata --name container_data alpine  #创建一个容器,只创建不启动。并且指定本地数据目录
2d64a1cc5059b2228bc35a8224b04d6c8a4f432bb375d8e5012ad8807a18867e
root@default:~# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
2d64a1cc5059        alpine                        "/bin/sh"                6 seconds ago       Created                                    container_data
6dd41bf46f52        hub.c.163.com/library/nginx   "nginx -g ‘daemon of…"   29 minutes ago      Up 29 minutes       0.0.0.0:8085->80/tcp   nginx

检查容器

root@default:~# docker inspect container_data

重要的挂载信息:

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/container_data",
                "Destination": "/var/mydata",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

 

(2)启动一个容器查看并用--volumes-from指定引用另一容器的挂载信息

root@default:~# docker run -it --volumes-from container_data ubuntu bash

  指定启动一个ubuntu容器,并且数据挂载信息采用  container_data 容器的信息,实现数据共享。

查看挂载信息

root@509b3d7199df:/# mount|grep mydata
tmpfs on /var/mydata type tmpfs (rw,relatime,size=911900k)

 

创建一个文件到/var/mydata 目录下(这是容器中目录):

root@509b3d7199df:/# cd /var/mydata/
root@509b3d7199df:/var/mydata# ls
root@509b3d7199df:/var/mydata# echo "123" > test.txt
root@509b3d7199df:/var/mydata# cat test.txt
123

 

(3)退出容器到本地真实环境下查看:(发现与容器中保持一致)

root@default:~# cd container_data/
root@default:~/container_data# ls
test.txt
root@default:~/container_data# cat test.txt
123

 

(4)重新启动第二个容器,并进入容器查看文件可以看到已经存在test.txt。前后启动的两个容器实现了数据共享。

root@default:~/container_data# docker run -it --volumes-from container_data ubuntu bash #重新启动一个容器,并指定数据卷采用container_data的数据卷信息
root@d72cf0845ef1:/# cd /var/mydata/
root@d72cf0845ef1:/var/mydata# ls
test.txt
root@d72cf0845ef1:/var/mydata# cat test.txt
123

 

以上是关于machine管理虚拟机器volume数据卷操作的主要内容,如果未能解决你的问题,请参考以下文章

Docker数据卷(volume)管理

Docker 基础知识 - 使用卷(volume)管理应用程序数据

Docker Volume 之权限管理

Docker Volume 之权限管理

Docker volume管理

sh 从安装在Linux机器上的Time Machine卷复制数据。