Docker
应用场景:
1、Web应用的自动化打包和分布
2、自动化测试和持续集成、发布
3、在服务型环境中部署和调整数据库或其他的后台应用
4、从头编译或者扩展现有的OpenShift或Cloud Foundry 平来来搭建自己的PaaS环境
Docker的有点:
1、简化程序
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放到Docker中进行管理。方便快捷是Docker的最大优势,过去需要长时间才能完成的任务,在Docker容器的处理下,很快就能完成
2、避免了选择恐惧症
Docker可以打包,比如Docker的镜像:Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web后台、后台应用、数据库应用、大数据应用比如Hadoop集成、消息队列等等都可以打包成一个镜像部署
3、开源节流
Docker改变了高性能必须是高价格的思维方式。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式
Docker架构:
Docker使用客户端-服务端的架构模式(c/s),使用远程API来管理和创建Docker容器
Docker容器通过Docker镜像来创建
容器与镜像的关系类似于面向对象中的对象与类的关系
Docker镜像images | Docker镜像是用于创建Docker容器的模版 |
Docker容器container | 容器是独立运行的一个或一组应用 |
Docker客户端client | Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信。 |
Docker主机host | 一个物理或者虚拟的机器用于执行Docker守护进程和容器 |
Docker仓库registry | 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用 |
Docker Machine | 是一个简化Docker安装的命令行工具,通过一个简单的命令行既可以在相应的平台上安装Docker |
MacOS中安装Docker:
1、使用Homebrew进行安装
Homebrew的Cask已经支持Docker for Mac
1、brew cask install docker
在载入Docker app之后,点击Next,可能会询问你的macOS登陆密码,你输入就可以,之后会弹出一个Docker运行的提示窗口,状态栏上会出现一个鲸鱼🐳的图标
2、手动下载安装
点击stable或edge版本的Docker for mac
安装也非常简单,双击下载的.dmg文件,然后将鲸鱼图标拖拽到Application文件夹就可以了
第一次点击图标,可能会看到这个安装成功的界面,点击“Got it!”可以关闭这个窗口
3、启动终端之后,通过命令可以检查安装后的Docker版本
docker --version
镜像加速
由于国内网速的问题,后续拉取Docker镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com
在任务栏点击Docker for mac应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击Apply&Restart按钮,Docker就会重启并应用配置的镜像地址了。
之后我们可以通过docker info来查看是否配置成功了
Docker Hello World:
Docker允许你在容器内运行应用程序,使用docker run命令来在容器内运行一个运行程序
输出hello world
docker run ubuntu:15.10 /bin/echo 'hello world'
各个参数解析:
docker:Docker的二进制执行文件
run:与前面的docker组合来运行一个容器
ubuntu:15.10:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker就会从镜像仓库Docker Hub下载公共镜像
/bin/echo 'hello world':在启动的容器里执行的命令
以上命令的完整意思可以理解成Docker以ubuntu15.10 镜像创建一个新容器,然后在容器里执行bin/echo 'hello world',然后在输出结果
运行交互式的容器:
我们通过docker的两个参数-i -t,让docker运行的容器实现“对话”的能力
docker run -i -t ubuntu:15.10 /bin/bash
通过运行这条命令可以直接进入到容器内部
各个参数解析:
-i:允许你对容器内的标准输入(STDIN)进行交互
-t:在新容器内指定一个伪终端或终端
这个时候我们已经进入到Ubuntu15.10系统的容器,这个时候我们就可以在容器中运行命令cat/proc/version/ls分别查看当前系统的版本信息和当前目录下的文件
我们可以通过exit命令或者ctrl+D来退出容器
启动容器(后台模式)
首先以进程方式运行一个容器
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
在输出中,我们没有看到期望的‘hello world’,而是一串长的字串, 这个长的字串叫做容器ID,对于每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过docker ps来查看
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器中使用docker logs命令,查看容器内的标准输出
停止容器:
使用docker stop命令来停止容器
通过docker ps查看,容器已经停止工作
Docker容器的使用:
Docker客户端:
docker客户端可以直接输入docker命令来查看Docker客户端的所有命令选项
可以通过docker command --help 更深入的了解指定的Docker命令使用方法
例如我们要是想查看docker stats指令的具体使用方法那就是docker stats --help
运行一个web应用
尝试使用docker构建一个web应用程序
我们将在docker中运行一个python flask应用来运行一个web应用
docker pull training/webapp # 载入镜像 docker run -d -P training/webapp python app.py
各个参数解析:
-d:让容器在后台运行
-P:将容器内部使用的网络端口映射到我们使用的主机上
查看web应用容器
使用docker ps查看我们正在运行的容器
这里面多了一个端口信息,Docker开放了5000端口(默认python flask端口)映射到主机端口上,这个时候我们可以通过访问0.0.0.0:32768就可以看到内容了,
这时候我们也可以通过-p参数来设置不一样的端口
docker run -d -p 5000:5000 training/webapp python app.py
这时候执行一下docker ps
这时候可以看到内部的5000端口已经映射到了我们本地主机的5000端口上了
网络端口的快捷方式:
通过docker ps可以查看到容器的端口映射,docker还提供了另一个快捷方式docker port,使用docker port 可以查看指定(ID或者名字)容器的某个确定端口映射到宿主机的端口号
上面我们创建的web应用ID为88ea02cd5e88 ,名字是keen_lewin。这时候我们可以使用docker port 88ea02cd5e88
或者 docker port keen_lewin 来查看容器端口的映射情况
查看web应用程序的日志:
docker logs [ID 或者名字]可以查看容器内部的标准输出
docker logs -f 88ea02cd5e88
参数解析:
-f:让docker logs像使用tail -f一样来输出容器内部的标准输出,从上面我们可以看到应用程序使用的是5000端口并且能够查看到应用程序的访问日志
查看web应用程序容器的进程:
可以使用docker top来查看容器内部运行的进程
检查web应用程序:
使用docker inspect来查看Docker的底层信息,它会返回一个json文件记录这Docker容器的配置文件和状态信息
停止web应用容器:
docker stop
重启web应用容器:
已经停止了的容器需要先使用docker start 来进行启动
docker ps -l --> 查询最后一次创建的容器
正在运行的容器,我们可以使用docker restart命令来进行重启
移除web应用容器
可以使用docker rm来移除我们不需要的容器,在移除的时候,容器必须是停止的状态,否则会报错误
Docker镜像使用:
列出镜像列表:
可以使用docker images来列出本地主机上的镜像
各个参数详解:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一个仓库源可以有多个TAG,代表这个仓库源的不同的版本,比如ubuntu仓库源中,可以有多个不同的版本,我们可以使用REPOSITORY:TAG来定义不同的镜像,所以我们如果 要使用版本是15.10的ubuntu系统镜像来运行容器的时候,命令就可以是:docker run -i -t ubuntu:15.10 /bin/bash 如果要使用14.04的ubuntu那么只需要把那个15.10切换一下就可以了
如果你不指定一个镜像的版本标签,例如你只使用ubuntu,那么docker将默认使用ubuntu:latest镜像
获取一个新的镜像:
当我们在本地主机上使用一个不存在的镜像的时候Docker就会自动下载这个镜像,如果我们想预先下载这个镜像,我们就可以使用docker pull命令来下载它
查找镜像:
我们可以从Docker Hub网站来搜索镜像,Docker Hub的网址是 https://hub.docker.com/
我们可以直接在终端中通过docker search命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们就可以通过docker search httpd 来搜索适合我们的镜像
各个参数解析:
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否是docker官方发布的
拖取镜像:
如果我们决定使用上图中的httpd官方版本的镜像,使用命令docker pull就可以下载下来了
下载完成之后就可以使用这个镜像了:docker run httpd
创建镜像:
当我们从docker镜像仓库中下载的镜像不能满足我们的需求的时候,我们就可以通过以下两种方式对镜像进行修改
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用Dockerfile指令来创建一个新的镜像
更新镜像:
在更新镜像之前我们需要使用镜像来创建一个容器:docker run -t -i ubuntu:15.10 /bin/bash
在运行的容器内使用apt-get update命令来进行更新,完成之后使用exit来进行退出
完成之后我们可以通过docker commit来提交容器副本:docker commit -m='has update' -a='runoob' 容器ID runoob/ubuntu:v2
未写完。。。
Docker容器连接:
网络端口映射:
首先创建一个python应用的容器docker run -d -P training/webapp python app.py
我们使用-P参数创建一个容器,使用docker ps可以看到容器端口5000绑定主机端口32768
我们也可以使用-p标识来指定容器端口绑定到主机端口
两种方式的区别:
1、-P:是容器内部端口随机映射到主机的高端口
2、-p:是容器内部端口绑定到指定的主机端口
另外我们可以指定容器绑定的网络地址,比如绑定127.0.0.1
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
这样我们就可以通过访问127.0.0.1:5001来访问容器的5000的端口
上面这种方法是TCP的方式,如果要绑定udp就需要在端口后面加上/udp
docker port可以让我们快捷的查看端口的绑定情况
docker容器连接:
端口映射并不是唯一把docker连接到另一个容器的方法,docker有一个连接系统允许将多个容器连接在一起,共享连接信息,docker连接会创建一个父子关系,其中父容器可以看到子容器的信息
容器命名:
当我们创建一个容器的时候,docker会自动对它进行命名。另外我们也可以使用--name标识来命名的容器