在物理机上部署 boot2docker 完全攻略
邹齐智
2023-12-01
名称约定:
部署 boot2docker 的电脑称为“服务端”。
要链接到 docker 服务端的电脑称为“客户端”。
home 目录,是当前用户目录。windows 下在 %USERPROFILE% 中,linux 或 OS X 为 ~
准备:
boot2docker.iso 文件。本范例使用 1.11 版本,可以到 https://github.com/boot2docker/boot2docker/releases 上下载。
U 盘一个,推荐闪迪酷豆,用于写入 boot2docker.iso,仅仅需要 30 多 MB 的空间,多了也是浪费。
推荐:在 docker 客户端上准备支持 ssh 协议的软件,windows 下如 xshell 或者 git 等。
无“分区”的电脑一台作为 docker 服务端(可以是虚机)。
注意:
在物理机上部署 boot2docker 会清空(服务端)硬盘上的所有数据。请提前将有用数据备份到其他物理介质上。
步骤:
将 boot2docker.iso 使用软件写入 U 盘,这里推荐 linux 或 OS X 下的 dd 命令。
将服务端电脑设置成从 U 盘启动。
推荐步骤:进入服务端操作系统后,使用 ifconfig 查看 ip 。然后在客户端电脑上使用 ssh 连接到服务端电脑上,方便复制黏贴下方 shell 命令。
注意:
此处必须保证服务端电脑硬盘的 MBR 是空的,boot2docker.iso 会进行检测。
如果没有提前清理服务端硬盘数据,可以在服务端上执行 sudo dd if=/dev/zero of=/dev/sda bs=1k count=256 来删除 MBR。
链接到服务端的 shell 上执行:
UNPARTITIONED_HD=`fdisk -l | grep "doesn't contain a valid partition table" | head -n 1 | sed 's/Disk \(.*\) doesn.*/\1/'`
DISK_VENDOR=$(cat /sys/class/block/$(basename $UNPARTITIONED_HD /dev/)/device/vendor /sys/class/block/$(basename $UNPARTITIONED_HD /dev/)/device/model | tr -d "\n")
sudo sed -i "s/VMware, VMware Virtual S/$DISK_VENDOR/g;s/1000M/`free -m | grep Mem | awk '{print $2}'`M/g;s/ext4 -L/ext4 -i 8192 -L/g" /etc/rc.d/automount
sudo sh /etc/rc.d/automount
sudo reboot
最后一行会重启服务端电脑,此时硬盘已经准备好了。之后进行 docker 相关操作会保存在服务端硬盘上,而非内存之中。
变更 docker 用户的密码:
提示:docker 用户的初始密码是 tcuser,在 github 官网上有纪录。 root 用户貌似没有密码,可以在 docker 下使用 sudo su - root 来切换到 root。
在 shell 上执行:
MYPASS=新密码
printf %s "#!/bin/sh
echo 'docker:`echo $MYPASS | openssl passwd -1 -stdin`' | chpasswd -e
" | sudo tee /var/lib/boot2docker/bootlocal.sh
sudo chmod 755 /var/lib/boot2docker/bootlocal.sh
>.ash_history
“新密码”要替换成你的密码。
其中 /var/lib/boot2docker/bootlocal.sh 是 boot2docker 的开机启动配置脚本。可以将自己的自定义操作放入其中。
SSH 免密码登录:
boot2docker.iso 会同时检测 ~/.ssh/authorized_keys 和 ~/.ssh/authorized_keys2。
两个文件内容相同。
但由于 ~ (home)目录是存在于内存中的,会在重启后恢复初始状态,
boot2docker.iso 原本的解决方案是将 authorized_keys2 文件压缩包写入 MBR 中,会在系统启动时自动释放到 docker 的 home 路径下。
此处使用 /var/lib/boot2docker/bootlocal.sh 来解决此问题。
首先在 /var/lib/boot2docker 下建立 authorized_keys 文本文件,命令: sudo vi /var/lib/boot2docker/authorized_keys
会切换到 vi 操作界面。
将其客户端电脑的 ssh 公钥文本黏贴到此处,并保存。ssh 公钥文件在 home 文件夹下的 .ssh 文件夹里。文件名包含 pub 的就是。(此文件由 ssh 客户端软件生成)
(黏贴后,用 ESC 键退出编辑状态,输入 :wq 保存并退出 vi 界面)
将下面代码追加到 /var/lib/boot2docker/bootlocal.sh 中,操作同上。
su - docker -c "mkdir ~/.ssh && cat /var/lib/boot2docker/authorized_keys > ~/.ssh/authorized_keys && ln ~/.ssh/authorized_keys ~/.ssh/authorized_keys2"
这样就能实现远端 ssh 面密码登录 docker 用户了。
在客户端电脑上执行 docker 命令:
到 https://github.com/docker/docker/releases 下载 windows、linux、OS X 的 docker 可执行文件。
windows 可以直接从 https://aka.ms/tp4/docker 下载 docker.exe 文件。
然后将其放入客户端 path 环境变量中。
在客户端 home 文件夹下建立 .docker 文件夹。所有操作均使用 mkdir 命令建立即可。使用资源管理器建立可能无法成功。
将服务端 ~docker/.docker/ 目录下的 ca.pem cert.pem key.pem 文件复制到客户端的 .docker/ 目录中。
这三个文件均为文本文件,如果不会复制,可以使用类似 cat ~docker/.docker/ca.pem 命令,分别显示这三个 pem 文件的内容,复制内容到客户端的对应文件中。
在客户端的环境变量中加入:
DOCKER_HOST=tcp://127.0.0.1:2376
DOCKER_TLS_VERIFY=1
其中 127.0.0.1 要替换成服务端的 ip 地址。
此时就可以在客户端上执行 docker 命令来控制服务端的 docker 服务了。
部署 smb (网上邻居)服务:
使用 docker 命令可以快速搭建 smb 服务,来让客户端方便的访问服务端中的内容。
执行:
docker pull dperson/samba
由于网络问题,如果不成功,请重复执行,直到成功为止。
然后执行:
docker run -d --name samba -p 139:139 -p 445:445 -v /volume1:/mount dperson/samba -u "share;123456" -s "volume2;/mount;yes;no;no"
其中 /volume1 是想要共享的服务端的路径,share 123456 分别为 smb 的账号密码,volume2 为 smb 路径。
其他详细用法,参考 https://hub.docker.com/r/dperson/samba/ 中的说明。
这时就可以通过 \\此处替换服务端ip地址\volume2 访问服务端的 /volume1 路径了。
注意:
boot2docker 将硬盘挂载到类似 /mnt/sda1 的路径之上,其他的路径都是在内存之中的。
不要将文件放入其他路径。
参考资料:
http://yuanlixg.lofter.com/post/1d2add0a_7524070
http://ahui.us/post/zai_macos_huo_windows_shang_zhi_jie_shi_yong_boot2docker.iso.html