Docker的使用场景:
1.使用Docker容器开发、测试、部署服务
2. 创建隔离的运行环境
3. 搭建测试环境
4. 构建多用户的平台即服务(PaaS)基础设施
5. 提供软件即服务(SaaS)应用程序
6. 高性能、超大规模宿主机部署
Docker的组成
docker client和docker server。
Docker的组件
镜像(Image)(相当于一个完整的操作系统)、容器(Container)(通过镜像启动,用来运行应用,相互隔离)、仓库(Repository)(集中存放镜像文件)
容器和镜像是docker最核心的部分,使用docker时就是在容器里面运行一个镜像。容器是运行在虚拟机上的一个进程,只不过加入了对资源的隔离和限制。docker的三大核心功能就是CGroups、Namespace和UnionFS。CGroups技术用来限定一个进程的资源使用;Namespace技术用来划分不同的命名空间,在一个操作系统上,用户ID,机器名等资源是全局的,运行的进程间都是访问同一份资源,为了达到隔离的目的,出现了Namespace技术;UnionFS用来出来分层镜像。镜像相当于容器中的文件系统,镜像和容器也可以相互转换。
docker用到的namespace技术:
PID(Process ID) 进程隔离
NET (Network) 管理网络接口
IPC (InterProcess Communication) 管理跨进程通信的访问
MNT (Mount) 管理挂载点
UTS (Unix Timesharing System) 隔离内核和版本标识
docker用到的CGroups技术:
资源限制
优先级设定
资源计量
资源控制
docker容器的能力
文件系统隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用CGroups将CPU和内存之类的资源独立分配给每个docker容器
docker的守护式容器:
能够长期运行
没有交互式会话
适合运行应用程序和服务
以守护形式运行容器:
步骤:
- docker run -i -t IMAGE /bin/bash
- 按Ctrl+P和Ctrl+Q
上述两步变成守护式,如果还想回到容器,则用如下命令: - docker attach CONTAINER ID或者names
即用容器ID或者容器名字可回到容器。
docker常用的命令:
docker search --搜索镜像,如docker search centos
docker pull repository[:tag] --获取镜像,如docker pull ubuntu,如docker pull ubuntu:14.04
docker push 镜像名 向dockerHub推送镜像
docker images [-a][-q][镜像名]–查看镜像
docker inspect 容器名/容器ID/镜像:版本(即repository:tag)
docker rmi --删除镜像,需要跟镜像id
docker info --查看运行状态及版本信息的命令
docker run --name -h hostname --启动容器
后面的名字是自动生成的,可以重新起个名字。
启动交互式容器命令格式:
docker run -i -t IMAGE /bin/bash
docker run --name myDocker -it centos /bin/bash
可以看到已经进入了一个容器里
给容器重新命名为myDocker,-it是两个参数,-i让容器输入终端保持打开,-t是开一个伪终端。
docker run -d --name mydocker1 centos
在后台启动一个名字为mydocker1的守护式容器。-d和–name可以交换位置。返回一个很长的容器id
docker start [-i] CONTAINER ID --启动已终止的容器
docker stop CONTAINER ID --停止容器
docker ps --查看容器,docker ps -a 查看所有运行和已停止的容器,docker ps -l 查看最近运行的容器
docker exec|docker attach --进入容器
docker rm CONTAINER ID–删除容器
进入一个后台运行的容器:
docker ps -l --查看上次运行的容器
查看容器日志:
- docker logs [-f][-t][–tail] 容器名/容器id
-t 输出时间戳
-f 不断输出更新的日志
–tail 输出最新的日志
docker logs -tf --tail 10 dct //输出最新的十条,输出时间戳并不断更新,dct为容器名字。
查看容器内进程
- docker top 容器名/容器id
在运行的容器中启动新进程
- docker exec [-d][-i][-t] 容器名/容器id 命令和参数
停止守护式容器,两种方式。
- docker stop 容器名/容器id 发送信号给容器,等待容器的停止,默认有10s的时间
- docker kill 容器名/容器ID kill会直接停止容器
可以使用 man docker-命令 来查看docker具体命令的介绍
在容器中部署静态网站
设置容器的端口映射:run [-P][-p]
docker的run命令后面跟大写的P,是将容器暴露的端口,随机映射到宿主机上。
如:docker run -P -it ubuntu /bin/bash --将容器暴露的所有端口,随机映射到宿主机上。
docker run -P 80 ubuntu /bin/bash --将容器的80端口,随机映射到宿主机的一个端口上。
使用小写的p,是将指定容器的端口,映射到宿主机的一个端口,有四种形式:
- containerPort
docker run -p 80 -it ubuntu /bin/bash
将容器端口80随机映射到宿主机上 - hostPort:containerPort
docker run -p 8080:80 -it ubuntu /bin/bash
将容器80端口映射到宿主机8080端口上 - ip::containerPort
docker run -p 0.0.0.0::80 -it ubuntu /bin/bash - ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -it ubuntu /bin/bash
ip均是宿主机的ip
用例:在容器中部署静态网站–Nginx
* 运行一个带端口映射的交互容器
docker run -p 80 --name web -it ubuntu /bin/bash
* 进入容器后,安装nginx,注意一定要先update。
apt-get update && apt-get install -y nginx
*安装vim命令
apt-get install -y vim
*安装好vim命令后,在容器下建目录
mkdir -p /var/www/html
*之后进入到该路径下,编辑一个静态页面
vim index.html
进入编辑模式后,按i进入插入模式,输入如下内容:
编辑完成后,按ESC,输入:wq 保存退出。
*通过 whereis nginx命令查看nginx安装到哪:
列出/etc/nginx目录下的文件及文件夹:ls /etc/nginx
列出sites-enabled目录下的文件
查看并修改default文件:
修改root后的内容为刚才创建的目录
返回至容器的根目录,运行nginx
按ctrl +pq后,输入ps -ef后,可看到nginx已经在运行了。
运行docker ps后可看到将容器的80端口映射到了主机的32768端口,
注意:IPV4中,0.0.0.0地址被用于表示一个无效的,未知的或者不可用的目标。 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。在路由中,0.0.0.0表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由
可以通过docker port docker top这些命令看端口映射及进程。
运行之后使用curl命令,查看是否正常:
curl http://127.0.0.1:32768
返回如下:
表示正常,也可以在Ubuntu的浏览器中访问:
或者查看容器的ip地址,在Ubuntu系统浏览器访问容器,ctrl+pq退出容器,输入docker inspect 容器名/容器ID
如下,可得到相同的结果
容器的80端口默认不写。当把该容器stop之后,再启动起来,则这个容器的ip地址会被重新分配,再curl原来的地址就不能用了。