容器化技术的背景是什么?
在软件开发过程中环境配置永远是最让人头疼的在开发之前我们需要准备各种运行环境、IDE及辅助工具同时软件部署也为程序员的谢顶助力三分。
搭建不同语言、不同技术栈适配的运行环境还要部署到多个服务器主机上并且这些主机还可能来自不同地方这为部署与运维人员带来了极大挑战。
而需求永远是推动技术发展的源动力正是在这样的背景下"容器化技术"出现了。
什么是容器化?
容器化实际上是一种轻量级的虚拟化技术。只不过相对于VM,属于进程级别的隔离(通过linux namespace实现),具备以下特点:
1)更大的弹性
2)更快的启动速度
3)更少的资源消耗
而最为大家熟悉的容器化运行时技术就非Docker莫属了。
容器化技术从大方向来看,可分为容器化运行技术和容器化编排技术,那何为容器化编排技术?
Docker本身非常适合管理单个容器。但随着越来越多的容器和容器化应用程序,并把它们划分成数百个部分,很可能会导致管理和编排变得非常困难。最终,需要对容器实施分组,以便跨所有容器提供网络、安全、遥测等服务。于是,Kubernetes(也称k8s) 应运而生。
真正的生产型应用会涉及很多容器,这些容器必须跨多个服务器主机进行部署。Kubernetes可以提供所需的编排和管理功能,以便针对这些工作负载大规模部署容器。借助Kubernetes编排功能,可以构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况。
什么是docker?
Docker是一种容器化运行技术或平台,基于Linux内核的cgroup和namespace,对进程进行了封装隔离,属于操作系统层面虚拟化技术。它以容器的形式将你的应用程序及所有的依赖项打包在一起,以确保你的应用程序在任何环境中无缝运行。
传统虚拟化技术是虚拟出一套硬件后,在其基础上运行一个完整的操作系统,再在此系统上运行所需的应用进程。而Docker技术是容器内的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也不虚拟出硬件。因此,相对于传统的虚拟化技术而言,Docker更加轻便。
说人话:
- Docker是平台,Docker的虚拟机(即容器),在Docker平台上运行
- Docker容器有自己的虚拟环境,不管在什么系统中运行,环境都完全一致
为什么要使用docker?
1.环境一致
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
2.更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。
3.更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
4.更轻松的迁移
由于 Docker 一致的运行环境,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
5.更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
什么是Docker镜像?
- 类似于VMware虚拟机的镜像文件,或VirtualBox虚拟机的镜像文件
- 是一组磁盘文件
- 所有的依赖项打包在一起
- Docker镜像,就像是Docker容器的源代码
- Docker镜像用来创建容器
- 可以想象成Java中的类和实例之间的关系
什么是Docker容器?
- 可以想象成就像是VMware的虚拟机,只是更轻量,启动更快,占资源更少。
- Docker容器包括应用程序及所有的依赖项,作为操作系统的独立进程运行。
Docker容器有几种状态?
四种状态:运行、已停止、重新启动、已退出。
说出Docker常用的命令?
- docker pull 下载镜像
- docker images 查看镜像列表
- docker run 从镜像创建、运行容器
- docker ps 查看容器列表
- docker rm 删除容器
- docker rmi 删除镜像
Dockerfile中最常用的指令有哪些?
- FROM 指定基础镜像
- ADD 添加、解压文件到镜像
- COPY 复制文件到镜像
- RUN 运行命令
- ENV 设置环境变量
- CMD 容器启动时执行的默认命令
如何删除临时镜像(空悬镜像)?
空悬镜像,Dangling Image
这种镜像没有名称:<none>:<none>
在构建镜像过程中产生的临时镜像
在下载一个同名镜像时,之前镜像的名称被剥夺
空悬镜像一般无用,且占用空间
查看空悬镜像:
- docker images –f dangling=true
- -f参数:过滤条件
删除空悬镜像:
- docker rmi $(docker images –q –f dangling=true)
如何在容器与宿主机之间复制文件?
docker cp命令
容器复制到宿主机:
- docker cp 容器:文件路径 宿主机路径
宿主机复制到容器:
- docker cp宿主机路径 容器:文件路径
如何监控Docker容器?
docker stats命令
- 监控cpu、内存等的使用情况
限制容器使用的内存大小和cpu占用比例?
docker run –m 256m -c 512 镜像
- -m 256m:限制最大使用256m内存
- -c 512:与其他容器按此比例分配cpu
如何查看环境变量?
1. 进入容器,执行env命令
- docker exec -it 容器 env
2. 启动一个临时容器,执行env命令,执行完毕后容器自动删除
- docker run --rm 镜像 env
如何停止容器?
docker stop 容器
- 等待容器内运行的应用正常退出后,再停止容器,最长等待10秒
docker kill 容器
- 强行终止应用
容器退出后,可用通过docker ps –a查看,它的数据会丢失么?
- 容器退出后会处于终止(exited)状态,此时可以通过docker ps -a查看,其中数据不会丢失
- docker start可以重新启动容器,容器中的数据仍然存在
如何停止所有正在运行的容器?
docker stop $(docker ps -q)
或者 docker kill $(docker ps -q)
参数-q:列出容器的id
如何清理所有已经停止的容器?
- docker container prune
- docker container prune –f
- 参数-f:直接删除,不需要询问确认
如何向hub.docker.com推送镜像?
1.先对镜像改名,然后执行推送,之后按提示输入账户登录信息:
2.docker tag xxx:xxx 账户名/xxx:xxx
- 名称前面添加自己的账户名和斜杠
3.docker push 账户名/xxx:xxx
如何向私有镜像仓库推送镜像?
修改镜像名称,在前面添加主机地址和端口
- docker tag xxx:xxx 主机:端口/xxx:xxx
例如:
- docker tag redis:m6 192.168.64.140:5000/redis:m6
- docker push 192.168.64.140:5000/redis:m6