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:\Users\Administrator>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: 显示帮助信息
补充:docker-machine是解决docker运行环境问题。
docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,如果在非Linux平台上使用docker技术需要依赖安装Linux系统的虚拟机。
docker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术。你可以把它理解为virtualbox或者vmware,最开始在win7上用得比较多,但是win10开始自带了hyper-v虚拟机,已经不再需要docker-machine了,docker可以直接运行在安装了Linux系统得hyper-v上。
补充:machine(virtualbox虚拟机)创建主机挂载目录:
参考: https://www.jianshu.com/p/39327c9ea368
命令最好全部用root用户操作,mount命令可以查看挂载成功的信息
(1)VirtualBox中新建共享文件夹
(2)打开Linux终端:
创建要挂载的文件夹,mkdir /opt/ocrtemplate
赋权:chmod 777 /opt/ocrtemplate
手动挂载共享文件夹到 '/opt/ocrtemplate ' 文件夹,输入:sudo mount -t vboxsf ocrtemplate2 /opt/ocrtemplate (ocrtemplate2 是共享文件夹名称,后面的linux挂载的路径)
(3)mount验证即可。这时候两个文件夹会同步。
root@default:/opt/ocrtemplate# mount | grep ocrtem ocrtemplate2 on /opt/ocrtemplate type vboxsf (rw,nodev,relatime)
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:\Users\Administrator>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