# docker-doc **Repository Path**: prostones/docker-doc ## Basic Information - **Project Name**: docker-doc - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-12 - **Last Updated**: 2022-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 容器 ## docker ![](.readme_images/d29c6e4a.png) 开源容器引擎。 是一个应用打包、分发、部署的工具。 镜像( Image )和容器( Container )的关系,就像是面向对象程序设计中的 类 和 实一样,镜像是静态的定义,容器是镜像运行时的实体,有自己的生命周期。容器可以被创建、启动、停止、删 除、暂停等。 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命 名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚 至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一 个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安 全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。 ![](.readme_images/6072f224.png) ![](.readme_images/23cc1d0f.png) ![](.readme_images/497b03f2.png) ``` Docker Client:Docker 客户端,提供给用户一个终端,用户输入 Docker 提供的命令来管理本地或远程的服务器。 Docker Daemon:服务端守护进程,接收 Client 发送的命令并执行相应的操作。 Docker Images:Docker 镜像,一个特殊的文件系统,封装了运行时需要的库、资源、应用等。 Docker Container:Docker 容器,提供了运行环境,通过 Docker Images 启动,在 Docker Images 基础上运行应用。运行环境都是独立的、隔离的 Docker Registry:Docker 仓库,用来管理镜像,实现镜像的上传、下载、浏览。 ``` ### 启动一个容器 ``` docker run -d -p 6379:6379 --name redis redis:5.0 ``` ### 自己动手做一个redis 镜像 ``` mk-redis-image/Dockerfile ``` 除了撰写dockerfile,还有什么办法能制作一个镜像呢? ### 优势 * 整体交付:把应用的依赖打包到 docker 镜像中,保证部署的每一台机器依赖都是完整的,同时使用容器技术屏蔽了操作系统和硬件的差异,使得开发、测试、部署、运维过程中能够保持一致,解决了很多维护难题。 * 资源利用率高:相比于 VM ,docker 耗费的系统资源更少,空闲的内存可以被宿主机和其他容器使用,相同的资源可以部署更多容器。 * 更快的启动时间:docker 只是隔离了程序的依赖关系,没有 Guest OS,启动速度比 VM 快得多。 ### 为什么要使用docker? 1. 开发和生产环境不一致。比如在 Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署。 2. 处理复杂的依赖问题。比如一个服务器同时部署jdk8、jdk17,Python2、Python3 3. 固化依赖。ncd依赖lava ``` 目的:确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。 建议:尽量不要在window上使用docker ``` ``` cat /proc/version cat /etc/issue ``` ### 基于dockerfile 制作镜像 [https://gitee.com/shangfendecaiji/killer-helper/blob/master/Dockerfile](https://gitee.com/shangfendecaiji/killer-helper/blob/master/Dockerfile) ``` docker build . docker tag pro4stones/killer-helper docker push pro4stones/killer-helper ``` ### 一些简单的命令 ``` docker ps 查看当前运行中的容器 docker images 查看镜像列表 docker rm container-id 删除指定 id 的容器 docker stop/start container-id 停止/启动指定 id 的容器 docker rmi image-id 删除指定 id 的镜像 docker volume ls 查看 volume 列表 docker network ls 查看网络列表 ``` ### 目录挂载 容器里面产生的数据,例如 log 文件,redis备份文件,容器删除后就丢失了。 * bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上。用绝对路径 -v D:/code:/app * volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上。 只需要一个名字 -v db-data:/app * tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。 最初,--tmpfs 标记用于独立容器,--mount 标记用于集群服务。但是从 Docker 17.06 开始,您还可以将 --mount 与独立容器一起使用。通常,--mount 标记表达更加明确和冗长。最大的区别是,--tmpfs 标记不支持任何可配置的选项。 标记不能用于集群服务。对于集群服务,您必须使用 --mount ![](.readme_images/a9cb86f8.png) ### 容器建通信 创建一个名为killer-net的网络 ``` docker network create killer-net ``` 运行 Redis 在 test-net 网络中,别名redis ``` docker run -d --name demo-redis --network demo-net --network-alias demo-redis redis:5.0 ``` ## Docker-Compose 把项目的多个服务整合到一起 Docker Compose 是一个工具,命令行工具。 这个工具可以通过yml文件定义多容器的docker应用 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器 [https://gitee.com/shangfendecaiji/killer-helper/blob/master/docker-compose.yml](https://gitee.com/shangfendecaiji/killer-helper/blob/master/docker-compose.yml) # 容器集群 ## swarm or k8s ### swarm的优势 #### 简单可靠 #### 任何规模都有高性能表现 对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。 Swarm 可拓展性在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。 #### 服务的持续可用性 Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。 此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。 ![](.readme_images/5f7dd497.png) ### manager 管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。 为了利用swarm模式的容错功能,Docker建议您根据组织的高可用性要求实现奇数个节点。当您拥有多个管理器时,您可以从管理器节点的故障中恢复而无需停机。 N个管理节点的集群容忍最多损失 (N-1)/2 个管理节点。 Docker建议一个集群最多7个管理器节点。 重要说明:添加更多管理节点并不意味着可扩展性更高或性能更高。一般而言,情况正好相反。 ### worker 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。下图展示了集群中管理节点与工作节点的关系。 ### Service 是指一组任务的集合,服务定义了任务的属性。服务有两种模式。 replicated services (复制服务)按照一定规则在各个工作节点上运行指定个数的任务。 global services (全局服务)每个工作节点上运行一个任务。 ### Task 是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。 ### swarm 模式提供的负载均衡服务 ![](.readme_images/8baf2cbe.png) ### 缺少如k8s那样真正的弹性扩容