docker通过带环境安装来解决开发和运维之间的鸿沟问题,属于云计算方面的技术。也就是说安装的时候把原始环境一模一样地复制过来,开发人员利用Docker来消除协作代码时,“在我的机器上可以正常工作啊"的问题。
一次构建,处处运行。
dev本地测试完毕后,打包递交docker镜像,而运维则只装一个docker作为鲸鱼,将各个镜像放到鲸鱼背上作为独立的集装箱
仓库,镜像和容器
docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的额容器虚拟化技术
集装箱就是一个容器,
由于docker相对资源消耗少,启动块,各容器隔离独立,这些特点,使得各大厂都在用docker做弹性伸缩
docker hub类似于github,专门用于host docker 镜像的仓库
docker的三要素
镜像就是模版,容器就是镜像的一个实例。
docker容器是一个剔除linux外设等不必要组件后的浓缩版的linux,包括root用户权限,进程空间,用户空间和网络空间以及运行在这个linux上的应用程序,基础docker镜像才170M,而linux虚拟机镜像则达到4G
仓库是集中存放镜像文件的场所。
仓库注册服务器(registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像都有不同的标签tag
仓库又分为公开仓库和私有的仓库。最大的公开仓库为hub.docker.com而国内更多的使用阿里云和网易蜂巢
docker本身可以理解为一个容器运行载体或称为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器。Docker damon根据image文件生成容器的实例,同一个image文件可以生成多个同时运行的容器实例。
docker run hello-world
底层原理
客户端执行docker run命令后,由后台守护进程在docker host上加载image创建对应的容器并且run起来.
为什么docker能够比传统的虚拟机运行更快,加载更快?
1. docker不需要hypervisor来实现硬件资源的虚拟化,运行在docker容器上的程序直接使用的是实际物理机的硬件资源,因此在CPU,内存利用率和效率上都有明显的优势;
2.docker利用的是宿主机的内核,而不需要guest os这一层。因此,当新建一个容器时,docker并不需要和虚拟机一样加载整个guest os操作系统内核,因此启动非常块,只需要几秒钟。
Docker是基于linux容器的虚拟化技术(LXC:linux containers),linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需要的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一套操作系统,只需要软件工作所需的库资源和设置。系统因此变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
docker command set
docker集群管理swarm vs kubernetes(k8s)
Dockerfile->docker image->docker container
Docker调试常用命令
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abe77778cd83 nginx:1.15.9 "nginx -g 'daemon of…" 12 months ago Up About an hour 80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:80->8000/tcp nginx
1abf721d7a4c registry-internal.cn-shanghai.aliyuncs.com/xx/yyy:phpfpm71 "docker-php-entrypoi…" 12 months ago Up About an hour 9000/tcp phpapp
3d5f41aab2be mysql:5.6 "docker-entrypoint.s…" 12 months ago Up About an hour 3306/tcp mysql
3fb60c37f950 redis:5.0.4 "docker-entrypoint.s…" 12 months ago Up About an hour 6379/tcp redis
docker ps可以直接列出正运行中的docker container,基本上等价于docker container ls
# docker top mysql
UID PID PPID C STIME TTY TIME CMD
systemd+ 2071 2038 0 10:35 ? 00:00:03 mysqld
docker top contzhoainername 能够罗列出containername这个容器中正在运行中的进程名,hu如果发现状态不对的话,可以先这样检查一下是不是container中的进程已经crash掉了.
docker inspect vehicle8
[
{
"Id": "a55228e756a8132b226308cfde0920e4b188af7e7e63503493523b6154598f5e",
"Created": "2019-01-05T14:44:11.368198346Z",
"Path": "npm",
"Args": [
"run",
"start",
"ethereum",
"172.21.0.9:8545",
"run-producer",
"8",
"100",
"0x0f743640f4b8c2ba5be9dc3a792c0262584bfc3c"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 24420,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-01-05T14:47:42.050501448Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...