文章目录
- 为什么要用docker
- 为什么会出现容器
- Docker 是什么
- 容器是什么
- 虚拟化是什么
- Docker 和 虚拟化的区别
- Docker 容器有几种在状态
- 什么是仓库
- 什么是镜像
- 什么是容器
- 仓库、镜像、容器的关系
- 常用的 Docker 命令
- 如何把主机的东西拷贝到容器内部
- 如何让容器随着 Docker 服务启动而自动启动
- 如何指定容器的端口映射
- 如何查看官方镜像服务的默认端口是什么
- 如何修改容器的端口映射
- 如何指定容器的目录映射
- 如何修改容器的目录映射
- 同⼀个宿主机中多个Docker容器之间如何通信?多个宿主机中Docker容器之间如何通信
为什么要用docker
使用 Docker 可以提高开发效率、简化部署流程、提高资源利用率,并且有利于构建现代化的应用架构。因此,许多组织和开发团队选择使用 Docker 来构建、交付和运行他们的应用程序。
使用 Docker 可以为开发人员、运维团队和企业带来多方面的好处:
- 跨平台一致性: Docker 容器提供了一种轻量级、可移植的环境,使得应用程序可以在不同的平台上以一致的方式运行。开发人员可以在其本地开发环境中构建和测试容器,然后将其部署到生产环境中,而无需担心环境的差异性导致的兼容性问题。
- 快速部署: Docker 容器可以快速启动和停止,几乎没有启动延迟,因此可以大大缩短应用程序的部署时间。开发人员和运维团队可以更快地将新版本的应用程序部署到生产环境中,从而提高交付速度和敏捷性
一条命令即可将容器启动,而容器启动时一般会将服务或应用一并启动 - 资源利用率高: Docker 容器共享主机操作系统的内核,并且可以在同一台主机上运行多个容器,因此可以更有效地利用服务器资源。与传统的虚拟化技术相比,Docker 容器更加轻量级,启动和停止更快,并且更加节省资源。
- 环境隔离: 每个 Docker 容器都是独立的、互相隔离的,因此可以避免容器之间的相互干扰和冲突。这使得开发人员可以在同一台主机上运行多个应用程序,而无需担心应用程序之间的依赖关系和冲突。
- 持续集成和持续部署(CI/CD): Docker 容器可以与持续集成和持续部署工具(如 Jenkins、GitLab CI 等)集成,从而实现自动化的构建、测试、部署和监控流程。这可以大大提高交付速度和质量,并且降低人为错误的风险。
- 微服务架构: Docker 容器可以作为微服务架构的基础,每个容器可以包含一个独立的服务或功能模块。通过将应用程序拆分为多个小型、松耦合的容器,可以实现更灵活、可扩展和可维护的应用程序架构。
- 版本控制和协作:Docker 镜像可以存储在仓库中,并且支持版本控制,使得团队成员可以轻松地共享和协作。每个镜像都有唯一的标识符,确保了镜像的版本管理。
- 灵活性:Docker 提供了对各种不同类型的应用和服务的支持,可以轻松构建、部署和扩展各种类型的应用程序,从传统的 Web 应用到分布式微服务架构。
- 生态系统:Docker 生态系统非常庞大,有大量的官方和社区维护的镜像和工具,可以大大简化开发和部署过程。
为什么会出现容器
为了解决单机部署应用和虚拟化的局限性而诞生
Docker 是什么
是实现容器技术的一种工具
是一个开源的应用容器引擎
使用 C/S 架构模式,通过远程API 来管理
可以打包一个应用及依赖包到一个轻量级、可移植的容器中
容器是什么
对应用软件和依赖包进行标准打包
应用或服务之间相互隔离,但又共享一个 OS
可以打包运行在不同的系统上
虚拟化是什么
可以理解成虚拟机技术
一个主机可以部署多个虚拟机,每个虚拟机又可以部署多个应用
对于主机来说,虚拟机就是一个普通文件
虚拟化的缺点是什么
● 资源占用多:每个虚拟机都是完整的操作系统,需要给它分配大量系统资源
● 冗余步骤多:一个完整的操作系统,一些系统级别的步骤无法避免,比如用户登录
● 启动慢:启动操作系统需要多久,启动虚拟机就要多久
Docker 和 虚拟化的区别
虚拟机:我们传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有⾃⼰的操作系统,虚拟机⼀旦被开启,预分配给他
的资源将全部被占⽤。,每⼀个虚拟机包括应⽤,必要的⼆进制和库,以及⼀个完整的⽤户操作系统。
Docker:容器技术是和我们的宿主机共享硬件资源及操作系统可以实现资源的动态分配。
容器包含应⽤和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在⽤户空间以分离的进程运⾏。
- docker启动快速属于秒级别。虚拟机通常需要⼏分钟去启动。
- docker需要的资源更少,docker在操作系统级别进⾏虚拟化,docker容器和内核交互,⼏乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。;
- docker更轻量,docker的架构可以共⽤⼀个内核与共享应⽤程序库,所占内存极⼩。同样的硬件环境,Docker运⾏的镜像数远多于虚拟机数量。对系统的利⽤率⾮常⾼
- 与虚拟机相⽐,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离;
- 安全性: docker的安全性也更弱。Docker的租户root和宿主机root等同,⼀旦容器内的⽤户从普通⽤户权限提升为root权限,它就直接具备了宿主机的root权限,进⽽可进⾏⽆限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机
利⽤如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防⽌虚拟机突破和彼此交互,⽽容器⾄今还没有任何形式的硬件隔离,这使得容器容易受到攻击。 - 可管理性:docker的集中化管理⼯具还不算成熟。各种虚拟化技术都有成熟的管理⼯具,例如VMware vCenter提供完备的虚拟机管理能⼒。
- ⾼可⽤和可恢复性:docker对业务的⾼可⽤⽀持是通过快速重新部署实现的。虚拟化具备负载均衡,⾼可⽤,容错,迁移和数据保护等经过⽣产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%⾼可⽤,保证业务连续性。
- 快速创建、删除:虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了⽆论是开发、测试、部署都可以节约⼤量时间。
- 交付、部署:虚拟机可以通过镜像实现环境交付的⼀致性,但镜像分发⽆法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署;
Docker 容器有几种在状态
starting 运行状态
Exited 退出状态
Paused 暂停状态
healthy 健康状态
unhealthy 非健康状态
什么是仓库
存放镜像文件的地方,比如 DockerHub,可以将自己的镜像上传上去
不同镜像可以有不同的标签
主机可以从仓库下载镜像
什么是镜像
创建容器的模板
同一个镜像可以创建多个不同的容器
什么是容器
通过镜像生成的运行实例
不同容器之间是相互隔离,独立运行的
通常一个容器就是一个应用或一个服务,也是我们常说的微服务
仓库、镜像、容器的关系
仓库存放镜像,主机通过仓库下载镜像,通过镜像创建容器
常用的 Docker 命令
docker pull 拉取镜像
docker create 创建容器
docker rm 删除容器
docker ps 列出正在运行的容器列表
docker ps -a 查看所有容器,包括停止的
docker run 创建容器并运行指定命令
docker start 启动容器
docker stop 停止运行容器
docker restart 重启容器
docker rm 删除容器
docker exec 容器执行指定命令
docker rmi 删除镜像
停止和重启容器:
停止容器:docker stop ContainerID(镜像运行的id号)
重启容器:docker restart ContainerID
启动容器:docker start ContainerID
移出容器:docker rm ContainerID
强制停止:docker kill ContainerID
帮助命令
docker version
docker info
docker --help
如何把主机的东西拷贝到容器内部
通过 docker cp 命令即可,还能把容器内部内容拷贝到主机
进入容器的方法有哪些
通过 docker exec 进入容器内部
如何让容器随着 Docker 服务启动而自动启动
创建容器时,加上 --restart=always 参数
创建容器后,通过修改容器配置文件的 RestartPolicy 参数值
创建容器后,使用 docker update 命令更新容器的 --restart 参数值
如何指定容器的端口映射
创建容器时,通过 -p 来指定端口映射
创建容器后,通过修改容器的配置文件来指定端口映射
如何查看官方镜像服务的默认端口是什么
可以通过 docker inspect 查看镜像信息,然后找到端口映射一栏
也可以先用该镜像创建一个容器并运行,通过 docker ps 查看运行端口是什么
如何修改容器的端口映射
删除容器,重新创建容器,并指定端口映射
通过容器配置文件修改端口映射
通过 docker commit 将容器构建为一个全新的镜像,然后再通过该镜像创建新的容器,并指定端口映射
如何指定容器的目录映射
创建容器时,通过 -v 来指定目录映射
创建容器后,通过修改容器的配置文件来指定目录映射
如何修改容器的目录映射
删除容器,重新创建容器,并指定目录映射
通过容器配置文件修改目录映射
通过 docker commit 将容器构建为一个全新的镜像,然后再通过该镜像创建新的容器,并指定目录映射
同⼀个宿主机中多个Docker容器之间如何通信?多个宿主机中Docker容器之间如何通信
这⾥同主机不同容器之间通信主要使⽤Docker桥接(Bridge)模式。
不同主机的容器之间的通信可以借助于 pipework 这个⼯具。