0.环境
一台已经安装了VirtualBox的MacOS。
1.安装Vagrant
下载并安装Vagrant:https://www.vagrantup.com/downloads.html
完成后使用vagrant -v命令查看版本,确认Vagrant已经成功安装。
➜ ~ git:(master) ✗ vagrant -v
Vagrant 2.2.5
2.创建vagrantfile
在Vagrant文件夹中,创建一个名为CentOS7_Docker的文件夹,并进入该文件夹。(这里的git:(master)
仅是一个提示符,可以忽略不计)
➜ Vagrant git:(master) ✗ mkdir CentOS7_Docker
➜ Vagrant git:(master) ✗ cd CentOS7_Docker
➜ CentOS7_Docker git:(master) ✗
在CentOS7_Docker文件夹内创建Vagrantfile
,Vagrantfile
的内容如下。(可以使用vi或者使用文本编辑器等)
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_version ">= 1.6.0"
boxes = [
{
:name => "docker-host",
:eth1 => "192.168.205.10",
:mem => "1024",
:cpu => "1"
}
]
Vagrant.configure(2) do |config|
config.vm.box = "centos/7"
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = opts[:mem]
v.vmx["numvcpus"] = opts[:cpu]
end
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
config.vm.network :private_network, ip: opts[:eth1]
end
end
config.vm.synced_folder "./labs", "/home/vagrant/labs"
config.vm.provision "shell", privileged: true, path: "./setup.sh"
end
在同一文件夹内创建setup.sh
,来实现Docker的自动安装和启动。
#/bin/sh
# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils net-tools
# install docker
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
# start docker service
sudo systemctl start docker
rm -rf get-docker.sh
为了使CentOS7虚拟机和宿主机(本地)之间方便传输文件,需要将虚拟机中的/home/vagrant/labs
挂在到当前目录的labs
文件夹下。因此需要穿件一个名为labs
的文件夹。
➜ CentOS7_Docker git:(master) ✗ mkdir labs
➜ CentOS7_Docker git:(master) ✗ ls
Vagrantfile labs setup.sh
至此,Vagrantfile
和setup.sh
以及labs
文件夹已经创建完成。
3.创建CentOS7的虚拟机
在上述目录中输入vagrant up命令创建一台CentOS7的虚拟机。第一创建时会自动下载CentOS7的镜像文件,需要等待一段时间。
➜ CentOS7_Docker git:(master) ✗ vagrant up
等待片刻后,虚拟机就创建完成了。
4.连接和退出虚拟机
使用vagrant ssh
命令启动创建好的CentOS7的虚拟机,并确认Docker版本。
➜ CentOS7_Docker git:(master) ✗ vagrant ssh
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$ sudo docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:19:36 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
使用exit
命令退出虚拟机。
[vagrant@docker-host ~]$ exit
logout
Connection to 127.0.0.1 closed.
5.停止并销毁虚拟机
使用vagrant status
命令查看当前虚拟机状态。此虚拟机的状态为running
,即正在运行。
➜ CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:
docker-host running (virtualbox)
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
使用vagrant halt
命令停止虚拟机。
➜ CentOS7_Docker git:(master) ✗ vagrant halt
==> docker-host: Attempting graceful shutdown of VM...
再次使用vagrant status
命令查看当前虚拟机状态。此时,该虚拟机的状态为poweroff
,即已经关闭。
➜ CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:
docker-host poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
最后,使用vagrant destroy
销毁创建的虚拟机,并查看状态。
➜ CentOS7_Docker git:(master) ✗ vagrant destroy
docker-host: Are you sure you want to destroy the 'docker-host' VM? [y/N] y
==> docker-host: Destroying VM and associated drives...
➜ CentOS7_Docker git:(master) ✗ vagrant status
Current machine states:
docker-host not created (virtualbox)
The environment has not yet been created. Run `vagrant up` to
create the environment. If a machine is not created, only the
default provider will be shown. So if a provider is not listed,
then the machine is not created for that environment.
可以上到,该虚拟机的状态为not created
(未被创建),确认删除成功。
删除虚拟机并不需要先将其停止,在运行的状态下也可以直接删除。
※上述命令必须在CentOS7_Docker
目录下执行。
6.关于Vagrant的其他一些常用命令
vagrant init <名称> # 初始化box的操作
vagrant box add <虚拟机名> # 添加box的操作
vagrant up # 启动虚拟机的操作
vagrant ssh # 登录拟机的操作,也可以指定hostname登陆
vagrant box list # 显示当前已经添加的box列表
vagrant box remove 名称 # 删除相应的box
vagrant destroy # 停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant halt # 关机
vagrant status # 获取当前虚拟机的状态,也可以查看指定hostname
vagrant suspend # 挂起当前的虚拟机
vagrant resume # 恢复前面被挂起的状态
vagrant reload # 重新启动虚拟机,主要用于重新载入配置文件
vagrant global-status # 查看所有虚拟机的ID号
vagrant plugin # 用于安装卸载插件
vagrant ssh-config # 输出用于ssh连接的一些信息
vagrant package # 打包命令,可以把当前的运行的虚拟机环境进行打包
vagrant ssh-config # 查看ssh登录信息,可以把这些信息 保存到.ssh文件下config中,先用vagrant ssh 登录,然后把宿主机的ssh公钥保存到虚拟机的authorized_keys文件里,然后在宿主机ssh <名称>就可以免密码登录
6.vagrant 用户权限不足的解决方案
利用上述方法创建一个虚拟机,使用vagrant ssh
命令进入上述系统。
➜ CentOS7_Docker git:(master) ✗ vagrant ssh
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$
使用docker version
用查看Docker版本。
[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied
系统返回permission denied
错误,这是因为vagrant用户没有权限查看Docker的Server端版本信息。需要在docker version
命令前加上sudo
来提升其权限。
[vagrant@docker-host ~]$ sudo docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:19:36 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
不仅如此,使用docker命令时通常都需要加上sudo
来提升vagrant用户的权限。为了避免每次输入sudo
的麻烦,可以将vagrant用户添加到docker的用户组。
# 查找 docker 组,确认其是否存在
[vagrant@docker-host ~]$ cat /etc/group | grep docker
docker:x:992:
# 如果 docker 组不存在,则创建组
sudo groupadd docker
# 将当前用户添加到 docker 组
[vagrant@docker-host ~]$ sudo gpasswd -a ${USER} docker
Adding user vagrant to group docker
# 查看 docker 组用户,确认添加成功
[vagrant@docker-host ~]$ cat /etc/group | grep docker
docker:x:992:vagrant
# 重启服务
[vagrant@docker-host ~]$ sudo service docker restart
Redirecting to /bin/systemctl restart docker.service
#测试
[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version: dial unix /var/run/docker.sock: connect: permission denied
仅仅重启服务仍不能解决这个问题,还需要注销并重新连接。
[vagrant@docker-host ~]$ exit
logout
Connection to 127.0.0.1 closed.
➜ CentOS7_Docker git:(master) ✗ vagrant ssh
Last login: Thu Aug 8 12:53:19 2019 from 10.0.2.2
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[vagrant@docker-host ~]$ docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:19:36 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
使用上述方法,可以实现在不使用sudo
命令获取Docker版本信息,从而根本解决这个问题vagrant用户权限不足的问题。
参考
Mac 下使用 Vagrant 快速搭建 Centos/7 虚拟机
Mac下使用Vagrant配置CentOS虚拟环境
不加 sudo 执行 Docker 命令
.