1、什么是容器?
一种虚拟化方案
操作系统级别的虚拟化
只能运行相同或者相似内核的操作系统
依赖于Linux内核特性:Namespace和Cgroups(Control Groups)
2、什么是Docker?
将应用程序自动部署到容器
Go语言开源引擎 Github地址:https://github.com/docker/docker
2013年初 dotCloud
基于Apache 2.0 开源授权协议发行
3、Docker的目标
提供简单轻量的建模方式
职责的逻辑分离
快速高效的开发生命周期
鼓励使用面向服务的架构
4、Docker的使用场景
A、使用Dockerr容器开发、测试、部署服务。
B、创建隔离的运行环境。
C、搭建测试环境
D、构建多用户的平台即服务(PaaS)基础设施
E、提供软件即服务(SaaS)应用程序
F、高性能、超大规模的宿主机部署
5、Docker的基本组成:
Docker Client 客户端 /守护进程 :C/S架构
Docker Daemon 守护进程 本地/远程
Docker Image 镜像:容器的基石、层叠的只读文件系统、联合加载(union mount)
Docker Container 容器 :通过镜像启动; 启动和执行阶段;写时复制(copy on write) (可写层)
Docker Registry 仓库:公有、私有仓库 Docker Hub 免费的公有仓库
6、bootfs--->rootfs(ubuntu)--->add emacs --->add Apache --->可写层
7、Docker 依赖的Linux内核特性:
a、Namespaces 命名空间 :
编程语言使用的目的是封装:代码隔离;
操作系统:系统资源的隔离、 进程、网络、文件系统。。。
Docker 使用了五种Namespaces 命名空间:
PID (Process ID) :进程隔离
NET(Network) : 管理网络接口
IPC(InterProcess Communication)管理跨进程通信的访问
MNT(Mount)管理挂载点
UTS(Unix Timesharing System)隔离内核和版本标识
b、Control groups (Cgroups) 控制组
资源限制、优先级设定、资源计量、资源控制
8、Docker 容器的能力:
文件系统的隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgroups 将CPU和内存之类的资源独立分配给每个Docker 容器
9、Docker 的运行环境
A、Linux容器技术
B、操作系统级别的虚拟化
C、依赖于Linux内核的Namespaces 和 Cgroups
10、容器的基本操作:
启动容器:
$ Docker run IMAGE [COMMAND] [ARG...]
run在新容器中执行命令
启动交互式容器:
$Docker run -i -t IMAGE /bin/bash
-i --interactive = true | false 默认是false
-t --tty = true | false 默认是false
exit 退出容器
查看容器:
$docker ps [-a] [-l] //查看全部最新的容器
$docker inspect 容器名字或者ID
重新启动停止的容器:
$ docker start [-i] 容器名
example : docker start -i comtainner0
删除停止的容器:
$ docker rm 容器名
11、守护式容器:能够长期运行、没有交互式会话、适合运行应用程序和服务
以守护形式运行容器:
$ docker run -i -t IMAGE /bin/bash
Ctrl + P Ctrl + Q (退出容器)后台运行
附加到运行中的容器: 进入已经退出的容器
$ docker attach 容器名
启动守护式容器:
$ docker run -d 镜像名[COMMAND] [ARG...] //使用后台的方式来执行命令
example:docker run --name dc1 -d ubuntu /bin/sh -c "while true; do echo hello world ; sleep 1; done "
查看容器日志:
$docker logs [-f] [-t] [--tail] 容器名
-f --follows=true | false 默认为false // 跟踪日志的变化并返回的告诉日志返回的结果
-t --timestamps=true | false 默认为false //返回的结果上加上时间戳
-- tail = "all" //返回日志的数量
查看容器内进程:
$docker top 容器名
$docker ps //查看哪些容器在运行
在运行中的容器内启动新进程:
$ docker exec [-d][-i] [-t] 容器名[COMMAD] [ARG...]
停止守护式容器:
$ docker stop 容器名 、//发送一个信号给容器,等待容器的停止
$ docker kill 容器名 //直接快速停止容器
使用Docker帮助文件
man docker -run
man docker-logs
man docker -top
man docker -exec
. . . . . .
12、在容器中部署静态网站:
设置容器的端口映射:
run [-P] [-p]
-P, --publish-all=true | false 默认为false //暴露容器所有的端口进行映射
docker run -P -i -t ubuntu /bin/bash
-p, --publish =[ ] //指定映射哪些容器的端口,指定有四种方式如下:
~containerPort
docker run -p 80 -i -t ubuntu /bin/bash //指定容器端口,宿主机端口随机映射
~hostPort: containerPort
docker run -p 8080:80 -i -t ubuntu /bin/bash //指定容器端口和宿主机端口
~ip::containerPort
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash //指定容器端口和IP
~ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash //指定IP和容器端口和宿主机端口
Nginx部署流程:
~创建映射80端口的交互式容器 、、、//docker run -p 80 --name web -i -t ubuntu /bin/bash
~安装Nginx // apt-get install -y nginx
~安装文本编辑器vim // apt-get install -y vim
~创建静态页面 // mkdir -p /var/www/html //cd /var/www/html //vim index.html 编辑静态页面
~修改Nginx配置文件 //whereis nginx查找NGINX的位置;//ls /etc/nginx //ls /etc/nginx/sites-enabled //vim /etc/nginx/sites-enabled/default //cd /
将server中root的值修改为静态网站的位置:root /var/www/html
~运行Nginx //nginx //ps -ef //Ctrl + P Ctrl + Q (退出容器)
//docker port web查看网站映射的端口 //docker top web 查看容器中进程的运行情况
~验证网站访问 //curl http://127.0.0.1:49167如果成功的话将会打印出html中的内容,也可以在网页中查看:浏览器输入127.0.0.1:49167
还可使用日期的IP地址进行查看://docker inspect web 查找“IPAddress”: 172.17.0.32 容器端口 //curl http://172.17.0.32 即可查看
/var/www/html中的内容:
Hello, I' m website in Docker!
关闭web容器:docker stop web
启动web容器:docker start -i web //重新启动后的容器并没有运行nginx ////Ctrl + P Ctrl + Q (退出容器)
//docker exec web nginx 启动nginx
//docker top web 查看容器中的进程
//curl http://172.17.0.32 会发现查看失败
// docker inspect web 会发现容器的IP地址变了。容器端口号也变了。
¥¥¥¥停止一个容器,并重新启动时。容器的IP地址和端口号都会发生改变。