2015
May
02

Docker 是什么呢,他是一个虚拟机器的软体,可以在一个虚拟的环境下执行 Application,例如我可以在 Linux 系统中,透过 Docker 虚拟出好几台的 Linux 系统,那为什么我要这么多台 Linux 系统,假设我写一个 C/C++ 的程式码,但是我必须在各种不同的 OS 上做测试,例如 Ubuntu, CentOS, debain 等等,那么我不用同时安装这么多系统,只要透过 Docker 就能轻松的摸拟各种环境。

那 Docker 跟 VirtualBox (VMware) 有什么不同呢? VirtualBox 虚拟机器会建立一个独立的 CPU, Memory 与 Network 网路 ,就像是摸拟出一台跟真的一样的机器,因为摸拟的部分很大,所以VirtualBox 的执行效能会比较差,而且 CPU 与 Memory 的用量很多; 而 Docker 只是单纯的使用 LXC 来模拟出 Linux File System , 当你在 Docker 执行一个程式时,会直接使用主机的 CPU, Memory 来运作,所以我们也可以把 Docker 称为一个 VE System : Virtualization Environment

如何在 Mac 安装 Docker

因为 Docker 只能在 Linux kernel 下执行,所以我们不能直接将 Docker 安装在 Mac OS 上。

Docker 在 Mac 环境上不断的更新,目前已经出了三个版本,分别是 boot2docker, docker-machine, docker xhyve ,其中 boot2docker, docker-machine 都会用到 virtual box ,主要是为了在 Mac 上安装一个 Linux 环境,刚刚有说过, Docker 目前只能在 Linux 上运作,所以最简单的解决方式,就是装一个 Linux OS 到 Mac 里,当然这样 Performance 一定不会太好,不过对於开发&测试&学习环境来说,这仍然是一个不错的选择。

Docker xhyve 是目前最新的 Docker on Mac 的工具,他可以在 Mac 摸拟 Linux kernel ,所以省去了安装 Virtual box 的动作 (xhyve 安装方式可以看这里 https://github.com/zchee/docker-machine-driver-xhyve )。

接下来我会用第二个版本 "docker-machine" 来做示范。

下载 Docker

在官方的教学网址中,有两个安装 Docker 的方式 ,一个是新的 Docker for Mac : xhyve , 另一个是 Docker toolbox ,这里我选择的是 docker toolbox ,并下载的 Docker 版本是 1.10.3 ,下载网址如下。

安装并建立 Docker OS

下载完成后,点击两下档案就可以安装了,注意它可能会要求你先装好 virtualbox ,这个是免费软体,Google 搜寻就可以找到了。



安装完成后,Docker toolbox 提供了一个快速建立 Linux 含 Docker 的方式,这里我是选择左边的选项 Docker Quickstart Terminal ,它会帮我们建立一个 Linux ,并在上面安装 Docker ,很容易吧~。

init
  1. Creating CA: /Users/puritys/.docker/machine/certs/ca.pem
  2. Creating client certificate: /Users/puritys/.docker/machine/certs/cert.pem
  3. Running pre-create checks...
  4. (default) Default Boot2Docker ISO is out-of-date, downloading the latest release...
  5. (default) Latest release for github.com/boot2docker/boot2docker is v1.11.2
  6. (default) Downloading /Users/puritys/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.11.2/boot2docker.iso...(default) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
  7. Creating machine...
  8. (default) Copying /Users/puritys/.docker/machine/cache/boot2docker.iso to /Users/puritys/.docker/machine/machines/default/boot2docker.iso...
  9. (default) Creating VirtualBox VM...
  10. (default) Creating SSH key...
  11. (default) Starting the VM...
  12. (default) Check network to re-create if needed...
  13. (default) Found a new host-only adapter: "vboxnet1"
  14. (default) Waiting for an IP...
  15. Waiting for machine to be running, this may take a few minutes...
  16. Detecting operating system of created instance...
  17. Waiting for SSH to be available...
  18. Detecting the provisioner...
  19. Provisioning with boot2docker...
  20. Copying certs to the local machine directory...
  21. Copying certs to the remote machine...
  22. Setting Docker configuration on the remote daemon...
  23. Checking connection to Docker...
  24. Docker is up and running!
  25. To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: /usr/local/bin/docker-machine env default
  26.  
  27. == .
  28. == == == ==
  29. == == == == == ===
  30. /"""""""""""""""""\___/ ===
  31. ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
  32. \______ o __/
  33. \ \ __/
  34. \____\_______/
  35.  
  36.  
  37. docker is configured to use the default machine with IP 192.168.99.100
  38. For help getting started, check out the docs at https://docs.docker.com

执行成功后,Docker toolbox 会建立一个名叫 default 的 Linux 系统,而上面已经装好了 docker 的软体,接下来我就简称他为 Docker Host,另外系统讯息告诉我们说,Docker container 的 ip 是 192.168.99.100 , 它沟通的 port 预设是 2376 ,所以我可以用 "telnet 192.168.99.100 2376" 这个指令测试一下, Docker Container 是否正常运作,看到下面这个讯息就代表 docker 已经成功建立起来罗。

telnet docker
  1. telnet 192.168.99.100 2376
  2. Trying 192.168.99.100...
  3. Connected to 192.168.99.100.
  4. Escape character is '^]'.
  5. ]

检查 Docker OS

如果你不知道 Docker Host 的 IP 与 port ,那么你可以用 docker-machine ls ,这个指令来检查,又或者你可以在 Mac 里打开 Virtual Box 。

docker-machine ls
  1. NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
  2. default - virtualbox Running tcp://192.168.99.100:2376 v1.11.2

这个指令 "docker-machine env" 也可以取得 Docker 相关的讯息。

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

建立一个 ubuntu container

你可以输入 $ docker run -t -i ubuntu:12.04 /bin/bash 来建立一个 container ,但是你会收到这个讯息 "docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?". 原因是 docker 不知道 default docker OS 的系统是装在那一台 virtual machine ,IP 是什么 ,你必须先把环境变数设定正确,可以用指令 "docket-machine env default " 来检查 default docker 的设定,再把下面这个指令将环境变数写入。

  • eval "$(docker-machine env default)"
  • docker run -t -i ubuntu:12.04 /bin/bash
docker run
  1. docker run -t -i ubuntu:12.04 /bin/bash
  2. Unable to find image 'ubuntu:12.04' locally
  3. 12.04: Pulling from library/ubuntu
  4. cc99613160bd: Pull complete
  5. 7b4fddeacb94: Pull complete
  6. 25455fa86fcc: Pull complete
  7. 087ee67bc4a3: Pull complete
  8. Digest: sha256:ab81ef94fcfbec335c8a528f90f3dbb627830556f55c31cd720198534b44370f
  9. Status: Downloaded newer image for ubuntu:12.04
  10. root@bb230bd64efa:/#

启动 container 成功后,你会看到上面这个讯息,而且系统已经帮你登入新建好的 ubuntu ,你可以使用任何 ubuntu 上的相关指令。

container 相关指令

  • docker run -d -P --name web nginx : 建立一个装好 nginx service ,名为 web 的 Linux Machine。
  • docker run -d -P -v /www/site:/usr/share/nginx/html --name mysite nginx
  • docker port mysite
  • docker cp xxx.file 20e8aa9f9a53:/ : 传送一个档案到 container 。

手动建立 Docker OS

如果你在使用 Docker 过程中,有碰到太奇怪,无法解决的问题,那么你可以选择手动移除 Docker Host (预设叫 default ),再重新建立一个新的 Docker Host。

首先我们要停用 default 这个预设 Docker toolbox 帮我们建好的 Docker Host 。

  • docker-machine stop default

再来移除他,请注意这个动作会移除 Docker 的所有资料,请先确定你的重要资料都已备份。

  • docker-machine rm default

最后下这个指令,就可以重新建立一个新的 Docker Host 罗 , docker 预设只有 20GB 硬碟容量,建议加大到 40 GB 以上。

docker-machine create --driver virtualbox --virtualbox-disk-size "40000" default

volume - mount

如果你想要在 docker container 挂载根目录的资料夹,例如 /my_dev ,我使用 -v /my_dev:/my_dev 这个方式是无效的,原因是 Docker 在 Mac 中是一个 VitualBox Machine ,这个 machine 本身没有 /my_dev 目录,简单的做法是先手动将 Mac 的 /my_dev mount 到 virtual machine 中。

VirtualBox Machine 必需先安装 GuestAdditions ,先用 VirtualBox UI 介面,挂载 VBoxGuestAdditions.iso ,在选单中的 DeviceInsert Guest Addition CD Image,挂载好再执行下面的指令,挂载的时候要特别注意,第一颗 CD Rom 一定要是 boot2docker.iso 不然 VirtualBox 会打不开,我的解法是先用第一颗 CD Rom 开机,开机成功后,再强迫移除 CD Rom iso ,重新点击一次 "Insert Guest Addition CD Image" ,这时就可以安装 Guest Addition ,安装成功后再把 boot2docker.iso 重新挂载到第一颗 CD Rom。

  • docker-machine ssh : 登入 virtual machine
  • mkdir d
  • sudo mount /dev/sr1 d
  • cd d
  • sudo sh ./VBoxLinuxAdditions.run : 装完就可以退出了。

再来执行 mount 执令

  • docker-machine stop : 先停掉 virtual machine
  • VBoxManage sharedfolder add default --name my_dev --hostpath /my_dev --automount
  • docker-machine start

移除方式

  • docker-machine stop
  • VBoxManage sharedfolder remove default --name /my_dev

Docker 指令


指令 说明
docker ps 显示所有 containers
docker images 显示所有的 images
docker rmi -f db7e8a0d84e3 移除一个 image
docker pause bb230bd64efa 停止 container 中的所有 processes
docker unpause bb230bd64efa 取消停止 container 中的所有 processes
docker logs bb230bd64efa 查看 container 的 log
docker stop bb230bd64efa 停止 container 运作
docker start bb230bd64efa 启用 container
docker commit bb230bd64efa ubuntu:12.04 commit container 中的修改, bb230bd64efa 是 container id, ubuntu:12.04 是 image 名称
docker run -t -i ubuntu:12.04 /bin/bash 启动 container ,并登入

参考文章


回應 (Leave a comment)