阿里云部署Docker

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在这里

  • docker logs 标识符/name查看指定标识符下docker的log们

    阿里云部署Docker_第1张图片
    查看Log们

  • docker stop 标识符/name停止docker

    停止之后,果然木有了...

Docker容器使用

  • docker查看docker命令选项

  • docker command --help查看command的使用帮助

  • docker run -d -P training/webapp python app.py在docker中运行一个flask应用

    阿里云部署Docker_第2张图片
    docker run

    • -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中运行着的进程们

  • docker inspect检查docker中的底层信息,返回一个JSON文件记录着Docker容器的配置和状态信息

    阿里云部署Docker_第3张图片
    返回了很大一坨信息呢

  • docker stop 标识符停止容器
    通过docker ps -a指令,还能看到已经stop的容器

  • docker start 标识符重启已经停止的容器

  • docker ps -l查询最后一次创建的容器 last嘛

  • docker restart 标识符重启正在运行的容器

  • docker rm 标识符移除停止状态下的容器

    阿里云部署Docker_第4张图片
    移除之后,我们找不到jolly_stallman了...伤感ing...

Docker镜像的使用

当运行容器的时候,如果使用的镜像在本地不存在,会从docker镜像仓库中下载。默认是从Docker Hub公共镜像源下载的。
辣沫,这一小节,来看下:

  1. 如何管理和使用本地的Docker主机镜像
  2. 创建镜像(对的,之后直接把镜像安装到另一台机器上,就能保证环境一致啦!)
  • docker imges列出本地主机上的镜像

    对,我只有一个镜像...尴尬...

    • PEROSITORY:镜像的仓库源
    • TAG:镜像的标签
    • IMAGE ID:镜像ID
      现在知道docker run -t -i ubuntu:15.10 /bin/bash中的15.10出自哪里了吧
      当不指定镜像版本的时候,系统默认使用最新版
  • docker search 系统名(如centos)在docker hub上查找合适的镜像

    查查CentOS...不知道为啥,对CentOS有一种谜之偏爱...

  • docker pull 镜像NAMEdocker 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之间已经打开了一个安全隧道,且不需要暴露任何端口到容器外部 - 看看创建数据库容器的时候,我们没有绑定端口到主机哟!

你可能感兴趣的:(阿里云部署Docker)