Docker 初体验

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

Introduction

Docker 是基于 LXC 的应用程序容器技术, 最近一年在虚拟化, 云计算领域非常的 流行, 它不但使得应用程序的自动化部署大大方便了, 甚至可以和 openstack 这样的 IaaS 平台整合, OMG!

以下以 ubuntu 系统来体验以下 docker.

Install

安装 docker

# apt-get install linux-image-extra-`uname -r`
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
# echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install -y lxc-docker

测试

# 如果没有 ubuntu 镜像的话, 会从仓库下载一份, 喝杯咖啡吧
root@ubuntu:~# docker run -i -t ubuntu /bin/echo 'hello world'
hello world

More usage

前面说过, docker 是应用程序的容器, 实际上, 可以把应用程序以 daemon 的模式 运行, 用 docker 提供的命令行接口和这些程序交互(e.g. I/O, 结束进程)

以一个简单的例子说明, 执行一个简单的脚本, 不断的在屏幕上打印 hello world

# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81 #返回 container id

执行 docker 命令之后, 屏幕上除了打印一个 该 docker 容器的 ID 外, 什么也没有

要获取程序的输出, 可以用 logs 子命令, 该命令捕获程序的输出

# docker logs 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81
hello world
hello world
hello world
hello world
hello world
hello world

使用 attach 把该程序恢复到前台执行, 有点类似于 bash 下的 fg 指令, 如果对 gdb 很熟悉的朋友, 把他当做 gdb 下的 attach 也未尝不可

# docker attach -sig-proxy=false 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81
docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
6c82bf81c5e3        ubuntu:12.04        /bin/sh -c while tru   2 minutes ago       Up 2 minutes                            kickass_franklin    

后台的程序可以使用 stop 直接结束

# docker stop 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81

如果想看当前容器运行着多少程序, 可以使用 ps 命令查看

# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
7cf51b1d50358971ff699639fac4b6ea0e0a6d99e8dd6861addf200f2580681a
# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
06fd537af32d05f99c1e26a19483d1ad0fe5dfb7512ab6a693ae23120ac43955
# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
06fd537af32d        ubuntu:12.04        /bin/sh -c while tru   3 seconds ago       Up 3 seconds                            loving_franklin     
7cf51b1d5035        ubuntu:12.04        /bin/sh -c while tru   4 seconds ago       Up 4 seconds                            stoic_galileo       

Deploy a web app

下面使用 docker 部署稍微复杂一点的程序, 一个使用 python 的 flask 框架编写 的简单的 web 程序

先把程序的容器镜像下载下来

# docker pull shykes/pybuilder # pull 一个新的 image
# URL=http://github.com/shykes/helloflask/archive/master.tar.gz #传递给前面镜像的 buildapp 程序

使用镜像内置的 buildapp 程序构建程序

# BUILD_JOB=$(docker run -d -t shykes/pybuilder:latest /usr/local/bin/buildapp $URL)

查看 build 状态

# docker attach -sig-proxy=false $BUILD_JOB

把刚才做的修改保存为 mydocker/hello

# BUILD_IMG=$(docker commit $BUILD_JOB mydocker/hello)

最后, 运行我们的 web 程序

# WEB_WORKER=$(docker run -d -p 5000 $BUILD_IMG /usr/local/bin/runapp)

查看服务器的运行状态

# docker logs $WEB_WORKER
 * Running on http://0.0.0.0:5000/

查找被映射到容器外的端口, 并用该端口测试是否部署成功

# WEB_PORT=$(sudo docker port $WEB_WORKER 5000 | awk -F: '{ print $2 }')
# curl http://127.0.0.1:$WEB_PORT
  Hello world!

Resources

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦