Docker 1.9 初体验

Docker 颠覆了容器技术,也将容器技术带到了新的高度。对于开发和运维人员(特别是运维),Docker 真是省了不少事儿。就我做开发的来说,比如前几天 mysql 5.7 GA 了,我想体验一下的其 Json 类型的支持,大可不必去下载安装包再在本机上安装(可能之前已经安装了较早版本的 mysql,还得考虑升级),用 docker 两个命令就可以愉快地玩耍了——这只是一个我个人使用中的小例子。Docker 对于部署、对于应用服务的横向扩展开说,都有很大的优势。

Docker 1.9(好像是从1.8的就开始了)没了 Boot2Docker,取而代之的是 Docker Machine。有一段时间没玩 Docker 了,更新个新版试试。不过也没感觉到什么区别,除了命令变了,能创建多个 VM,本质还是需要安装一个 VirtualBox 从而将 Docker 运行于 Linux 虚拟机内——毕竟 docker 还是得通过 linux 内核的 namespace 和 cgroups 机制实现资源隔离及限制。

本文系个人笔记,只做记录,不做详解。Docker 学习可以参考官方文档,或Docker 中文指南

Install

官网下载安装包 Docker Toolbox (也能用 brew 安装)

安装DockerToolbox-1.9.0b.pkg,无脑 next

p.s. 我之前有安装 Docker 1.7,直接安装 1.9 的话,会遗留boot2docker命令,那个boot2docker-vm也在,为了干净一点(轻微洁癖,哈哈),我先用 UninstallPKG 把之前跟 docker 相关的全删除了。

Environment

尝试了一下新的图形化管理界面 Kitematic(Beta),它会自动创建一个名为default的 VM(之前用 Boot2Docker 时创建的 VM 叫boot2docker-vm)。

在 Kitematic 里可以直接创建 container 和管理自己的 repository,不过有些局限。如果用它创建的 mysql 的 container 就启动不了

1
2
atabase is uninitialized and MYSQL_ROOT_PASSWORD not set
Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?

在 Kitematic 找了半天也没找到能在哪设置MYSQL_ROOT_PASSWORD,看来 Kitematic 还年轻啊~

还是用命令行吧。新版 Docker 安装完,发现命令多了不少,docker往终端里一敲,tab了一下出来这么多:

1
2
3
4
5
6
DOCKER_CERT_PATH                       docker-machine-driver-amazonec2        docker-machine-driver-hyperv           docker-machine-driver-vmwarefusion
DOCKER_HOST docker-machine-driver-azure docker-machine-driver-none docker-machine-driver-vmwarevcloudair
DOCKER_TLS_VERIFY docker-machine-driver-digitalocean docker-machine-driver-openstack docker-machine-driver-vmwarevsphere
docker docker-machine-driver-exoscale docker-machine-driver-rackspace
docker-compose docker-machine-driver-generic docker-machine-driver-softlayer
docker-machine docker-machine-driver-google docker-machine-driver-virtualbox

执行熟悉的docker ps, 结果报错

1
2
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

但是实际上我的 dokcer 是运行了的:

1
2
3
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
default - virtualbox Running tcp://192.168.99.100:2376

因为之前玩 docker 的时候遇到过类似问题(提示是不一样的的,具体的也忘了是什么了),猜测是环境变量的问题,那就看看新的docker-machine命令都有什么。发现有一个env是看环境变量的,执行之

1
2
3
4
5
6
7
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/yibo/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(docker-machine env default)"

p.s. 如果是用docker-machine create命令从 terminal 创建 VM 的话,是会提示你设置环境变量的

1
2
3
4
5
6
7
8
9
10
11
$ docker-machine create --driver virtualbox test
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
To see how to connect Docker to this machine, run: docker-machine env test

提示很友好嘛,那就设置一下环境变量

1
$ eval "$(docker-machine env default)"

这样再docker ps就 OK 了,创建个 mysql 的 container

1
docker run --name some-mysql -v /home/docker/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest

注:这里的/home/docker/datadir是 VM 中的文件目录,删除 container 的不会自动删除该文件目录,需要进入 VM 以 ROOT 权限手动删除。曾经在 Windows 上刚开始使用 Docker 的时候,在这个问题上边纠结了好久,就因为我只顾 docker 玩的嗨,忘了中间这个虚拟机。附图一张:

Other

docker 所在的那个的虚拟机的 username/password: docker/tcuser
可以通过ssh docker@192.168.99.100登录上去,不过还有更优雅的方式:

1
$ docker-machine ssh default

如果需要 root 权限怎么办?

1
2
$ sudo su  // -> root
# exit // -> docker