一、什么是Docker Machine

linux容器中的文件怎么拿出来 linux docker容器_Machine

Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:///docker/machine

Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。

使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。

Docker Machine 也可以集中管理所有的docker主机。

二、为什么要使用Docker Machine

Docker Machine 使你能够在各种 Linux 上配置多个远程 Docker 宿主机。
此外,Machine 允许你在较早的 Mac 或 Windows 系统上运行 Docker,如上一主题所述。
Docker Machine 有这两个广泛的用例。

  • 我有一个较旧的桌面系统,并希望在 Mac 或 Windows 上运行 Docker

linux容器中的文件怎么拿出来 linux docker容器_Docker_02

如果你主要在不符合新的 Docker for Mac 和 Docker for Windows 应用程序的旧 Mac 或 Windows 笔记本电脑或台式机上工作,则需要 Docker Machine 来在本地“运行Docker”(即Docker Engine)。在 Mac 或 Windows box 中使用 Docker Toolbox 安装程序安装 Docker Machine 将为 Docker Engine 配置一个本地的虚拟机,使你能够连接它、并运行 docker 命令。

  • 我想在远程系统上配置 Docker 宿主机

Docker Engine Linux 系统上原生地运行。如果你有一个 Linux 作为你的主系统,并且想要运行 docker 命令,所有你需要做的就是下载并安装 Docker Engine 。然而,如果你想要在网络上、云中甚至本地配置多个 Docker 宿主机有一个有效的方式,你需要 Docker Machine。

无论你的主系统是 Mac、Windows 还是 Linux,你都可以在其上安装 Docker Machine,并使用 docker-machine 命令来配置和管理大量的 Docker 宿主机。它会自动创建宿主机、在其上安装 Docker Engine 、然后配置 docker 客户端。每个被管理的宿主机(“machine”)是 Docker 宿主机和配置好的客户端的结合。

三、Docker和Docker Machine之间的区别

当人们说“Docker”时,他们通常是指 Docker Engine,它是一个客户端 - 服务器应用程序,由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口(CLI)与守护进程通信(通过封装REST API)。Docker Engine 从 CLI 中接受docker 命令,例如 docker run 、docker ps 来列出正在运行的容器、docker images 来列出镜像,等等。

linux容器中的文件怎么拿出来 linux docker容器_Machine_03

Docker Machine 是一个用于配置和管理你的宿主机(上面具有 Docker Engine 的主机)的工具。通常,你在你的本地系统上安装 Docker Machine。Docker Machine有自己的命令行客户端 docker-machine 和 Docker Engine 客户端 docker。你可以使用 Machine 在一个或多个虚拟系统上安装 Docker Engine。

这些虚拟系统可以是本地的(就像你在 Mac 或 Windows 上使用 Machine 在 VirtualBox 中安装和运行 Docker Engine 一样)或远程的(就像你使用 Machine 在云提供商上 provision Dockerized 宿主机一样)。Dockerized 宿主机本身可以认为是,且有时就称为,被管理的“machines”。

linux容器中的文件怎么拿出来 linux docker容器_docker_04

四、Docker Machine的安装部署

实验准备:

1.虚拟机准备


主机名

ip

作用

server1

172.25.63.1

控制器

server2

172.25.63.2

客户端

server3

172.25.63.3

客户端


还需要在真机(172.25.63.250)安装httpd,将安装所需资源发布出去。

2.各主机的selinux和firewalld均为关闭状态。

安装 Docker Machine

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

官方github项目有安装流程

[root@server1 ~]# curl -L https:///docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
> chmod +x /tmp/docker-machine &&
> cp /tmp/docker-machine /usr/local/bin/docker-machine

等待下载完成即可。

配置客户端

这次实验准备在server3上安装docker

首先需要在server1做ssh免密:
在server1

[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server3

更改server3系统类型(由于安装脚本中如果监测到系统为rhel就会退出安装docker):

[root@server3 ~]# vim /etc/os-release 
[root@server3 ~]# cat -n /etc/os-release | grep 3
     3	ID="centos"				#将rhel改为centos

配置资源发布端

在真机httpd发布目录下建立以下文件:

[root@foundation63 ~]# cd /var/www/html/
[root@foundation63 html]# mkdir docker
[root@foundation63 html]# cd docker/
[root@foundation63 docker]# ls
[root@foundation63 docker]# wget -O  get-docker.sh https://get.docker.com		#下载安装脚本
[root@foundation63 docker]# vim docker-ce.repo			#建立repo文件
[root@foundation63 docker]# cat docker-ce.repo 
[docker]
baseurl=http://172.25.63.250/docker/docker-ce
gpgcheck=0
[root@foundation63 docker]# vim get-docker.sh 
398                         yum_repo="http://172.25.63.250/docker/docker-ce.repo    "			#更改为自己的repo文件地址
[root@foundation63 docker]# mkdir docker-ce			#安装包及依赖包的存放目录
[root@foundation63 docker]# cd docker-ce/
[root@foundation63 docker-ce]# ls
containerd.io-1.2.13-3.1.el7.x86_64.rpm  docker-ce-19.03.8-3.el7.x86_64.rpm
container-selinux-2.77-1.el7.noarch.rpm  docker-ce-cli-19.03.8-3.el7.x86_64.rpm
[root@foundation63 docker-ce]# createrepo -v .			#创建本地yum源
[root@foundation63 docker-ce]# ls
containerd.io-1.2.13-3.1.el7.x86_64.rpm  docker-ce-19.03.8-3.el7.x86_64.rpm      repodata
container-selinux-2.77-1.el7.noarch.rpm  docker-ce-cli-19.03.8-3.el7.x86_64.rpm

以上部分安装包的下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

配置完成后即可执行安装命令:

[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.63.250/docker/get-docker.sh" --generic-ip-address 172.25.63.3 server3
  • 1

以上命令的含义:
--driver generic 指定驱动为普通驱动
--engine-install-url指定安装脚本地址,
--generic-ip-address 需要安装docker的客户端ip以及主机名

linux容器中的文件怎么拿出来 linux docker容器_Machine_05

上图显示表示安装成功。

添加节点

在server2上已经安装好了docker,我们可以使用以下命令添加这个节点进入集群:

[root@server2 ~]# vim /etc/os-release 
[root@server2 ~]# cat -n /etc/os-release |  grep 3
     3	ID="centos"

控制端添加节点:

[root@server1 ~]# ssh-copy-id server2
[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.63.250/docker/get-docker.sh" --generic-ip-address 172.25.63.2 server2

添加成功,查看节点:

[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   -        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   *        generic   Running   tcp://172.25.63.3:2376           v19.03.8

五、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

显示帮助信息


测试:

[root@server1 ~]# docker-machine ls

linux容器中的文件怎么拿出来 linux docker容器_linux容器中的文件怎么拿出来_06

连接远程主机:

[root@server1 ~]# docker -H  tcp://172.25.63.3:2376 ps

linux容器中的文件怎么拿出来 linux docker容器_docker_07

会报错,因为服务是通过https访问的,我们需要高速他key在哪里, docker-machine config server3命令作用是查看远程主机的信息,我们可以使用以下形式来对远程主机的docker进行操作:

[root@server1 ~]# docker `docker-machine config server3` images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

也可以控制远程主机拉取镜像,当然前提是远程主机可以上网且最好配置了镜像加速:

[root@server1 ~]# docker `docker-machine config server3` pull busybox
Using default tag: latest
latest: Pulling from library/busybox
0669b0daf1fb: Pull complete 
Digest: sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135
Status: Downloaded newer image for busybox:latest
/library/busybox:latest
[root@server1 ~]# docker `docker-machine config server3` images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        4 weeks ago         1.22MB

也可以运行容器:

[root@server1 ~]# docker `docker-machine config server3` run -it --rm busybox
/ # [root@server1 ~]# 
[root@server1 ~]# docker `docker-machine config server3` ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d2aa4683ee41        busybox             "sh"                9 seconds ago       Up 8 seconds                            thirsty_noyce

但是我们也可以发现每次这么操作很繁琐,也可以将远程主机的环境变量加入到控制端实现更加简单的访问:

[root@server1 ~]# eval $(docker-machine env server3)
[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        4 weeks ago         1.22MB

添加后操作默认在server3。

[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   -        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   *        generic   Running   tcp://172.25.63.3:2376           v19.03.8

*表示现在在操作哪个远程主机。

[root@server1 ~]# eval $(docker-machine env server2)		#切换到server2
[root@server1 ~]# docker-machine ls
NAME      ACTIVE   DRIVER    STATE     URL                      SWARM   DOCKER     ERRORS
server2   *        generic   Running   tcp://172.25.63.2:2376           v19.03.8   
server3   -        generic   Running   tcp://172.25.63.3:2376           v19.03.8

优化显示

但是以上这种操作方式也有问题,有时候我们必须先查看环境变量才能确定我们操作的是哪个主机,其实可以安装一个bash脚本来优化这个问题: