Docker
简介
容器:最新的容器技术引入了OpenVZ,Solaris Zones以及Linux容器。使用这些新技术,容器不再仅仅是一个单纯的运行环境。更像一个完整的宿主机。
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(www.docker.com),前dotCloud公司,PaaS市场老牌提供商的团队编写,基于Apache 2.0开源授权协议发行
Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。目的是提供一个轻量级、快速的环境,能够运行开发者的程序,并方便高效的部署。
Docker所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制最小限的宿主机。
特点
提供简单轻量的建模方式:上手快,依赖于写时复制模型,使修改应用程序很迅速。同一台宿主机中可以运行更多的容器
职责的逻辑分离:开发人员只关心容器中运行的应用程序,运维只关心如何管理容器
快速、高效的开发生命周期:缩短代码从开发、测试、部署、上线的周期,具备可移植性,易于构建,并易于协作
鼓励使用面向服务的架构:Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型。
Docker组件
Docker客户端和服务器
Docker客户端只需向Docker服务器或守护进程发送请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTful API。可以在同一台宿主机上运行Docker守护进出城和客户端,也可以从本地连接到另外一台宿主机
Docker镜像
用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的构建部分。镜像是基于联合(Union)文件系统的一种层式结构,由一系列指令一步一步构建出来。
也可以把镜像当做容器源码。镜像体积小、便携、易于分析、存储、更新
Registry
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。
公共的Registry叫做Docker Hub,可以注册账号,分享保存自己的镜像
容器
Docker可以帮你构建和部署容器,只需要把自己的应用程序或服务打包放进容器即可。
容器是基于镜像启动的,可以运行一个或多个进程。
集装箱概念
标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而Docker运输软件。
每个容器都包含一个软件镜像,也就是容器的货物,而且与真正的货物一样,容器里的软件镜像可以进行一些操作。例如,镜像可以被 :创建、启动、关闭、销毁
Docker并不关心容器中是什么,也不关心把容器运到何处
Docker能做什么
沙盒:一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。
容器可以为各种测试提供很好的沙盒环境。容器本身就具有标准型的特征,非常适合为服务创建构建块。Docker的一些应用场景如下
- 加速本地开发和构建,使其更加高效、更加轻量化
- 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果
- 用Docker创建隔离的环境来进行测试。例如Jenkins CI
- Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试
- 构建一个多用户的平台即服务PaaS基础设施
- 为开发、测试提供一个轻量级的独立沙盒环境
- 提供软件即服务SaaS应用程序
- 高性能,超大规模的宿主机部署
Docker安装
https://docs.docker.com/install/
Docker守护进程
安装完Docker后,需要确认Docker的守护进程是否运行。Docker以root权限运行它的守护进程,来处理普通用户无法完成的操作。docker程序是Docker守护进程的客户端程序,也需要以root身份运行
当安装完毕后,会立即启动Docker守护进程,来监听Docker请求。
配置守护进程
export DOCKER_ HOST=" tcp:// 0.0.0.0:2375"
Docker图形界面
Docker安装完成后,可以用图形界面来管理
DockerUI:是一个可以与Docker Remote API交互的Web界面
https://github.com/kevana/ui-for-docker
Docker入门
启动第一个容器:docker run -it ubuntu /bin/bash
#
Docker速查
测试是否正常安装:docker run hello-world
docker info:查看全部信息
docker version:查看版本信息
docker run:创建一个新的容器并运行一个命令
-
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
--name="nginx-lb": 为容器指定一个名称;
-
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-
-h "mars": 指定容器的hostname;
-
-e username="ritchie": 设置环境变量;
-
--env-file=[]: 从指定文件读入环境变量;
-
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-
-m :设置容器使用内存最大值;
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;
-
--link=[]: 添加链接到另一个容器;
-
--expose=[]: 开放一个端口或一组端口;
-
--volume , -v: 绑定一个卷
- --rm:容器退出时就能够自动清理容器内部的文件系统
实例:
使用docker镜像nginx以后台模式启动一个容器,并将其命名mynginx
docker run --name mynginx -d nginx:latest
使用镜像nginx:latest以后台模式启动一个容器,将80端口映射到主机随机端口
docker run -p -d nginx:latest
以后台模式启动一个容器,将80端口映射到主机的80端口,目录映射到容器的目录
docker run -p 80:80 -v /data:/data -d nginx:latest
绑定容器的8080端口,并将其映射到本地主机的80端口上
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用镜像nginx以交互模式启动一个容器,在容器内执行/bin/bash命令
docuer run -it nginx:latest /bin/bash
docker start:启动一个或多个已被停止的容器
docker stop:停止一个运行中的容器
docker restart:重启容器
docker kill:杀掉一个运行中的容器
docker kill $(docker ps -a -q):杀死所有正在运行的容器
docker rm $(docker ps -a -q):删除所有已停止的容器
docker rmi $(docker images -q -f dangling=true):删除所有悬挂的镜像
docker rmi $(docker images -q):删除所有镜像
docker volume prune:清除所有无用的区卷
docker rm:删除一个或多个容器
- -f:通过SIGKILL信号强制删除一个运行中的容器
- -l:移出容器间的网络连接,而非容器本身
- -v:删除与容器关联的卷
docker pause:暂停容器中所有的进程
docker unpause:恢复容器中所有的进程
docker create:创建一个容器但不启动它。与docker run相用法同
docker exec:在运行的容器中执行命令
- -d:分离模式,在后台运行
- -i:即使没有附加也保持STDIN打开
- -t:分配一个终端
实例
以交互模式运行脚本runoob.sh
docker exec -it mynginx /bin/sh /root/runoob.sh
在容器mynginx中开启一个交互模式的终端
docker exec -it mynginx /bin/bash
docker ps:列出容器
- -a:显示所有容器,包括未运行的
- -f:根据条件过滤显示的内容
- --format:指定返回值的模板文件
- -l:显示最近创建的容器
- -n:列出最近创建的n个容器
- --no-trunc:不截断输出
- -q:静默模式,只显示容器编号
- -s:显示总的文件大小
实例
列出所有运行的容器
docker ps
列出最近创建的5个容器
docker ps -n 5
列出所有创建的容器ID
docker ps -a -q
docker inspect:获取容器/镜像的元数据
- -f:指定返回值的模板文件
- -s:显示总的文件大小
- --type:为指定类型返回JSON
实例
获取正在运行的容器mymysql的IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql
docker top:查看容器中运行的进程信息,支持ps命令参数
实例
列出所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
docker attach:连接正在运行中的容器
docker events:从服务器获取实时事件
- -f:根据条件过滤事件
- --since:从指定的时间戳后显示所有事件
- --until:流水时间显示到指定的时间为止
docker logs:获取容器的日志
- -f:跟踪日志输出
- --since:显示某个开始时间的所有日志
- -t:显示时间戳
- --tail:仅列出最新N条容器日志
实例
跟踪查看容器mynginx的日志输出
docker logs -f mynginx
docker wait:阻塞运行直到容器停止,然后打印出它的退出代码
docker export:将文件系统作为一个tar归档文件导出到STDOUT
- -o:将输入内容写到文件
实例
将id为a404的容器按日期保存为tar文件
docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
docker port:列出指定的容器的端口映射
实例
查看容器mynginx的端口映射情况
docker port mymysql
docker commit:从容器创建一个新的镜像
- -a:提交的镜像作者
- -c:使用Dockerfile指令来创建镜像
- -m:提交时的说明文字
- -p:commit时,将容器暂停
实例
将容器a404保存为新的镜像,并添加提交人信息和说明信息
docker commit -a "ruboob.com" -m "my apache" a404c6c174a2 mymysql:v1
docker cp:用于容器与主机之间的数据拷贝
- -L:保持源目标中的链接
实例
将主机/www/runoob目录拷贝到容器96f7的/www目录下
docker cp /www/runoob 96f7f14e99ab:/www/
将主机/www/ruboob目录拷贝到容器下,重命名为www
docker cp /www/runoob 96f7f14e99ab:/www
将容器86f7f14e99ab的www目录拷贝到主机的/tmp目录中
docker cp 96f714e99ab:/www /tmp
docker diff:检查容器里文件结构的更改
实例
查看容器mymysql的文件结构更改
docker diff mymysql
docker login:登录镜像仓库
docker logout:注销镜像仓库
- -u:登录用户名
- -p:登录密码
docker pull:拉取镜像或更新指定镜像
- -a:拉取所有tagged镜像
- --disable-content-trust:忽略镜像的校验
实例
下载java镜像
docker pull java
docker push:将本地的镜像上传到镜像仓库
实例
上传本地镜像到镜像仓库
docker push myapache:v1
docker search:从Docker Hub查找镜像
- --automated:只列出automated build类型的镜像
- --no-trunc:显示完整的镜像描述
- -s:列出收藏数不小于指定值的镜像
实例
查找所有包含java,并且收藏数大于10的镜像
docker search -s 10 java
docker images:列出本地镜像
- -a:列出本地所有的镜像
- --digests:显示镜像的摘要信息
- -f:显示满足条件的镜像
- --format:指定返回值的模板文件
- --no-trunc:显示完整的镜像信息
- -q:只显示镜像ID
docker rmi:删除本地一个或多个镜像
- -f:强制删除
- --no-prune:不移除该镜像的过程镜像
实例
强制删除本地镜像
docker rmi -f runoob/ubuntu:v4
docker tag:标记本地镜像,将其归入某个仓库
实例
将镜像ubuntu标记为runoob/ubuntu
docker tag ubuntu:15.10 runoob/ubuntu:v3
docker build:命令用于使用Dockerfile创建镜像
- --build-arg=[]:设置镜像创建时的变量
- --cpu-shares:设置CPU使用权重
- --cpu-period:限制CPU CFS周期
- --cpu-quota:限制CPU CFS配额
- --cpuset-cpus:指定使用的CPU id
- --cpuset-mems:指定使用的内存id
- -f:指定要使用的Dockerfile路径
- --force-rm:设置镜像过程中删除中间容器
- --isolation:使用容器隔离技术
- --label=[]:设置镜像使用的元数据
- -m:设置内存最大值
- --memory-swap:设置Swap的最大值内存+swa
- --no-cache:创建镜像的过程不使用缓存
- --pull:尝试去更新镜像的新版本
- --quiet,-q:安静模式,成功后只输出镜像id
- --rm:设置镜像成功后删除中间容器
- --shm-size:设置dev/shm的大小
- --ulimit:Ulimit配置
- --tag,-t:镜像的名称及标签,通常name:tag或name
- --network:构建期间设置RUN指令的网络模式
实例
使用当前目录的Dockerfile创建镜像
docker build -t runoob/ubuntu:v1 .
使用URL的Dockerfile 创建镜像
docker build github.com/creack/docker-firefox
通过-f Dockerfile文件的位置
dockere build -f /path/to/a/Dockerfile .
docker history:查看指定镜像的创建历史
- -H:以可读的格式打印镜像大小和日期
- -q:仅列出提交记录ID
实例
查看本地镜像的创建历史
docker history runoob/ubuntu:v3
docker save:将指定镜像保存成tar归档文件
- -o:输出到文件
实例
将镜像生成tar文档
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
docker import:从归档文件中创建镜像
- -c:应用docker指令创建镜像
- -m:提交时的说明文字
实例
从镜像归档文件.tar创建镜像
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
docker info:显示Docker系统信息,镜像、容器数
docker version:显示Docker版本
#
Dockerfile
Dockerfile是一个文本文档,包含用户可以在命令行上调用以组合图像的所有命令。
docker buil用户可以创建一个连续执行多个命令指令的自动创建
docker build命令根据Dockerfile上下文构建镜像。构建上下文是指定位置PATH或文件集URL。PATH是本地文件系统上的目录。URL是一个Git存储库位置
docker build .
构建工作由Docker守护程序运行。第一件事是整个上下文发送到守护进程。最好是空目录作为上下文,并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。
要在构建上下文中使用文件,需要引用指令中指定的文件,例如COPY。要提高性能可以通过.dockerignore来排除文件和目录
可以使用-f 标志来指向任何位置的Dockerfile
docker build -f /path/to/a/Dockerfile .
可以指定存储库和标记,保存新图像
docker build -t shykes/myapp .
构建后将镜像标记为多个存储库
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .