一. Docker简介
1.1 docker简介
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。(背景),云计算兴起后,服务器硬件扩展非常便利,软件服务部署成为了瓶颈,docker趁势而兴。
1.2 为什么用 Docker
容器的启动可以在秒级实现,比传统的虚拟机方式要快得多
对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器
docker的出现,让开发/测试/线上的环境部署,成为便利一条龙。
1.3 对比传统虚拟机总结
二、Docker基本概念
2.1 Docker架构
Images: Docker 镜像,用于创建 Docker 容器的模板。
Container: Docker 容器,独立运行的一个或一组应用。
Client: Docker 客户端,使用 Docker Api与 Docker 的守护进程通信。
Host: Docker 主机,一个物理或者虚拟的机器。用于执行 Docker 守护进程和容器。
Registry: Docker 仓库,用来保存镜像
Machine: 一个简化Docker安装的命令行工具,比如VirtualBox、 Digital Ocean、Microsoft Azure。
2.2 Docker的基本概念
2.2.1 Docker 镜像
Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
2.2.2 Docker 容器
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
2.2.3 Docker 仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
2.2.4 容器、镜像的运行关系
docker pull redis
docker run –d –name redis redis
docker start/stop/pause redis
三、安装 Docker
安装具体见博客:
https://blog.csdn.net/qq_42642159/article/details/113239638
Docker初体验
docker run hello-world ##进入docker世界
四、Docker基本操作
4.1 常用操作:
docker启动/停止/重启:
service docker start/stop/restart
查询/拉取常用镜像:
docker search/pull centos
4.2 镜像仓库操作
镜像仓库 — docker [login|pull|push|search]
4.3 容器操作
docker [run|start|stop|restart|kill|rm|pause|unpause]
run/create[镜像名]: 创建一个新的容器并运行一个命令
start/stop/restart[容器名]:启动/停止/重启一个容器
kill [容器名]: 直接杀掉容器,不给进程响应时间
rm[容器名]:删除已经停止的容器
pause/unpause[容器名]:暂停/恢复容器中的进程
docker [ps|inspect|exec|logs|export|import]
ps:查看容器列表(默认查看正在运行的容器,-a查看所有容器)
inspect[容器名]:查看容器配置元数据
exec -it [容器名] /bin/bash:进入容器环境中交互操作
logs --since=“2019-02-01” -f --tail=10 [容器名]:查看容器日志
cp path1 [容器名]:path 容器与主机之间的数据拷贝
export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个tar归档文件
import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像
4.4 镜像操作
docker images|rmi|tag|build|history|save|load]
images:列出本地镜像列表
rmi [镜像名:版本]:删除镜像
tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
build -t [镜像名:版本] [path]:Dockerfile 创建镜像
history [镜像名:版本]: 查看指定镜像的创建历史
save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar : 将镜像保存成 tar 归档文件
load --input xx.tar / docker load<xxx.tar : 从归档文件加载镜像
五、镜像与容器原理及用法探究
5.1 history命令查看镜像层
例:docker history hello-world
显示镜像hello-world分二层,其中一个空层
5.2 查看镜像文件
docker info 查看配置Docker Root Dir=/var/lib/docker (默认)docker 镜像存放的路径,一般在image/overlay2/imagedb/content/sha256下
该图为hello-world的镜像文件,前12位是镜像id(docker history hello-world)
打开一个镜像文件查看其内容:
cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80
{
"architecture": "amd64",
"config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/hello"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9",
"container_config": {
"Hostname": "8e2caa5a514b",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/hello\"]"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"created": "2019-01-01T01:29:27.650294696Z",
"docker_version": "18.06.1-ce",
"history": [{
"created": "2019-01-01T01:29:27.416803627Z",
"created_by": "/bin/sh -c #(nop) COPY file:f77490f70ce51da25bd21bfc30cb5e1a24b2b65eb37d4af0c327ddc24f0986a6 in / "
}, {
"created": "2019-01-01T01:29:27.650294696Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/hello\"]",
"empty_layer": true
}],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": ["sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3"]
}
}
----其中,history数组内,标识了镜像的历史记录(与history命令内容对应)
----rootfs的diff_ids中,对应了依赖使用中镜像层文件(history命令中size大于0的层)
查看镜像层文件
层文件在layerdb里
ll /var/lib/docker/image/overlay2/layerdb/sha256
#镜像层文件内结构:
镜像与容器总结
一个镜像就是一层层的layer层文件,盖楼而成,上层文件叠于下层文件上,若上层文件有与下层文件重复的,则覆盖掉下层文件重复的部分,如下图:
---------初始挂载时读写层为空。
---------当需要修改镜像内的某个文件时,只对处于最上方的读写层进行了变动,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。
---------联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufs、overlay等) 实现分层合并的方式。
容器创建详解
交互式创建容器并进入:
docker run -it --name centos centos /bin/bash(前台进程)
------------------------exit退出也关闭容器; Ctrl+P+Q退出不关闭容器
后台启动容器:
docker run -d --name nginx nginx
进入已运行的容器:
docker exec -it nginx /bin/bash
查看容器的元数据: docker inspect nginx
绑定容器端口到主机:
docker run -d -p 8080:80 --name nginx nginx:latest
挂载主机文件目录到容器内:
docker run -dit -v /root/peter_dir/:/pdir --name cent centos
复制主机文件到容器内:
docker cp anaconda-ks.cfg cent:/var
六、仓库使用
6.1、docker官方仓库
注册https://hub.docker.com(国外网站不好打开)
自由注册,邮件激活即可使用
6.2 命令使用
Docker pull/search/login/push/tag
tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
Push [仓库]/[镜像名:版本]: 推送镜像到仓库 --需要登陆
Search [镜像名]:在仓库中查询镜像 – 无法查询到tag版本
Pull [镜像名:版本]: 下载镜像到本地
Login:登陆仓库
1.命令登陆dockerhub
2、再使用tag命令标记一个镜像,指定自己的仓库(该仓库是docker官网自己注册的仓库)
3、使用push命令推送此镜像到仓库里
4、打开查询自己仓库的镜像
6.3 私有仓库
搭建
下载registry镜像:docker pull registry
-----可配置加速器加速下载
启动
docker run -d --name reg -p 5000:5000 registry
然后可以通过restful接口查看仓库中的镜像(当前仓库是空的)
配置http传输
私服默认只能使用https,需要配置开放http
配置完毕重启下docker服务
systemctl daemon-reload
systemctl restart docker
私服仓库推送镜像
docker tag hello-world http://192.168.244.7:5000/hello-world
docker push 192.168.244.7:5000/hello-world
查询镜像:http://192.168.244.5:5000/v2/_catalog
查询hello版本: http://192.168.244.5:5000/v2/hello/tags/list