docker从入门到精(fang)通(qi)(一)
导语:一篇我自己的docker学习总结,重在基础,如有错误,欢迎各种讨论、建议、批评、指正。
1、docker是什么
docker是一种Linux容器(LXC,即linux container)引擎,它与传统的虚拟化技术的区别在于容器本身不做硬件层级的虚拟化,而是一种操作系统级的虚拟化技术,通过Linux内核的一些特性(namespace、control group)实现容器与容器、容器与宿主机之间的隔离,它是一种半虚拟化技术。
docker的特点有:
- 拥有独立的根文件系统、存储空间和网络
- 只能创建Linux容器
- 极快的启动速度与极低的运行开销
- 引擎运行的依赖环境非常简单
- 可将应用及其依赖环境一起打包到容器中
2、docker有什么
在docker官网上有这么几款开源工具:
- docker engine:基本的完整功能docker包,包含docker引擎和客户端,适用于单台主机
- docker compose:一个用于一组不同功能容器的docker工具。例如用django搭建一个博客时,需要同时用到nginx容器、mysql容器、redis容器,可以使用docker compose进行统一编排
- docker registry:私有docker镜像仓库搭建工具,docker中的每一个容器都是从镜像建立的。
- docker machine:一个帮助我们简化部署docker引擎的工具,可以通过一条命令在各种架构中部署docker
- docker swarm:一个docker机群的编排调度工具,类似工具还有google出品的kubernetes
docker由哪几部分组成呢?
- docker 引擎:即docker daemon,docker守护进程,它根据镜像生成容器,运行容器。docker引擎有点像虚拟光驱,iso文件就是docker镜像,而容器就是我们在资源管理器中看到的虚拟光驱加载的光盘
- docker 客户端:用来向daemon发送指令,这也说明docker是一个C/S架构程序
- docker 镜像:即docker image,容器产生的图纸和材料。docker的容器镜像是基于一种特殊的层式文件系统,这种方式便于镜像的重复利用与容器回滚,更多信息可以看一下这篇文章还有这一篇
- docker 仓库:即docker registry,镜像仓库,有docker公司搭建的公有库docker hub,由于速度的问题可以使用国内的一些公共库比如daocloud或者自建私有库,docker的仓库概念与git、github相似
- docker 容器:即docker container,docker所建立的虚拟化实例,类似传统虚拟化里的虚拟机
3、docker怎么装
安装前的检查
docker依赖条件极少,各平台安装包发行较为完善,安装过程也非常简单。安装之前首先要检查以下先决条件:
- 安装主机必须是64位CPU架构的机器
- 操作系统内核为3.8或更高
- 内核必须支持以下几种存储驱动之一(一篇深入探讨存储驱动的文章):
- Device Mapper
- AUFS
- vfs
- btrfs
- ZFS(docker1.7中引入)
- overlay1或2
-通常默认驱动是Device Mapper或AUFS
- 内核必须开启cgroup、namespace功能
docker安装
具体安装ubuntu使用apt-get安装docker-engine包,redhat/centos 6.X中需先添加epel源后使用yum安装docker-io包。
P.S. Ubuntu中如果使用了UFW,需要修改/etc/default/ufw文件中的配置并重新加载:
DEFAULT_FORWARD_POLICY="ACCEPT"
(默认是DROP)
$ sudo ufw reload
docker服务器启动
redhat/centos 6.X中:
$ sudo service docker start
redhat/centos 7.X中:
$ sudo systemctl start docker
4、docker怎么玩
启动docker服务器:docker daemon
要想创建运行容器,首先要运行docker守护进程,docker daemon命令在1.16版本开始被dockerd命令代替。以下是一些启动docker守护进程时的可选参数:
$ dockerd --help
Usage: dockerd COMMAND
A self-sufficient runtime for containers.
Options:
-b, --bridge string [指定守护进程使用的网桥接口,默认是docker0] Attach containers to a network bridge
-D, --debug [启用调试模式] Enable debug mode
-g, --graph string [设置守护进程运行时根目录] Root of the Docker runtime (default "/var/lib/docker")
-G, --group string [设置unix socket的属组] Group for the unix socket (default "docker")
-H, --host list [指定守护进程的通信接口,可以是一个unix socket、IP、域名] Daemon socket(s) to connect to (default [])
-l, --log-level string [设置日志等级] Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
-p, --pidfile string [指定守护进程PID文件地址] Path to use for daemon PID file (default "/var/run/docker.pid")
-s, --storage-driver string [设置存储驱动] Storage driver to use
-v, --version [查看docker版本] Print version information and quit
创建并运行一个容器
docker守护进程也启动好了,不管别的,先运行一个容器尝尝:
docker run -i -t ubunt /bin/bash
稍等片刻,我们会发现shell发生了变化:
那么这个命令运行过程中发生了什么?
- docker在本地查找名为ubuntu的镜像,没找到
- 由于未指明tag,docker将会从docker hub拉取
ubuntu:latest
这个镜像,latest就是默认的tag,最新版 - 然后我们经过漫长的等待(有可能)会看到几行乱码后面跟着
Pull complete
,镜像就下载完了。这其中每一行实际上是镜像的每一层,乱码是每一层的ID,这一层又一层实际上从Dockerfile(用于创建镜像的文件)生成的。Dockerfile怎么玩?以后再写。。。 - 镜像有了docker开始创建容器,-i表示打开容器的STDIN,-t分配一个伪tty终端,然后运行bash shell
docker命令
docker从1.13开始对现有的40多个顶级命令进行组织整理,形成一组管理命令,让用户使用和理解命令更方便更容易。
现有管理命令如下:
container Manage containers(容器管理)
image Manage images(镜像管理)
network Manage networks(docker内部网络管理)
node Manage Swarm nodes(swarm节点管理)
plugin Manage plugins(插件管理)
secret Manage Docker secrets(密钥管理)
service Manage services(docker 服务管理,负责
让运行在docker中的应用保持一个理想可用的状态。此处理解不到位,待深入)
stack Manage Docker stacks(docker捆绑包管理,即docker compose创建的一组容器。此处理解不到位,待深入)
swarm Manage Swarm(Swarm集群管理)
system Manage Docker(docker服务器管理)
volume Manage volumes(卷管理)
管理命令展开
1.容器命令:docker container
该命令包括与docker容器相关的操作
docker container attach|commit|cp|create|diff|exec|export|inspect|kill|logs|ls| pause|port|prune|rename|restart|rm|run|start|stats|stop|top|unpause|update|wait
常用子命令如下:
ls 列出容器
logs 获取容器日志
inspect 显示容器详细信息
diff 显示容器变化(A-add 新增,C-change 改变,D-delete 删除)
stats 实时显示容器的物理资源资源占用情况
top 显示容器中正在运行的进程
port 列出容器与宿主机所有端口映射
exec 在一个正在运行的容器中执行一条命令
attach 连接至容器的stdout、stdin、stderr
cp 在容器用宿主机之间复制文件
create 从镜像创建一个新容器
run 新建一个容器并执行一条命令
rm 删除容器
prune 删除所有停止容器
rename 重命名一个容器
start 启动容器
stop 停止容器(发送SIGTERM后再发送SIGKILL)
restart 重启容器
kill 强行停止容器(直接发送SIGKILL)
pause 使用cgroup的freezer顺序挂起/解挂容器中所有进程
unpause 解除容器挂起
update 更新容器自身的配置参数(如容器CPU、内存的分配参数等)
commit 将容器的变化创建为一个新的镜像(就是把在容器内执行的一些命令写到一个新的镜像层商)
export 将容器导出为镜像,生成一个tar包(export导出的镜像会丢失镜像层结构,无法回滚)
wait 阻塞指定容器直到容器停止,并返回退出码
2、镜像命令:docker image
该命令包括与docker镜像相关的操作
docker image build|history|import|inspect|load|ls|prune|pull|push|rm|save|tag
常用子命令如下:
build 从Dockerfile创建一个镜像
history 显示一个镜像的创建历史
inspect 显示镜像详细信息
ls 列出本地镜像
prune 删除所有没有使用的镜像
pull 从仓库拉去一个镜像(默认是从docker hub)
push 向仓库上传一个镜像(默认是从docker hub)
rm 删除一个镜像
save 将镜像导出,如果不指定文件,将直接输出至STDOUT
load 对应docker image save,将save导出的tar包导入成镜像,或者从STDIN直接输入
import 对应docker container export,将export导出的tar包导入成镜像
tag 为镜像添加TAG,便于镜像管理
补充一个命令:
docker search [OPTIONS] TERM
该命令用于搜索仓库中的镜像(默认还是在docker hub中搜索)。
3、docker服务器命令:docker system
该命令包括整个docker的一些相关操作
docker system df|events|info|prune
常用子命令有:
df 显示本机docker占用的硬盘空间,包括镜像、容器还有卷
events 实时显示docker服务器的事件
info 显示整个docker服务器信息,比如容器数量,镜像数量等等等等
prune 删除所有没有使用的数据,比如停止的容器,没用到的镜像等待
4、还有一些顶级命令。。。。
这个我也不知道是啥的东西已经被我写成一个纯粹的命令堆叠了。。。无所谓了。。。。当成是个命令查询手册吧。。。
docker login|logout|search
这三个命令没有对应的管理命令子命令,其实就是docker仓库的登陆、注销、查询(默认当然还是对docker hub的),其他的顶级命令都有对应的管理命令子命令。
剩下的管理命令子命令诸如volume、network、stack、service之类的怎么不介绍?看多了你也吐,写多了我也恶心。当然最重要的是我还没研究明白。以上这些对于docker最基本使用已经足够了,可以折腾一会了。
下一期,我写一下docker的一些简单的使用场景,以及怎么写dockerfile然后创建镜像并运行容器。