wiki这个东东实在是个好东西...想着在阿里云上部署一套 参考链接。但是之前还在上面部署了一个Flask跑起来的小服务器...希望以后将他改造为自己的博客系统,所以需要用到Docker这个东东来做隔离...
嘛...写着写着的一点小感悟:虽然人的基本认知模型是:是什么-为什么-怎么样,但是写东西或者学东西的时候,往往从「为什么」入手会更容易,尤其是研究新技术。某个技术之所以出现,一定是为了解决某个问题的,所以所以,一定要先把问题找到、讲明白。
「以终为始」「不是学某个东东,而是用某个东东」 - 既然是用,就一定是要解决问题的...嗯嗯,有点啰嗦...
Why Docker?
I 替代方案不够优雅
上一篇文章使用CentOS部署Flask介绍到了隔离Python环境用到的两种手段:virtualenv和pyenv,但是这两种手段有如下缺陷:
- 只能提供Python级别的隔离,无法确保系统库和其他环境
- 如果不在正式环境中运行它,意味着开发环境和正式环境有差异,指不定会出什么幺蛾子
- 依靠修改脚本和设置路径实现,不够优雅与纯粹
(其他缺陷可以参考:Why I hate virtualenv and pip)
II Docker足够优秀
How To Deployment
阿里云部署文档
查看CentOS版本号:cat /proc/version
Docker要求64位的系统且内核版本至少为3.10
如果你使用阿里云,可以参考他们的更换内核文档做系统版本升级
How To Use
参考文档
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序
想在CentOS通过ubuntu运行个程序试试?
docker run ubuntu:15.10 /bin/echo "Hello world"
为你加载或下载ubuntu15.10,然后echo个Hello world
聊聊命令和参数:
- t:在新容器中指定一个伪终端或终端
-
- i:允许你对容器内的标准输入进行交互
docker run -i -t ubuntu:15.10 /bin/bash
-
- c:启动一个后台运行的容器
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
-
docker ps
可以查看当前运行着的Docker们
-
docker logs 标识符/name
查看指定标识符下docker的log们
-
docker stop 标识符/name
停止docker
Docker容器使用
docker
查看docker命令选项docker command --help
查看command的使用帮助-
docker run -d -P training/webapp python app.py
在docker中运行一个flask应用
- -d --detach:后台运行 Run container in background and print container ID
- -P --publish-all:将容器内部使用的网络端口,映射到主机的一个随机端口上 Publish all exposed ports to random ports
- -p --publish value:绑定指定的端口 Publish a container's port(s) to the host (default []) - 和-P互斥吧应该
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
同时指定映射到主机的IP和Port,并指定绑定UDP端口
TODO:示例图片待补充...不会在Docker里配置Python环境,跑不起来flask...
docker ps
查看到的docker信息会有PORTS字段,
0.0.0.0:32769->5000/tcp
表示docker中的5000端口,映射到了主机的32769端口上docker port docker标识符
查看标识符的docker中port的映射关系-
docker logs -f 标识符
查看docker的标准输出- -f:像使用tail -f一样来输出容器内部的标准输出
-
docker top 标识符
查看Docker中的运行着的进程
-
docker inspect
检查docker中的底层信息,返回一个JSON文件记录着Docker容器的配置和状态信息
docker stop 标识符
停止容器
通过docker ps -a
指令,还能看到已经stop的容器docker start 标识符
重启已经停止的容器docker ps -l
查询最后一次创建的容器 last嘛docker restart 标识符
重启正在运行的容器-
docker rm 标识符
移除停止状态下的容器
Docker镜像的使用
当运行容器的时候,如果使用的镜像在本地不存在,会从docker镜像仓库中下载。默认是从Docker Hub公共镜像源下载的。
辣沫,这一小节,来看下:
- 如何管理和使用本地的Docker主机镜像
- 创建镜像(对的,之后直接把镜像安装到另一台机器上,就能保证环境一致啦!)
-
docker imges
列出本地主机上的镜像
- PEROSITORY:镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
现在知道docker run -t -i ubuntu:15.10 /bin/bash
中的15.10出自哪里了吧
当不指定镜像版本的时候,系统默认使用最新版
-
docker search 系统名(如centos)
在docker hub上查找合适的镜像
docker pull 镜像NAME
或docker pull 系统名
预先下载某镜像,暂不使用。第二个指令默认下载官方版-
docker commit -m="has update" -a="镜像作者名" Docker标识符 目标镜像名(一般是 作者名/操作系统:v版本号)
- 示例:
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
- commit之后,本地就有了这个镜像,通过
docker images
可以看到
- 示例:
docker tag xxx 镜像名称
为镜像名称指定一个新的tag
使用描述文件构建镜像:没啥大意思也不难,可以参考这里
容器连接
目标:通过端口,连接到一个Docker
Docker连接到另一个容器,有两个方案:
- 方案一:端口映射(只能连接到主机的端口吧...)
- 方案二:使用Docker的连接系统,将多个Docker连接在一起,共享连接信息。连接会创建父子关系,父容器可以看到子容器的信息。
- 先创建一个数据库容器
sudo docker run -d --name db training/postgres
- 再创建一个web服务器容器连接到数据库容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py
--link name:alias
- db是父容器,web是子容器,父可访问子。此时两个docker之间已经打开了一个安全隧道,且不需要暴露任何端口到容器外部 - 看看创建数据库容器的时候,我们没有绑定端口到主机哟!
- 先创建一个数据库容器