Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用到一个轻量级的,可移植的容器中,然后发布到任何流行的linux机器上也可实现虚拟化。
使用Docker容器可以快速的构建和部署新应用程序。Docker容器将软件及其依赖关系整合到一个标准化的软件开发单元中,包括运行时
容器是完全使用沙箱机制,项目之间不会有任何接口,更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
应用场景
web应用的自动化打包和发布。
自动化测试和持续集成,发布。
在服务型环境中部署和调整数据库或其他的后台应用。
Docker的优点
简化程序
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的开发成果放入Docker中进行管理。方便快捷。
避免选择恐惧症
Docker镜像:Docker镜像包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如web应用,后台应用,数据库应用。
节省开支
云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
Docker 架构
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
Docker容器通过Docker镜像来创建。
容器与镜像的关系类似于面向对象编程中对象与类。
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
docker ps 查看所有容器
docker logs +CONTAINER ID:容器ID
实例 docker logs 2b1b7a428627
或docker logs +NAMES:自动分配的容器名称
实例 docker logs amazing_cori
Docker容器使用
Docker客户端
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
新建一个Docker镜像
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
参数说明
-d:让容器在后台运行
-p:将容器内部使用的网络端口映射到我们使用的主机上。
查看网络端口
docker port +CONTAINER ID:容器ID
docker port +NAME 容器name
查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
docker top wizardly_chandrasekhar
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect wizardly_chandrasekhar
停止 WEB 应用容器
docker stop wizardly_chandrasekhar
重启WEB应用容器
已经停止的容器,我们可以使用命令docker start来启动。
docker start wizardly_chandrasekhar
docker ps -l 查询最后一次创建的容器。
移除WEB应用容器
docker rm wizardly_chandrasekhar(容器name或ID)
*删除时,容器必须是停止状态 否则会报ERROR。
Docker镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是从Docker Hub公共镜像源下载
列出镜像列表
我们可以使用Docker image来列出本地主机上的镜像。
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签,版本
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时Docker就会自动下载这个镜像,如果我们想预先下载这个镜像,我们可以使用docker pull命令来下载它
搜索镜像
docker search httpd
更新镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
从已经创建的容器中更新镜像,并且提交这个镜像。
使用Dockerfile指令来创建一个新的镜像
cat Dockerfile
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN指令告诉docker在镜像内执行命令,安装了什么。
然后,我们使用DockerFile文件,通过docker build命令来构建一个镜像
docker build -t runoob/centos:6.7 .
参数说明
-t:指定要创建的目标镜像名
.:DockerFile文件所在目录,可以指定DockerFile的绝对路径
设置镜像标签
docker tag 镜像id runnoob/centos:dev
Docker容器连接
网络端口映射
创建一个python应用的容器。
docker run -d -P training/webapp python app.py
-P:是容器内部端口随机映射到主机的高端口。
-p:是容器内部端口绑定到指定的主机端口。
绑定到指定主机端口
docker run -d -p 5000:5000 training/webapp python app.py
指定容器绑定的网络地址,比如绑定 127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port 命令可以让我们快捷地查看端口的绑定情况
docker port adoring_stonebraker 5000
Docker容器连接
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:
docker run -d -P --name runoob training/webapp python app.py