Docker 是一个可以把开发应用程序自动部署到容器的开源引擎。它由Docker公司的团队编写,基于Apache 2.0开源协议受权。它提供了一个简单、轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计。Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。html
Docker 的特色:node
容器技术与传统虚拟机性能对比python
Docker与虚拟机建构对比linux
Docker 容器本质上是宿主机上的一个进程。Docker 经过 namespace 实现了资源隔离,经过 cgroups 实现了资源的限制,经过写时复制机制(copy-on-write)实现了高效的文件操做。nginx
Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组建立已隔离的运行空间,为进程提供不一样的命名空间视图。这样,每个隔离出来的进程组,对外就表现为一个container(容器)。须要注意的是,Docker让用户误觉得本身占据了所有资源,但这并非”虚拟机”。web
Docker 中的三个概念:镜像,容器,仓库docker
镜像(image):Docker 镜像就是一个只读的模板,镜像能够用来建立 Docker 容器。Docker 提供了一个很简单的机制来建立镜像或者更新现有的镜像,用户甚至能够直接从其余人那里下载一个已经作好的镜像来直接使用。
镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中建立一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。Docker官方网站专门有一个页面来存储全部可用的镜像,网址是:index.docker.io。shell
容器( Container):容器是从镜像建立的运行实例。它能够被启动、开始、中止、删除。每一个容器都是相互隔离的、保证安全的平台。能够把容器看作是一个简易版的 Linux 环境,Docker 利用容器来运行应用。镜像是只读的,容器在启动的时候建立一层可写层做为最上层。数据库
仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上每每存放着多个仓库,每一个仓库中又包含了多个镜像,每一个镜像有不一样的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。json
Docker仓库用来保存咱们的images,当咱们建立了本身的image以后咱们就可使用push命令将它上传到公有或者私有仓库,这样下次要在另一台机器上使用这个image时候,只须要从仓库上pull下来就能够了。Docker 仓库的概念跟 Git 相似,注册服务器能够理解为 GitHub 这样的托管服务。
本次实验环境:腾讯云服务器 CentOS 6.7 x86_64
前提条件:
Docker运行对内核要求比较高,所以通常建议直接在Ubuntu这样的平台运行。但做为一个容器标准,Docker也是支持其余如CentOS, Mac OS X, Windows等平台。目前Docker支持如下版本CentOS:
Docker默认使用AUFS做为存储驱动,可是AUFS并无被包括在Linux的主线内核中。CentOS中可使用Device Mapper做为存储驱动,这是在2.6.9内核版本引入的新功能。咱们须要先确认是否启用该功能:
CentOS 7
Docker RPM包已经包含在CentOS-Extra仓库中,因此咱们能够直接使用Yum安装:
# yum install docker
CentOS 6.6
须要注意的是,CentOS6.6中,已经有一个同名docker的可执行系统程序包。因此Docker RPM包命名为docker-io,咱们先卸掉docker。
# yum -y remove docker
第三步 Install Docker-IO
# yum -y install docker-io
这样完成了Docker的安装。
# /etc/init.d/docker start #启动docker
# docker info #查看 docker 基本信息
# docker run -d --name mynginx nginx #启动nginx镜像,没有会自动pull # docker stop bfd094233f96 #中止一个容器,根据容器 id 进行删除 # docker rm bfd094233f96 #删除一个容器 # docker attach d20f3dc6cd92 #进入一个正在运行的容器
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
–name 使用一个自定义的名字
此命令不太好用,建议使用如下命令进入容器:
[root@localhost docker] docker inspect --format "{{.State.Pid}}" mynginx #获取容器pid 19769 [root@localhost docker] nsenter --target 19769 --mount --uts --ipc --net --pid #进入容器(推荐方法) docker run -d -p 91:80 --name mynginx2 nginx # -p 指定端口映射,将80映射为host的91
存储镜像:
# docker save -o ubuntu_14.04.tar ubuntu:14.04
载入镜像:
# docker load < ubuntu_14.04.tar 或者使用 # cat ubuntu.tar | docker import - test/ubuntu:v1.0
移除本地镜像:
# docker rmi training/sinatra
清理全部未打过标签的本地镜像:
# docker rmi $(docker images -q -f "dangling=true")
其中 -q 和 -f 是 quiet,–filter 的缩写, 完整的命令其实能够写着下面这样,是否是更容易理解一点?
# docker rmi $(docker images --quiet --filter "dangling=true")
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
要获取容器的输出信息,能够经过 docker logs 命令。# docker logs [container ID or NAMES]
删除容器:# docker rm 默认并不会删除运行中的容器
有关容器和镜像的底层信息:# docker inspect container/image
能够查看:
容器实例的IP地址
端口绑定列表
特定端口映射的搜索
收集配置的详细信息
从容器内复制文件到指定的路径上:# docker cp container:path hostpath
使用Dockerfile来构建镜像:# docker build [options] PATH | URL
–rm=true表示构建成功后,移除全部中间容器
–no-cache=false表示在构建过程当中不使用缓存
更多信息:https://www.w3cschool.cn/use_docker/
4、Docker compose项目
使用docker就不得不提Docker Compose,它是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。它容许用户经过一个单独的 docker-compose.
yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。就是说,你能够经过docker-compose.yml 模板文件来定义一个服务器集群,服务器集群中的每一个服务器就是一个容器,能够配置多个容器之间的网络链接、端口,容器服务器名称、服务器中运行的镜像、服务器的环境配置、启动命令等。使用的镜像,能够手动拉取镜像,也能够自动以docker-compose.yml 构建环境后自动拉取。
Compose 中有两个重要的概念:
服务(service):一个应用的容器,实际上能够包括若干运行相同镜像的容器实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义。
5、Docker compose安装与卸载
Compose 目前支持 Linux 和 Mac OS 平台,二者的安装过程大同小异。安装 Compose 以前,要先安装 Docker(须要 Docker Engine 1.7.1+),Compose 能够经过 Python 的 pip 工具进行安装,能够直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
1)首先安装epel扩展源:
sudo yum -y install epel-release
2)而后安装python-pip
sudo yum -y install python-pip
pip install docker-compose
3)版本查询
docker-compose –v
4)卸载
pip uninstall docker-compose
6、Docker 命令查询
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操做接口,后者用来启动 Docker daemon。
客户端命令:基本命令格式为 docker [OPTIONS] COMMAND [arg...] ;
服务端命令:基本命令格式为 docker daemon [OPTIONS] 。
能够经过 man docker 或 docker help 来查看这些命令。
1)服务端命令:docker daemon [OPTIONS] ,[OPTIONS] 的选项有:
--api-cors-header="":CORS 头部域,默认不容许 CORS,要容许任意的跨域访问,能够指定为 “*”;
--authorization-plugin="":载入认证的插件;
-b="":将容器挂载到一个已存在的网桥上。指定为 'none' 时则禁用容器的网络,与 --bip 选项互斥;
--bip="":让动态建立的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
--cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为/docker ,systemd cgroup 驱动为 system.slice ;
--cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址;
--cluster-advertise="":构成集群时,自身的被访问地址,能够为host:port 或 interface:port ;
--cluster-store-opt="":构成集群时,键值数据库的配置选项;
--config-file="/etc/docker/daemon.json":daemon 配置文件路径;
--containerd="":containerd 文件的路径;
-D, --debug=true|false:是否使用 Debug 模式。缺省为 false;
--default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
--default-gateway-v6="":容器的 IPv6 网关地址;
--default-ulimit=[]:默认的 ulimit 值;
--disable-legacy-registry=true|false:是否容许访问旧版本的镜像仓库服务器;
--dns="":指定容器使用的 DNS 服务器地址;
--dns-opt="":DNS 选项;
--dns-search=[]:DNS 搜索域;
--exec-opt=[]:运行时的执行选项;
--exec-root="":容器执行状态文件的根路径,默认为 /var/run/docker ;
--fixed-cidr="":限定分配 IPv4 地址范围;
--fixed-cidr-v6="":限定分配 IPv6 地址范围;
-G, --group="":分配给 unix 套接字的组,默认为 docker ;
-g, --graph="":Docker 运行时的根路径,默认为 /var/lib/docker ;
-H, --host=[]:指定命令对应 Docker daemon 的监听接口,能够为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
--icc=true|false:是否启用容器间以及跟 daemon 所在主机的通讯。默认为true。
--insecure-registry=[]:容许访问给定的非安全仓库服务;
--ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0;
--ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
--ip-masq=true|false:是否进行地址假装,用于容器访问外部网络,默认开启;
--iptables=true|false:是否容许 Docker 添加 iptables 规则。缺省为 true;
--ipv6=true|false:是否启用 IPv6 支持,默认关闭;-l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
--label="[]":添加指定的键值对标注;
--log-driver="jsonfile|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file;
--log-opt=[]:日志后端的选项;
--mtu=VALUE:指定容器网络的 mtu;
-p="":指定 daemon 的 PID 文件路径。缺省为 /var/run/docker.pid ;
--raw-logs:输出原始,未加色彩的日志信息;
--registry-mirror=://:指定 docker pull 时使用的注册服务器镜像地址;
-s, --storage-driver="":指定使用给定的存储后端;
--selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
--storage-opt=[]:驱动后端选项;
--tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
--tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
--tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
--tlscert= /.docker/key.pem:TLS 密钥文件路径;
--tlsverify=true|false:启用 TLS 校验,默认为否;
--userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通讯,默认为 true;
--userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是建立新的 UID 和 GID 映射到容器内进程。
2)客户端命令:docker [OPTIONS] COMMAND [arg...] ;[OPTIONS] 的选项有:
--config="":指定客户端配置文件,默认为 /.docker ;
-D=true|false:是否使用 debug 模式。默认不开启;
-H, --host=[]:指定命令对应 Docker daemon 的监听接口,能够为 unix 套接字(unix:///path/to/socket),文件句柄(fd://socketfd)或 tcp 套接字(tcp://[host[:port]]),默认为 unix:///var/run/docker.sock;
-l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
--tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
--tlscacert= /.docker/ca.pem:TLS CA 签名的可信证书文件路径;
--tlscert= /.docker/cert.pem:TLS 可信证书文件路径;
--tlscert= /.docker/key.pem:TLS 密钥文件路径;
--tlsverify=true|false:启用 TLS 校验,默认为否。
3)客户端命令:docker [OPTIONS] COMMAND [arg...] ;COMMAND的选项有:
可使用:docker COMMAND --help 来查看每一个命令的具体用法
attach:依附到一个正在运行的容器中;
build:从一个 Dockerfile 建立一个镜像;
commit:从一个容器的修改中建立一个新的镜像;
cp:在容器和本地宿主系统之间复制文件中;
create:建立一个新容器,但并不运行它;
diff:检查一个容器内文件系统的修改,包括修改和增长;
events:从服务端获取实时的事件;exec:在运行的容器内执行命令;
export:导出容器内容为一个 tar 包;
history:显示一个镜像的历史信息;
images:列出存在的镜像;
import:导入一个文件(典型为 tar 包)路径或目录来建立一个本地镜像;
info:显示一些相关的系统信息;
inspect:显示一个容器的具体配置信息;
kill:关闭一个运行中的容器 (包括进程和全部相关资源);
load:从一个 tar 包中加载一个镜像;
login:注册或登陆到一个 Docker 的仓库服务器;
logout:从 Docker 的仓库服务器登出;
logs:获取容器的 log 信息;
network:管理 Docker 的网络,包括查看、建立、删除、挂载、卸载等;
node:管理 swarm 集群中的节点,包括查看、更新、删除、提高/取消管理节点等;
pause:暂停一个容器中的全部进程;
port:查找一个 nat 到一个私有网口的公共口;
ps:列出主机上的容器;
pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
rename:重命名一个容器;
restart:重启一个运行中的容器;
rm:删除给定的若干个容器;
rmi:删除给定的若干个镜像;
run:建立一个新容器,并在其中运行给定命令;
save:保存一个镜像为 tar 包文件;
search:在 Docker index 中搜索一个镜像;
service:管理 Docker 所启动的应用服务,包括建立、更新、删除等;
start:启动一个容器;
stats:输出(一个或多个)容器的资源使用统计信息;
stop:终止一个运行中的容器;
swarm:管理 Docker swarm 集群,包括建立、加入、退出、更新等;
tag:为一个镜像打标签;
top:查看一个容器中的正在运行的进程信息;
unpause:将一个容器内全部的进程从暂停状态中恢复;
update:更新指定的若干容器的配置信息;version:输出 Docker 的版本信息;
volume:管理 Docker volume,包括查看、建立、删除等;
wait:阻塞直到一个容器终止,而后输出它的退出符。
4)Docker 删除命令实例
a)删除一个容器
docker rm <containerID>
b)强制删除一个容器
docker rm -f <containerID>
c)强制删除所有容器
docker rm -f $(docker ps -aq)
d)删除一个镜像:
docker rmi <imageID>
e)强制删除一个镜像:
docker rmi -f <imageID>
f)强制删除所有镜像
docker rmi -f $(docker images -q)
5)一张图总结 Docker 的命令
Docker 命令分布图:
7、Docker Compose命令查询
对于 Compose 来讲,大部分命令的对象既能够是项目自己,也能够指定为项目中的服务或者容器。若是没有特别的说明,命令对象将是项目,这意味着项目中全部的服务都会受到命令影响。执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 能够查看具体某个命令的使用格式。
Compose 命令的基本的使用格式是:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
[options] 选项:
-f, --file FILE 指定使用的 Compose 模板文件,默认为 dockercompose.yml ,能够屡次指定。
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称做为项目名。
--x-networking 使用 Docker 的可拔插网络后端特性(须要 Docker 1.9 及之后版本)。
--x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge (须要 Docker 1.9 及之后版本)。
--verbose 输出更多调试信息。
-v, --version 打印版本并退出。[COMMAND] 选项:
1)build:格式为 docker-compose build [options] [SERVICE...]
构建(从新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,多是 web_db。能够随时在项目目录下运行 docker-compose build 来从新构建服务。
它的[options] 选项包括:
--force-rm 删除构建过程当中的临时容器。
--no-cache 构建镜像过程当中不使用 cache(这将加长构建过程)。
--pull 始终尝试经过 pull 来获取更新版本的镜像。2)kill:格式为 docker-compose kill [options] [SERVICE...]
经过发送 SIGKILL 信号来强制中止服务容器。支持经过 -s 参数来指定发送的信号,例如经过以下指令发送 SIGINT 信号:docker-compose kill -s SIGINT
3)logs:格式为 docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认状况下,docker-compose 将对不一样的服务输出使用不一样的颜色来区分。能够经过 --no-color 来关闭颜色。该命令在调试问题的时候十分有用。
4)pause:格式为 docker-compose pause [SERVICE...]
暂停一个服务容器。5)port:格式为 docker-compose port [options] SERVICE PRIVATE_PORT
打印某个容器端口所映射的公共端口。
[options] 选项:
--protocol=proto 指定端口协议,tcp(默认值)或者 udp。
--index=index 若是同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。6)ps:格式为 docker-compose ps [options] [SERVICE...]
列出项目中目前的全部容器。选项:
-q 只打印容器的 ID 信息。7)pull:格式为 docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。
选项:
--ignore-pull-failures 忽略拉取镜像过程当中的错误。8)restart:格式为 docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项:
-t, --timeout TIMEOUT 指定重启前中止容器的超时(默认为 10 秒)。9)rm:格式为 docker-compose rm [options] [SERVICE...]
删除全部(中止状态的)服务容器。推荐先执行 docker-compose stop 命令来中止容器。
选项:
-f, --force 强制直接删除,包括非中止状态的容器。通常尽可能不要使用该选项。
-v 删除容器所挂载的数据卷。10)run:格式为 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
例如:
$ docker-compose run ubuntu ping docker.com将会启动一个 ubuntu 服务容器,并执行 ping docker.com 命令。
默认状况下,若是存在关联,则全部关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令相似启动容器后运行指定的命令,相关卷、连接等等都将会按照配置自动建立。
两个不一样点:
- 给定命令将会覆盖原有的自动运行命令;
- 不会自动建立端口,以免冲突。
若是不但愿自动启动关联的容器,可使用 --no-deps 选项,例如
$ docker-compose run --no-deps web python manage.py shell
将不会启动 web 容器所关联的其它容器。
[options] 选项:-d 后台运行容器。
--name NAME 为容器指定一个名字。
--entrypoint CMD 覆盖默认的容器启动指令。
-e KEY=VAL 设置环境变量值,可屡次使用选项来设置多个环境变量。
-u, --user="" 指定运行容器的用户名或者 uid。
--no-deps 不自动启动关联的服务容器。
--rm 运行命令后自动删除容器, d 模式下将忽略。
-p, --publish=[] 映射容器端口到本地主机。
--service-ports 配置服务端口并映射到本地主机。
-T 不分配伪 tty,意味着依赖 tty 的指令将没法运行。11)scale:格式为 docker-compose scale [options] [SERVICE=NUM...]
设置指定服务运行的容器个数。经过 service=num 的参数来设置数量。例如:
$ docker-compose scale web=3 db=2
将启动 3 个容器运行 web 服务,2 个容器运行 db 服务。通常的,当指定数目多于该服务当前实际运行容器,将新建立并启动容器;反之,中止容器。
选项:
-t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。12)start:格式为 docker-compose start [SERVICE...]
启动已经存在的服务容器。13)stop:格式为 docker-compose stop [options] [SERVICE...]
中止已经处于运行状态的容器,但不删除它。经过 docker-compose start 能够再次启动这些容器。
选项:
-t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。14)unpause:格式为 docker-compose unpause [SERVICE...] 。
恢复处于暂停状态中的服务。15)up:格式为 docker-compose up [options] [SERVICE...] 。
该命令十分强大,它将尝试自动完成包括构建镜像,(从新)建立服务,启动服务,并关联服务相关容器的一系列操做。
连接的服务都将会被自动启动,除非已经处于运行状态。能够说,大部分时候均可以直接经过该命令来启动一个项目。
默认状况, docker-compose up 启动的容器都在前台,控制台将会同时打印全部容器的输出信息,能够很方便进行调试。当经过 Ctrl-C 中止命令时,全部容器将会中止。
若是使用 docker-compose up -d ,将会在后台启动并运行全部的容器。通常推荐生产环境下使用该选项。
默认状况,若是服务容器已经存在, docker-compose up 将会尝试中止容器,而后从新建立(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配docker-compose.yml 文件的最新内容。若是用户不但愿容器被中止并从新建立,可使用 docker-compose up --no-recreate 。这样将只会启动处于中止状态的容器,而忽略已经运行的服务。若是用户只想从新部署某个服务,可使用docker-compose up --no-deps -d <SERVICE_NAME> 来从新建立服务并后台中止旧服务,启动新服务,并不会影响到其所依赖的服务。[options] 选项:
-d 在后台运行服务容器。--no-color 不使用颜色来区分不一样的服务的控制台输出。
--no-deps 不启动服务所连接的容器。
--force-recreate 强制从新建立容器,不能与 --no-recreate 同时使用。
--no-recreate 若是容器已经存在了,则不从新建立,不能与 --forcerecreate同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。16)migrate-to-labels:格式为 docker-compose migrate-to-labels 。 从新建立容器,并添加 label。 主要用于升级 1.2 及更早版本中建立的容器,添加缺失的容器标签。实际上,最完全的办法固然是删除项目,而后从新建立。 17)version:格式为 docker-compose version 。 打印版本信息。