Docker使⽤指南——基本操作
Docker 是⼀个能够把开发应⽤程序⾃动部署到容器的开源引擎。它由Docker公司的团队编写,基于Apache 2.0开源协议授权。它提供了⼀个简单、轻量的建模⽅式,使开发⽣命周期更⾼效快速,⿎励了⾯向服务的架构设计。Docker 项⽬的⽬标是实现轻量级的操作系统虚拟化解决⽅案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进⾏了进⼀步的封装,让⽤户不需要去关⼼容器的管理,使得操作更为简便。⽤户操作 Docker 的容器就像操作⼀个快速轻量级的虚拟机⼀样简单。
Docker 的特点:
1. 更快速的交付和部署
2. 更⾼效的虚拟化
3. 更轻松的迁移和扩展
4. 更简单的管理
容器技术与传统虚拟机性能对⽐
Docker与虚拟机建构对⽐
Docker 容器本质上是宿主机上的⼀个进程。Docker 通过 namespace 实现了资源隔离,通过 cgroups 实现了资源的限制,通过写时复制机制(copy-on-write)实现了⾼效的⽂件操作。
Docker有五个命名空间:进程、⽹络、挂载、宿主和共享内存,为了隔离有问题的应⽤,Docker运⽤Namespace将进程隔离,为进程或进程组创建已隔离的运⾏空间,为进程提供不同的命名空间视图。这样,每⼀个隔离出来的进程组,对外就表现为⼀个container(容器)。需要注意的是,Docker让⽤户误以为⾃⼰占据了全部资源,但这并不是”虚拟机”。
Docker 中的三个概念:镜像,容器,仓库
1. 镜像(image):Docker 镜像就是⼀个只读的模板,镜像可以⽤来创建 Docker 容器。Docker 提供了⼀个很简单的机制来创建镜像或
者更新现有的镜像,⽤户甚⾄可以直接从其他⼈那⾥下载⼀个已经做好的镜像来直接使⽤。
镜像是⼀种⽂件结构。Dockerfile中的每条命令都会在⽂件系统中创建⼀个新的层次结构,⽂件系统在这些层次上构建起来,镜像就构建于这些联合的⽂件系统之上。Docker官⽅⽹站专门有⼀个页⾯来存储所有可⽤的镜像,⽹址是:。
2. 容器( Container):容器是从镜像创建的运⾏实例。它可以被启动、开始、停⽌、删除。每个容
器都是相互隔离的、保证安全的平
台。可以把容器看做是⼀个简易版的 Linux 环境,Docker 利⽤容器来运⾏应⽤。镜像是只读的,容器在启动的时候创建⼀层可写层作为最上层。
3. 仓库:仓库是集中存放镜像⽂件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中⼜包含了多个镜像,每个镜
像有不同的标签(tag)。⽬前,最⼤的公开仓库是 Docker Hub,存放了数量庞⼤的镜像供⽤户下载。
Docker仓库⽤来保存我们的images,当我们创建了⾃⼰的image之后我们就可以使⽤push命令将它上传到公有或者私有仓库,这样下次要在另外⼀台机器上使⽤这个image时候,只需要从仓库上pull下来就可以了。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
⼀.安装 Docker
本次实验环境: CentOS 6.7 x86_64
前提条件:
Docker运⾏对内核要求⽐较⾼,因此⼀般建议直接在Ubuntu这样的平台运⾏。但作为⼀个容器标准,Docker也是⽀持其他如CentOS, Mac OS X, Windows等平台。⽬前Docker⽀持以下版本CentOS:
CentOS 7(64位)
CentOS 6.5(64位)及以后
在运⾏CentOS 6.5及以后版本时,需要内核版本>=2.6.32-431,因为这些内核包含了运⾏Docker的⼀些特定修改。
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 基本操作
# 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表⽰在构建过程中不使⽤缓存
更多信息:www.w3cschool/use_docker/
四、Docker compose项⽬
使⽤docker就不得不提Docker Compose,它是 Docker 官⽅编排(Orchestration)项⽬之⼀,负责快速在集中部署分布式应⽤。它允许⽤户通过⼀个单独的 docker-compose.
yml 模板⽂件(YAML 格式)来定义⼀组相关联的应⽤容器为⼀个项⽬(project)。就是说,你可以通过l 模板⽂件来定义⼀个服务器集,服务器集中的每个服务器就是⼀个容器,可以配置多个容器之间的⽹络连接、端⼝,容器服务器名称、服务器中运⾏的镜像、服务器的环境配置、启动命令等。使⽤的镜像,可以⼿动拉取镜像,也可以⾃动以l 构建环境后⾃动拉取。
Compose 中有两个重要的概念:
服务(service):⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例。
项⽬(project):由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 l ⽂件中定义。
五、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
六、Docker 命令查询
Docker 命令有两⼤类,客户端命令和服务端命令。前者是主要的操作接⼝,后者⽤来启动 Docker daemon。
客户端命令:基本命令格式为  docker [OPTIONS] COMMAND [] ;
服务端命令:基本命令格式为  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="[]":添加指定的键值对标注;
docker进入容器--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 [] ;[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 [] ;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)删除⼀个容器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。