最近看到很多docker的消息,去docker.com上下载玩了一下。这里记录下命令,以备下次参考。

以在Docker中跑一个Python的web application为例:

下载与安装

去官网上找 安装步骤

装好后,试跑一下:

$ docker run ubuntu echo hello

会自动下载ubuntu的image,并且执行echo hello的shell命令

VPS

运行:

$ docker run -t -i ubuntu /bin/bash

进入ubuntu的image,然后执行了/bin/bash的命令,相当于有了自己的vps,可以向平时操作ubuntu一样随意操作它,注意,如果你输入exit退出这个image,你对系统的改动并不会保存,比如你进入后安装了很多软件,新建了很多文件,然后直接exit了,下次你再使用上面的命令进入时,这些都会丢失。

保存Image

2个方法来保存这些改动。

方法一:当你做完改动后(例如安装了很多软件,跑起了Apache)等等,然后可以起另一个shell(也可以使用Ctrl+p & Ctrl + q来detach终端,使用docker ps找到container id后,再使用”docker attach containerid”的命令attach回去),使用命令:

$ docker ps

然后你会看到你的cotainer id,保存这个container id,使用:

$ docker commit <container id> yourname/reponame

其中输入containerid时不需要全部的字符串,只要它的前面3~4位即可;yourname是在docker.com上注册的username,reponame你可以自己随便取。例如:

$ docker commit ecda vonbo/webdev

commit成功后使用:

$ docker images

可以查看已经在image列表里了。

方法二,做一个你自己的image,下次直接使用。这里需要先写一个Dockerfile,Dockerfile里包含了一些规则来告诉docker如何build一个image。这里以build一个跑flask的python application为例:

新建Dockerfile,内容为:

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y wget tar dialog vim nano build-essential
RUN apt-get install -y python python-dev python-distribute python-pip
RUN pip install flask
RUN mkdir /home/root
WORKDIR /home/root
RUN wget http://download.0coder.com/app.txt
RUN mv app.txt app.py
ENTRYPOINT  ["python", "app.py", "&"]

其中app.txt的内容为:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

只是简单的输入hello world,运行在5000端口上。

写好Dockerfile后,就可以build它了。

$ docker build vonbo/webdev .

记得输入最后的点,表示在当前目录找Dockerfile。

等它build完成后,使用:

$ docker images

就可以在image列表中看到了。

运行

以刚才build好的webdev为例,运行:

$ docker run -d -t -p 8080:5000 vonbo/webdev

-p 8080表示将host的8080端口映射到container的5000端口,这个5000就是前面在flask里写的那个端口号。输入后使用:

$ docker ps -l

可以看到这个在运行的container。然后使用你的host ip地址看下效果,访问:http://yourhostip:8080/,
你就可以看到Hello World的输入了。

保存

将你做好的image push到server中去,这样你其它的server也可以把它拉下来快速使用。push使用:

$ docker push vonbo/webdev

这样会把这个image push到public的repo中,你在其它任何机器都可以使用:

$ docker pull vonbo/webdev

来获得这个image,然后运行。

但很多时候,我们希望这些image是私有的,不让别人搜到或者使用,这时可以使用tag。首先去docker.com中新建一个private的repo,免费的帐号可以新建一个private的repo,比如这里命名为vonbo/private。

然后在你本地跑container的时候,将这个container commit到这个private的repo里去,并给它一个tag,以上面的webdev为例:

$ docker login
$ docker commit edca vonbo/private:webdev
$ docker push vonbo/private

注意,因为是private的repo,在做这个操作之前需要先执行登录操作。这样你就把这个container push到了私有的repo。

理论上tag的使用貌似是让你对同一个container | image做不同的版本,但是这里比较tricky的使用了tag来区分不同的container | image,例如你想另外做一个image跑redis,跑起来后可以把那个container使用同样的方法push到private里去。这么做原因是免费账户只提供一个private repo,这样可以把多个container都放到你这个private里去。

使用

你已经把image都push到了你private的repo中,现在假设你要在windows中部署测试,在安装docker后,可以使用:

$ docker pull vonbo/private:webdev
$ docker run -d -t -p 8080:5000 vonbo/private:webdev

然后访问http://192.168.59.103:8080 就可以看到结果。
(192.168.59.103是docker跑虚拟机的默认ip地址)你还可以跑多个端口映射:

$ docker run -d -t -p 8081:5000 vonbo/private:webdev

然后访问http://192.169.59.103:8081 也可以看到结果。使用:

$ docker ps

可以看到跑了两个container的instance。

假设还做了另外一个private的redis的image,可以使用同样的方法将它跑起来:

$ docker pull vonbo/private:redis
$ docker run -d vonbo/private:redis

参考

  1. ubuntu上安装docker
  2. windows上安装docker
  3. Build your own registry
  4. Working with docker hub
  5. How to Containizer Python Web Application
  6. Dockerizing a Redis service