无忧启动论坛

 找回密码
 注册
搜索
一次装机 终生领工资最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
诚聘PE工具开发技术员QQ:1607112133系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
查看: 2241|回复: 2

[教程] 在物理机上部署 boot2docker 完全攻略

[复制链接]
发表于 2016-5-26 21:21:33 | 显示全部楼层 |阅读模式
本帖最后由 2012raps 于 2016-5-27 20:38 编辑

转载: http://blog.csdn.net/nidnil/article/details/51510546

docker 官方给出的非 linux 解决方案,傻瓜式的有 Docker Toolbox,命令式的可以用 docker-machine。
此方案采用上述方案的文件,进行最小依赖的部署。
支持虚拟机,
对于不想安装一大堆东西的人可以参考本方案部署 干净 的 docker 服务器。


名称约定:
    部署 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_hu ... oot2docker.iso.html
 楼主| 发表于 2016-5-27 10:10:30 | 显示全部楼层
/etc/rc.d/automount 是执行硬盘初始化的脚本,本身只处理 vbox 和 vmware,
这里将 wmware 的处理条件改成当前硬盘。
回复

使用道具 举报

发表于 2016-6-4 07:21:04 | 显示全部楼层
謝謝大大提供資源學習中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持本站|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2019-4-18 20:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表