Docker服务端与客户端
作为一个C/S架构的程序,Docker提供了一个命令行工具docker,及一套RESTful风格的API,用于C/S间的交互。Docker Server端也称Docker引擎,通常都会以守护进程的方式运行。
仓库
仓库用来存放镜像,根据创建者类型,分为用户仓库和顶层仓库
- 用户仓库,由普通用户创建,仓库全名由用户名/仓库名组成,用户名即Dk Hub帐号;
- 顶层仓库,由Docker组织或其认定的第三方管理,有官方特权,名称只需要包含仓库名部分;
- 像centos、ubuntu等都是顶层仓库,像dnmy/jdk8等就是用户仓库。
往仓库中push镜像时需要先登录,登录之后生成的auths信息存储在/root/.docker/config.json。
(注:docker push只会push当前镜像与基础镜像之间的差异数据)
[root@localhost ~]# docker login
[root@localhost ~]# cat /root/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "..."
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.4 (linux)"
}
}[root@localhost ~]#
镜像
一个分层的文件系统,最底层是boots引导文件系统,然后是rootfs文件系统, 最上面是用户文件系统
- boots可以理解成是与内核相关的一系列文件,主要是与启动、内存/磁盘管理等相关的文件
- rootfs可以看成是Unbutu、Centos等文件系统,它在boots基础上,额外提供一些工具软件,比方软件包、函数库等。
- 用户文件系统,可以简单对应成应用软件,如Java、Tomcat、Rocket等。
镜像一次构建任意运行的原理:因为Docker容器是基于内核实现的,且容器与主机共享内核(CentOS与Ubuntu等系统的内核是相同的<版本或不同>),所以同一Docker容器可以运行在任意Linux系统之上。在CentOS上运行Ubuntu镜像容器时,容器使用的是CentOS主机的内核+Ubuntu镜像,可理解成boots系统是宿主机的,而rootfs是Ubuntu的,反过来也一样。
镜像默认存储在/var/lib/docker/驱动...,这个目录下也包含镜像创建过程中生成的中间镜像
[root@localhost sha256]# pwd
/var/lib/docker/image/overlay2/imagedb/metadata/sha256
[root@localhost sha256]# ll
总用量 0
drwx------. 2 root root 20 11月 27 15:58 1690c2967fd88b59c463a0ef1a923c21be94b40353c4367161afa759cdee5cea
drwx------. 2 root root 39 12月 2 20:03 1955400068857a3486419535dac96a18680fcbe3becb5b9401d007f05f719479
drwx------. 2 root root 20 11月 27 15:58 285e3e2b9172e64c55296c80957fc7c5381e4156ab3b31586d7e8ceae6920a53
生成镜像的方式主要三种,实际中主要通过Dockerfile的方式生成。
docker commit cid/cname [repository:tag] #基于指定容器生成镜像
docker build -t=[repository:tag] . #基于Dockerfile生成镜像
docker load < xxx.tar #基于已有镜像模板生成镜像
镜像名与仓库名
Docker通过Tag来区分同一仓库中的不同镜像,即镜像由仓库全名:Tag来确定。如centos:latest、dnmy/jdk8:tag01。推送镜像时,docker hub也通过镜像名前缀来确定其所属仓库。
值得注意的是,不要在同一仓库中放不同类型的镜像,虽然在仓库中可以通过Tag进行区分,但这种区分并没不直观。比如有一个镜像dnmy/soft:tag08,你无法通过这个名称知道它是jdk、rocketmq还是其它镜像。(同样也不要用docker tag去将镜像重定向,如docker tag dnmy/jdk:tag01 dnmy/rocket:tag01)
容器
镜像是一个分层的文件系统,是静态的。容器是动态的,是基于镜像启动的一个进程,在内部又可以运行一个或多个进程,是一个运行环境。这里再提一下,容器和宿主机是共享内核kernel的,并且kernel版本也与宿主机一致。容器默认也存储在/var/lib/docker/container..目录下
[root@localhost containers]# pwd
/var/lib/docker/containers
[root@localhost containers]# ll
总用量 0
drwx------. 3 root root 70 12月 2 20:18 475884b80e6596ebe7def7692edf864c51adf0c1a499700f37663f5d1523fcf4
drwx------. 3 root root 70 12月 2 20:18 97b86028143301a7dcb7f95e4eba69bb0648b5abfe867768daa623e54cfd3c49
drwx------. 4 root root 237 12月 2 19:55 a9d07207627ad18a6fcb67ae5f4142b681a64449917cfb07511bb2f6dd5cea4e
drwx------. 4 root root 237 12月 2 20:17 b9a50c1420cf49916d98615152e18f8b78ecf9594d52263f590544ca889c3e93
常用命令
Docker启动/状态等命令
systemctl stop docker
systemctl start docker
systemctl restart docker
systemctl status docker
docker login //登录到docker hub
docker logout //退出登录
docker push 镜像名 //推送镜像到docker hub
docker info
镜像相关命令
docker search [image] //搜索镜像
docker pull name[:tag] //拉取镜像:未指定tag的情况下默认拉取该仓库下的latest镜像
docker rmi name[:tag] //删除镜像:未指定tag的情况下默认删除该仓库下的latest镜像
docker images //镜像列表
docker inspect name[:tag] //查看镜像元数据信息
docker commit 容器Id 镜像名 //创建镜像(注:创建镜像有三种方式:提交容器,基于dockerfile构建,基于本地模板创建
docker save -o xxx.tar [image] //保存镜像为tar文件,可以提供给其它人员,-o指定tar文件全名
docker load < xxx.tar //载入保存的镜像
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] //镜像重命名,实际会产生一个新的image指向同一镜像(镜像ID相同)
[root@localhost ~]# docker tag dnmy/rocket:tag01 dnmy/rocket:tag02
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dnmy/rocket tag01 195540006885 5 days ago 1.09GB
dnmy/rocket tag02 195540006885 5 days ago 1.09GB
容器相关命令
docker create -t -i imageName //基于镜像创建一个容器,更多参数参见-help
docker run -i -t imageName //基于镜像运行一个容器=创建+启动
docker start cid/cname //启动一个容器
docker stop cid/cname //停止容器
docker restart cid/cname //重启容器
docker attach cid/cname //附加到容器
docker rm cid/cname //删除容器
docker ps -a //所有容器列表
docker ps 或 docker container ls //正在运行的容器列表
docker top cid/cname //查看容器中运行的进程
docker stats cid/cname //查看容器状态信息,如CPU使用率、内存使用率等
docker inspect cid //查看容器元数据信息,如创建信息、主机配置、网络、端口等等
docker export cid/canme -o xxx.tar //导出容器,-o指定tar文件全名
docker import xxx.tar [newimagename:tag] //导入容器生成镜像,可以指定新镜像名称和标签,否则默认为<none>
docker exec cid/cname 命令 //在外部(即宿主机的终端上)控制容器执行指定命令,而不需要先附加到容器
docker cp cid /cname:文件路径 宿主机路径 //文件拷贝
或
docker cp 宿主机路径 cid:路径
命令归纳
//与容器相关的命令
docker [run|start|stop|restart|kill|rm|pause|unpause]
docker [ps|top|attach|exec|events|logs|wait|export|import|port]
docker [commit|cp|diff]
//仓库相关命令
docker [login|pull|push|search]
//与镜像相关的命令
docker [images|rmi|tag|build|history|save|import]
//其它命令
docker [info|version|inspect]