Docker基本基础知识了解
将服务拆散开,以链接、api、转发、负载均衡等方式对外提供,在提供商这里,拆小了业务逻辑,将原先生产一条飞机的难度降低到了生产一颗螺丝钉上去。对于开发者和消费者,微服务提供了更多的可能和更强大的兼容性。
然而,抛开了完整的系统,而转向微服务的我们,该如何保证微服务的稳定和高可用呢?
云计算就像一个池子,服务就像池子里的水,正常情况下,服务从提供商手里流出,保障其基础设施的运转良好。但是当你的池子不够大呢?扩容?是个好办法。但是这需要时间和成本的开销,而且运维反应速度慢和快也是衡量一个公司服务能力的重要标准。因此,在云计算时代,无论企业还是个人,都需要一个轻便,易于部署,快速迁移,快速启动的环境设置技术来支持服务启用、备份、容灾、迁移。
这个技术,就是Docker。
root@server-zyq9z8tu:/var/run# servicedocker.io status
docker.io start/running, process 2711
An Interactive Container
一个可以交互的容器。我们输入如下命令:
一个是-t,表示给我们的容器tty,终端。一个是-i表示可以interactive,可以交互。
我们在之前的命令行已经看到了:
~# docker run -i -t ubuntu:14.04 /bin/bash
通过Exit,退出了Bash,容器也就自动释放了
abroot@server-zyq9z8tu:~$ docker ps
2015/08/15 16:18:04 Gethttp:///var/run/docker.sock/v1.12/containers/json: dial unix/var/run/docker.sock: permission denied
abroot@server-zyq9z8tu:~$ sudo –s
容器后台运行持续化,守候进程化–d
由于容器在执行完任务后,会退出,给一个循环
root@server-zyq9z8tu:~# docker run -d ubuntu /bin/sh
2a7a1552c890eb4bd189dc5face034b08f4c633dff3c1095566336ad409db943
root@server-zyq9z8tu:~# docker run -dubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
106f519c896dbd3dfec58230c260d5c5c28b31eb8c87b8a98e045190d6f68bad
命令行返回ID,但这个ID一般多是内部使用,就和noVNC,lxc等类似,用户使用的是Name
这个name:condescending_carson来自docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
106f519c896d ubuntu:14.04 /bin/sh -c 'while tr 5 seconds ago Up 4 seconds condescending_carson
root@server-zyq9z8tu:~# docker logscondescending_carson
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
在后台的容器,如何关闭?想附加上去如何操作?
1\attach,然后Exit/Ctrl+C
root@server-zyq9z8tu:/var/run# dockerattach condescending_carson
进入了console输出,然后Ctrl+C
2\stop命令
root@server-zyq9z8tu:/var/run# docker stopcondescending_carson
condescending_carson
root@server-zyq9z8tu:/var/run# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
进入容器后,外部可操作的其实不多的,类似虚拟化之后只有一个文件:
1. docker ps - Lists containers.
2. docker logs - Shows us the standard output of a container.
3. docker stop - Stops running containers.
发布web应用
Web应用最重要的是port,可http访问,这个就涉及,类似NAT的端口映射
-p, --publish=[] Publish a container's port to the host
format:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(use 'dockerport' to see the actual mapping)
root@server-zyq9z8tu:~#docker run -d -Ptraining/webapppython app.py
Unable to find image 'training/webapp'locally
Pulling repository training/webapp
02a8815912ca: Pulling dependent layers
02a8815912ca: Pulling image (latest) fromtraining/webapp
e9e06b06e14c: Download complete
a82efea989f9: Download complete
37bea4ee0c81: Download complete
这里要执行的命令是python app.py,我们在容器里面看下app.py的示范代码
[c8eb30e5] +job
allocate_port(a72accf82221d4fb85972b18cf90b00c4c9a059a0059ac0150d5b68597530eaf)
[c8eb30e5] -job
allocate_port(a72accf82221d4fb85972b18cf90b00c4c9a059a0059ac0150d5b68597530eaf) =OK (0)
[c8eb30e5] -job
start(a72accf82221d4fb85972b18cf90b00c4c9a059a0059ac0150d5b68597530eaf)= OK (0)
===〉
root@server-zyq9z8tu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a72accf82221 training/webapp:latest python app.py About a minute ago Up About a minute 0.0.0.0:49153->5000/tcp nostalgic_blackwell
-p参数之后,实现了端口的映射:本机49153的内容就会转发到容器nostalgic_blackwell
尝试了用交互方式启动,可惜还是没想到如何进入container分析下这个py脚本
root@server-zyq9z8tu:~# docker run -t -i -Ptraining/webapp python app.py
*Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
永远的hello word在index.html中!
如果我们期望用本地的固定的端口来映射,请用小写的-p指定端口
-P, --publish-all=false Publish all exposed ports to the hostinterfaces
-p, --publish=[] Publish a container's port to thehost
format: ip:hostPort:containerPort|ip::containerPort | hostPort:containerPort
(use 'dockerport' to see the actual mapping)
1. docker run -d -p 5000:5000 training/webapp python app.py
2. aa47ba8e71c8512f228a96bf80da117b6c86fc03bdb17eef1c2db353a3e18493
还是要一探究竟啊!
root@server-zyq9z8tu:~# docker run -t -itraining/webapp /bin/bash
root@d26086b1b3f0:/opt/webapp# pwd
/opt/webapp
==========================
Vi app.py
==========================
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
provider = str(os.environ.get('PROVIDER', 'world'))
return 'Hello '+provider+'!'
if __name__ == '__main__':
#Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
~
~
~