docker学习(1)

docker介绍

docker是一个开源的引擎,可以为任何应用创建一个轻量级的,可移植的,自给自足的容器。
可以让开发者打包他们的应用以及他们的依赖包到一个轻量级,可移植的容器当中。然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙盒机制的,相互之间不会有任何的接口。类似iphone中的app,更重要的是容器性能开销极低。

docker应用场景

1.Web 应用的自动化打包和发布。
2.自动化测试和持续集成、发布。
3.在服务型环境中部署和调整数据库或其他的后台应用。
4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

docker架构

docker使用客户端-服务器(C/S)架构模式,使用远程api来管理和创建docker容器。
docker容器通过docker镜像来创建。
镜像相当于类,容器相当于类、
类似于如下图:

docker镜像(images):用于创建docker容器的模板
docker容器(containers):容器是独立运行的一个或一组应用
docker客户端(clients):通过命令行或者其他工具使用docker的API
docker主机(hosts):一个物理或者虚拟的机器用于执行docker守护进程和容器
docker仓库(regisity):仓库用来保存镜像。可以理解为代码控制中的代码仓库。

mac端安装

可以使用docker客户端或者使用brew install docker进行安装即可。

创建hello world

docker允许在容器内允许应用程序,使用docker run命令来在容器中运行一个应用程序.

1
docker run ubuntu:16.04 /bin/echo "hello world"

参数解析:
docker:docker的二进制执行文件
run:与前面的docker组合运行一个容器
ubuntu16.04:表示指定要运行的容器。首先从本地主机上查找镜像是否存在,如果不存在,docker便会从镜像库中下载
/bin/echo “hello world” 在启动的容器里执行命令
运行交互式的容器
-i -t 让docker运行的容器实现”对话”的能力。

1
docker run -i -t ubuntu:16.04 /bin/bash

-t:在新容器中指定一个伪终端或者终端
-i:允许对容器内的标准输入进行交互
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器

1
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

输出为efc7e4901d5997dbd419aeb3086a0edf741b51f0a6dcf291ffa535d3e74bd172
这个长字符叫做容器的ID,对每个容器来说是唯一的。

1
docker ps

来查看容器的运行状态
container ID表示容器ID,names表示自动分配的容器的名称。

docker容器的使用

可以直接输入docker命令来查看docker客户端的所有命令。
运行一个web应用程序
以python为例
1.载入镜像

1
docker pull training/webapp  # 载入镜像

开始运行

1
docker run -d -P training/webapp python app.py

-d表示容器在后台运行 -P表示容器内部使用的网络端口映射到我们使用的主机上面

查看web应用程序

1
docker ps

来查看正在运行的容器
可以表明flask的5000端口映射到了本机的32768端口
访问localhost:32768便可以访问docker容器中的5000端口
使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
docker port bf08b7f2cd89 也是根据容器的id来进行指定即可。
重启web容器

1
docker start wizardly_chandrasekhar

移除web应用程序

1
docker rm wizardly_chandrasekhar

注意 删除容器的时候,容器必须是停止状态,否则会报错。

docker指定端口

1
docker run -d --name = "ckq" -p 127.0.0.1:5001:5000 training/webapp python app.py

指定本机127.0.0.1:50001端口映射到容器内的5000端口,–name表示指定名字 -d表示后台运行。