最近疫情闹的,在家温习之前在私塾在线买的cc老师的课程Docker,为了加深印象及鞭策一下自己换高薪工作,坚持做系列笔记,记录自己成长的点点滴滴。不过看到消息cc老师最新一期的高级架构师课程也要推出了,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级
1.1 Docker是什么
Docker是基于容器技术的轻量级虚拟化,是一个能够把开发的应用程序自动部署到容器的开源引擎。
Docker借鉴集装箱的概念,只不过集装箱用来运输货物,Docker运输软件,Docker并不关心:装的内容是什么、也不关心要运到何处。
可以把环境平移迁到另一个环境中,不会因为环境发生改变而产品一些不可预知的问题,上图示例:Docker容器环境通过镜像方式从window平滑移动到linux
1.2 Docker有什么
- Docker客户端和服务端
客户端用来通过Docker守护进程,去访问Docker容器,Docker容器运行在 Docker主机上,也就是服务器上 - Docker镜像
镜像相当于容器的“源代码”,镜像类似于类,而容器类似于实例;镜像类似于Maven仓库管理的jar - Registry
类似于Maven仓库,Docker公司提供的官方registry被称为Docker Hub
仓库地址:https://hub.docker.com/ - Docker 容器
容器是镜像的运行时实例,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境。容器为镜像提供了一个标准的和隔离的运行环境。
1.3 Docker架构图
Docker machine:相当于docker的客户端
镜像查找过程:先查找本地,本地找不到去公共仓库(dockers hub)找,后期可以配置成自己的私有仓库(private registry)
1.4 Docker能干什么
1:加速本地开发和构建流程,使其更加高效、更加轻量化
可以做自己的镜像,后期就不用再做任何配置就可以得到相同环境
2:能让独立服务或应用程序在不同的环境中,得到相同的运行结果
3:用Docker创建隔离的环境来测试
4:Docker可以在开发者本机上构建复杂的环境,用来进行测试
5:构建一个多用户的平台即服务(PaaS)的基础设施
6:为开发、测试提供一个轻量级的独立沙盒环境
7:提供软件即服务(SaaS)应用程序
8:支持高性能、超大规模的宿主机部署
1.5 Docker的技术概述
Docker是基于容器技术的轻量级虚拟化,省去了传统虚拟化的hypervisor(运行于物理机和操作系统间的中间软件层)层,其虚拟化技术是基于内核的cgroup和namespace技术,处理逻辑与内核深度融合,所以其性能和物理机相近。
LXC(linux内核容器技术):包括cgroup和namespace,进程沙盒等:
1:Namespace:命名空间,主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于不同的容器有不同的抽象,彼此之间是不可见的,从而做到访问隔离。
2:Cgroup:Control group的简称,称为控制组,主要做资源控制。其原理是将一组进程放进一个控制组中,通过给这个控制组分配指定的可用资源,达到控制这一组进程资源的目的
通信上,Docker并不直接和内核交互,而是通过一个更底层的工具Libcontainer与内核交互,Libcontainer是真正意义上的容器引擎,而Docker本身侧重于处理更上层的业务。
1.5.1 传统虚拟机结构与docker结构对:
Docker没有GuestOS,处理逻辑与内核
1.6 Docker的技术组件
1:文件系统隔离:每个容器都有自己的root系统
2:进程隔离:每个容器都运行在自己的进程环境中
3:网络隔离:容器间的虚拟网络接口和IP地址都是分开的
4:资源隔离和分组:使用cgroups,将cpu和内存之类的资源独立分配给每个docker容器
5:写时复制:文件系统都是通过写时复制创建的,这意味着文件系统是分层的、快速的,且占用磁盘空间更小
6:日志:容器会收集日志流并计入日志,用来进行日志分析和故障排查
7:交互式shell:用户可以通过终端,使用交互式shell来与docker服务器交互
1.7 Docker和传统虚拟机技术的不同
1:虚拟机是利用硬件虚拟化技术,来实现对硬件资源进行划分,同时通过一个hypervisor来实现对资源的完全隔离;容器上操作系统级别的虚拟化,利用的时候内核的cgroup和namespace特性,完全通过软件实现。
2:虚拟机会独占分配给自己的资源,各个虚拟机之间基本完全隔离,不存在资源共享,比较重量级;容器与主机共享操作系统内核,不同容器之间可以共享部分系统资源,因此相对更轻量级。
3:在一台物理机上能启动的虚拟机很有限,而且启动通常都在十几秒以上;我们可以在一台服务器上启动成百上千Docker容器,启动时间通常在秒级
1.8 Docker服务器安装要求
官方推荐使用Ubuntu,要求是64位机器,Linux3.8以上内核。这里选用Centos7.x。
在Centos7上安装Docker
yum install -y epel-release
yum install docker-io
安装后的配置文件在:/etc/sysconfig/docker
这是最简单的安装方式,学习足够用了,还有采用安装脚本的方式,这里就不去讲了,可以从官方文档获取, https://docs.docker.com/engine/installation/
1.9 Docker的基本使用
1.9.1 基本命令
-
启动Docker服务器
service docker start -
查看帮助
docker --help
docker 命令 --help -
查看基本信息
docker version:查看docker的版本号,包括客户端、服务端、依赖的Go等
docker info:查看系统docker层面信息,包括管理的images, containers数等
docker stats:查看容器状态信息 -
操作镜像
docker search :搜索镜像,在docker index中搜索image
docker pull :下载镜像,从docker registry server中下拉image
docker images:查看镜像,列出images
docker images -a:列出所有的images(包含历史)
docker rmi :删除一个或多个image
###1.9.2 操作容器
####1.9.2.1 使用镜像创建容器
docker run -i -t
docker run -i -t /bin/bash:
创建一个容器,运行其中的bash应用,退出后容器关闭
docker run -it --name 容器名 --restart=always
–restart:设置在容器退出后自动重启容器,默认是no,就是不重启;always:无论容器的退出码是多少,都会自动启动容器;也可以设置成on-failure,这样只有退出码为非0时,才会自动重启。还可以指定重启次数,例如:–restart=on-failure:3
docker run还可以如下常见参数:
-d:表示在后台运行
-v:挂载卷的映射
-p <host_port:contain_port>:
映射宿主机端口到容器,方便外部访问容器内服务,host_port可以省略,表示把 container_port 映射到一个动态端口。
-P:
自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动选择
1.9.2.2 使用 -p 进行网络端口映射
(1)-p 5000:5000,默认-p标识会绑定本地主机上的指定端口
(2)可以指定绑定的网络地址,比如:
-p 127.0.0.1:5001:5002
(3)如果要绑定容器端口5002到宿主机动态端口,并且让localhost访问,如:
127.0.0.1::5002
(4)可以绑定UDP端口,在后面添加/udp,如:
-p 127.0.0.1:5000:5000/udp
(5)可以使用docker port快捷方式来绑定我们的端口,如:
docker port 容器id 5000
(6)-p可以使用多次,以配置多个端口
1.9.2.3 docker run 和 docker create
参数基本一样,run是创建容器并后台启动,create是只创建容器。docker run 相当于docker create 和 docker start。
1.9.2.4 查看容器
docker ps:列出当前所有正在运行的容器
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
1.9.2.5 容器启动、关闭和重启
docker start/stop/restart <container> :启动/停止/重启容器
1.9.2.6 进入正在运行的docker容器
docker exec -it [container_id] /bin/bash
docker attach [container_id]
1.9.2.7 删除容器
docker rm <container...> :删除一个或多个container
docker rm `docker ps -a -q` :删除所有的container
docker ps -a -q | xargs docker rm:同上, 删除所有的容器
1.9.2.8 查看容器的日志
docker logs 容器id
docker logs –f 容器id,类似于 tail –f,要添加时间戳,可添加-t
1.9.2.9 查看容器内运行的进程
docker top 容器id
1.9.2.10 查看容器内部细节
docker inspect 容器id:获取更多的容器信息,包括名称、命令、网络配置等,主要有:
id:image id
parent:该layer的父层
comment:每层提交的备注信息
container:可以把容器保存成一个镜像,通常image的每个layer都保存自一个容器
config:该image的一些配置信息
也可用-f 也就是format来选定查看结果,如: docker inspect -f='{{.NetworkSettings.SandboxKey}}' 容器id,实际上,-f或者--format 支持完整的go语言模板