Skip to content

Docker Machine

Docker Machine 是一个工具,可以在本地虚拟机或云服务器上自动安装 Docker,并通过 docker-machine 命令管理多台 Docker 主机。

注意:Docker Machine 官方已停止维护(2021年归档)。目前推荐使用 Docker Desktop(本地)、云服务商的托管容器服务或脚本化安装来替代。本节保留介绍以供了解历史背景,并提供现代替代方案。

Docker Machine 简介

Docker Machine 可以:

  • 在本地虚拟机(VirtualBox、VMware)上创建 Docker 主机
  • 在云平台(AWS、GCP、Azure、DigitalOcean)上创建 Docker 主机
  • 管理多台 Docker 主机,切换工作环境

基本用法

bash
# 安装(已不推荐,仅供参考)
# https://github.com/docker/machine/releases

# 创建本地虚拟机
docker-machine create --driver virtualbox dev-vm

# 查看所有机器
docker-machine ls

# 获取机器 IP
docker-machine ip dev-vm

# 启动/停止机器
docker-machine start dev-vm
docker-machine stop dev-vm

# 切换环境(让 docker 命令指向该机器)
eval $(docker-machine env dev-vm)

# 恢复本地环境
eval $(docker-machine env -u)

# SSH 登录到机器
docker-machine ssh dev-vm

# 删除机器
docker-machine rm dev-vm

现代替代方案

方案一:脚本化安装(推荐)

使用 Docker 官方一键安装脚本,快速在远程服务器安装 Docker:

bash
# 在远程服务器上一键安装 Docker
curl -fsSL https://get.docker.com | sh

# 国内服务器使用阿里云镜像
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

通过 SSH 远程操作 Docker:

bash
# 通过 SSH 在远程服务器执行 Docker 命令
ssh user@remote-host docker ps

# 使用 Docker context 管理多台主机(现代方式)
docker context create remote \
  --docker "host=ssh://user@remote-host"

# 切换到远程主机
docker context use remote

# 恢复本地
docker context use default

方案二:Docker Context(官方现代方案)

Docker Context 是现代的多主机管理方式:

bash
# 创建 SSH 连接的 context
docker context create myserver \
  --description "Production server" \
  --docker "host=ssh://ubuntu@192.168.1.100"

# 列出所有 context
docker context ls

# 使用指定 context
docker context use myserver

# 在远程主机上执行命令
docker ps
docker run -d nginx

# 恢复本地
docker context use default

# 删除 context
docker context rm myserver

方案三:Ansible 批量安装

对于管理多台服务器,推荐使用 Ansible:

yaml
# install-docker.yml
- hosts: docker_servers
  become: yes
  tasks:
    - name: Install Docker
      shell: curl -fsSL https://get.docker.com | sh
      
    - name: Start Docker
      systemd:
        name: docker
        enabled: yes
        state: started
        
    - name: Add user to docker group
      user:
        name: "{{ ansible_user }}"
        groups: docker
        append: yes
bash
ansible-playbook -i inventory install-docker.yml

方案四:Terraform + 云服务

在云上批量创建预装 Docker 的服务器:

hcl
# main.tf(AWS 示例)
resource "aws_instance" "docker_host" {
  count         = 3
  ami           = "ami-ubuntu-22.04"
  instance_type = "t3.medium"

  user_data = <<-EOF
    #!/bin/bash
    curl -fsSL https://get.docker.com | sh
    usermod -aG docker ubuntu
    systemctl enable docker
  EOF

  tags = {
    Name = "docker-worker-${count.index}"
  }
}

多主机管理实践

使用 Docker Context 管理多台主机

bash
# 设置多个 context
docker context create prod-web \
  --docker "host=ssh://ubuntu@web.example.com"

docker context create prod-db \
  --docker "host=ssh://ubuntu@db.example.com"

docker context create staging \
  --docker "host=ssh://ubuntu@staging.example.com"

# 在不同主机上部署
docker context use prod-web
docker stack deploy -c web.yml webapp

docker context use prod-db
docker stack deploy -c db.yml database

# 查看各主机状态
for ctx in prod-web prod-db staging; do
  echo "=== $ctx ==="
  docker --context $ctx ps
done

SSH 配置简化

~/.ssh/config 中配置主机别名:

Host prod-web
    HostName web.example.com
    User ubuntu
    IdentityFile ~/.ssh/prod.pem

Host prod-db
    HostName db.example.com
    User ubuntu
    IdentityFile ~/.ssh/prod.pem

然后使用别名创建 context:

bash
docker context create prod-web --docker "host=ssh://prod-web"

总结

Docker Machine 虽然已停止维护,但其解决的问题(多主机 Docker 管理)依然重要。现代推荐方案:

场景推荐方案
单台远程主机管理Docker Context + SSH
多台服务器批量安装Ansible / 云平台 user_data
云环境自动化Terraform + 云服务
集群管理Docker Swarm / Kubernetes

Docker Context 是官方推荐的现代多主机管理方案,内置于 Docker CLI,无需额外安装。