律师网站建设方案,学做ppt的网站 免费,潍坊 网站企划,湖北专业网站建设产品介绍目录 一、前言
二、Docker Compose 介绍
2.1 Docker Compose概述
2.2 Docker Compose特点
2.3 Docker Compose使用场景
三、Docker Compose 搭建
3.1 安装docker环境
3.2 Docker Compose安装方式一
3.2.1 下载最新版/如果不是最新可替换最新版本
3.2.2 设置权限
3.2.…目录 一、前言
二、Docker Compose 介绍
2.1 Docker Compose概述
2.2 Docker Compose特点
2.3 Docker Compose使用场景
三、Docker Compose 搭建
3.1 安装docker环境
3.2 Docker Compose安装方式一
3.2.1 下载最新版/如果不是最新可替换最新版本
3.2.2 设置权限
3.2.3 设置软链接
3.2.4 查看版本
3.3 Docker Compose安装方式二
3.3.1 安装python3
3.3.2 安装python-pip3并升级
3.3.3 执行如下命令安装 docker-compose
3.3.4 查看docker-compose版本
四、Docker Compose常用功能
4.1 使用docker安装redis
4.2 Docker Compose 配置文件属性概述
4.2.1 version
4.2.2 serivces - build
4.2.3 serivces - image
4.2.4 serivces - container_name
4.2.5 serivces - ports
4.2.6 serivces - command
4.2.7 serivces - depends_on
4.2.8 serivces - deploy
4.2.9 serivces - networks
4.2.10 serivces - volumes
4.3 Docker Compose常用命令指令
五、Docker Compose 构建容器使用案例
5.1 使用Docker Compose构建redis镜像
5.2 使用自定义网络创建mysql镜像
5.3 使用自定义数据卷
5.3.1 使用自定义volume方式一
5.3.2 使用自定义volume方式二
5.4 links与depends_on定义容器依赖关系
5.4.1 Docker Compose links指令使用案例
5.4.2 Docker Compose depends_on 指令使用案例
六、写在文末 一、前言
当前docker的应用已经非常普遍使用docker之后各类技术组件、中间件的安装部署和运维变得容易同时也大大提升了服务器利用率带来的好处是多方面的另一方面k8s的火热也让docker进一步走进了很多人的视线但是如何更加深度的应用docker和管理docker呢本文将详细介绍docker的另一种编排工具docker-compose的使用。 二、Docker Compose 介绍 2.1 Docker Compose概述
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 通过一个单独的 docker-compose.yml 配置文件可以定义应用程序的服务、网络、卷以及其他配置信息。 使用 Docker Compose 可以轻松地启动、停止和管理整个应用程序而无需手动运行多个 docker run 命令。 Docker Compose 非常适合开发、测试和部署复杂的多容器应用程序使得容器化应用程序的管理更加简单和高效。 使用 Docker Compose您只需要在安装了 Docker 的环境中安装 Docker Compose 工具即可。 2.2 Docker Compose特点
Docker Compose 具有以下特点 简化多容器应用程序的管理 Docker Compose 允许您将多个容器组合成一个应用程序并通过一个配置文件来定义和管理它们。这使得启动、停止、重建和管理整个应用程序变得简单。 声明式配置 使用 YAML 文件来定义应用程序的配置使得配置文件易于阅读、理解和维护。您可以定义服务的各种属性如镜像、环境变量、端口映射、卷挂载等。 快速启动和停止 通过简单的命令如 docker-compose up 和 docker-compose down您可以快速启动和停止整个应用程序。这使得本地开发和测试变得方便和高效。 自动化容器之间的网络连接 Docker Compose 自动为应用程序中的服务创建一个默认网络并将每个容器连接到该网络。这使得容器之间的通信变得简单可以通过服务名称来进行访问而无需处理 IP 地址和端口号。 数据卷管理 Docker Compose 允许您定义卷挂载将容器内的数据持久化到宿主机上。这简化了数据的管理和迁移并可以确保数据的持久性。 可扩展性和复用性 Docker Compose 允许您轻松地扩展和重用配置文件。您可以定义多个环境如开发、测试、生产等的配置并根据需要进行组合和使用。 2.3 Docker Compose使用场景
如果日常开发中遇到下面的场景可以考虑使用Docker Compose 搭建本地开发环境 Docker Compose 可以帮助开发人员在本地快速搭建和管理多容器的开发环境。通过定义每个服务的镜像、环境变量、端口映射等属性开发人员可以轻松地启动和停止整个应用程序并在不同的服务之间进行通信。 部署测试环境 Docker Compose 可以用于在测试环境中运行和管理多容器的应用程序。通过创建一个与生产环境相似的容器组合测试人员可以在一个独立的环境中进行端到端的测试并且可以轻松地重建和销毁整个测试环境。 持续集成和持续部署 Docker Compose 可以与持续集成和持续部署工具集成如 Jenkins、GitLab CI、Travis 等。通过在配置文件中定义构建步骤和部署策略可以将整个应用程序以容器化的方式自动构建、测试和部署到生产环境中。 多环境部署 Docker Compose 允许你定义多个环境如开发、测试、生产的配置文件并根据需要进行组合和使用这使得在不同环境中轻松部署应用程序变得简单和可靠。 微服务架构 Docker Compose 适用于构建和管理微服务架构。通过将每个微服务定义为一个独立的服务并使用容器进行隔离可以实现微服务之间的松耦合和独立部署。 三、Docker Compose 搭建 3.1 安装docker环境
在安装Docker Compose之前需要先安装Docker 环境因为Docker Compose是基于Docker 进行安装和使用的网上关于Docker 的安装和搭建比较简单这里就略过了。 3.2 Docker Compose安装方式一
这也是网上能看到的大多数小伙伴们安装的一种方式操作步骤如下 3.2.1 下载最新版/如果不是最新可替换最新版本
注意docker compose的版本要与docker版本尽量对齐
sudo curl -L https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
3.2.2 设置权限
sudo chmod x /usr/local/bin/docker-compose
3.2.3 设置软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
3.2.4 查看版本
docker-compose --version 3.3 Docker Compose安装方式二
上面这种方式在实际操作的时候因为要从git上面拉取包文件可能会非常满所以推荐第二种方式操步骤如下 3.3.1 安装python3
sudo yum install python3 3.3.2 安装python-pip3并升级
yum -y install python3-pip
pip3 install --upgrade pip 3.3.3 执行如下命令安装 docker-compose
pip3 install docker-compose 3.3.4 查看docker-compose版本
docker-compose --version 四、Docker Compose常用功能
接下来对Docker Compose中涉及到的常用功能做详细的介绍官网地址Docker Compose overview | Docker Docs 4.1 使用docker安装redis
看下面的命令应该不陌生通过下面这行命令就能快速启动一个redis的服务
docker run --name my-redis -d -p 6379:6379 redis:6 使用上面的一个命令就可以快速开启redis的镜像服务为什么还要使用docker-compose呢docker-compose该如何编写呢docker-compose编写的语法如何接下来以此案例为标准详细探讨下如何使用docker-compose。 4.2 Docker Compose 配置文件属性概述
Docker Compose 使用 YAML 文件来定义服务。官方推荐的默认文件名为 compose.yml 但同时也支持 docker-compose.yml。 compose 文件中包含 6 个顶级属性version、services、networks、volumes、configs 与secrets及很多的它们下面所包含的属性在下面的内容中将会结合实际的案例一一说明。首先在服务器目录下创建一个docker-compose.yml文件后面的内容都编写在该文件中。 4.2.1 version
version 是一个顶级属性但已经过时不再需要在 compose 文件中出现了但是为了保持可读性通常会加上从官网说明中可以看出。 4.2.2 serivces - build
services 是一个顶级属性也是整个Docker Compose配置文件中作为服务定义最重要的属性它用于定义一个应用中所包含的服务。Docker Compose 会将每个服务部署在各自的容器中。其下包含的第一级的属性即为服务名称这个名称可以根据服务内容随意命名。而在服务名称下还可包含很多的属性常用属性如下 build 用于指定一个 Dockerfile 的路径。而该 Dockerfile 则是用于创建当前服务镜像的。这个路径可以是以斜杠(/)开头的绝对路径也可以是相对于当前 compose 文件的、以点(.)号开头的相对路径。 如果 Dockerfile 文件名不是默认名称则需要通过 build 下的 context 属性指定路径dockerfile 属性指定文件名。
build:context: ./dockerfile: myDockerfile 4.2.3 serivces - image
用户指定当前服务所需要使用的镜像这个镜像可以是本地镜像也可以是远程镜像仓库中的镜像(会自动 pull)。 如果设置了 build此时再设置的 image 属性即为构建出的镜像的名称与 Tag。 比如下面这段配置指定image后面构建镜像时依赖的redis版本号
version: 3
services:redis: # 服务名称image: redis:6.2.14 # redis镜像版本container_name: redis6.2.14 # 容器名称...
4.2.4 serivces - container_name
该属性用于设置容器名称但并不是必须的。如果没有设置该属性容器名称则会采用“合成方式”。而合成时需要用到 services 下的第一级属性。 在 services 下存在一级属性称为服务名称。该级属性是作为 services 下的第一级属性出现的。服务名称将来会作为容器名称的一部分出现。容器的名称格式为当前 compose文件所在目录名_ 服务名称。 如果在 services 下没有指定 image 属性而是使用 bild 属性即没有现成的镜像而是根据 build 下指定的 Dockerfile 生成镜像此时生成的镜像名称格式为当前 compose 文件所在目录名-服务名称。
比如下面这段配置指定构建出来的容器名称为redis6.2.14
version: 3
services:redis: # 服务名称image: redis:6.2.14 # redis镜像版本container_name: redis6.2.14 # 容器名称...
4.2.5 serivces - ports
前面为暴露出的端口号后面为容器中应用的端口号。如果仅设置了一个端口号那么这个端口号是容器中应用的端口号其暴露到宿主机的端口号会被随机分配。如下所示
ports:- 8081:8081 # 绑定容器的 8081 端口到主机的 8081 端口- 9000:8000 # 绑定容器的 8000 端口到主机的 9000 端口- 443 # 绑定容器的 443 端口到主机的任意端口容器启动时随机分配绑定的主机端口号
比如下面这段配置表示开启的redis容器对外访问端口为6379与容器内的6379端口对应
version: 3
services:redis: # 服务名称image: redis:6.2.14 # redis镜像版本container_name: redis6.2.14 # 容器名称ports:- 6379:6379 # 指定宿主机端口与容器端口映射关系宿主机容器...
4.2.6 serivces - command
用于覆盖 Dockerfile 中的 CMD 指令内容即启动该服务容器后立即运行的命令。如果直接按照Dockerfile中的CMD指令内容执行即可则compose文件中无需该command属性。 比如下面这段配置在command后面执行了一段指令其目的就是最后要启动redis-server服务的命令
version: 3
services:redis: # 服务名称image: redis:6.2.14 # redis镜像版本container_name: redis6.2.14 # 容器名称ports:- 6379:6379 # 指定宿主机端口与容器端口映射关系宿主机容器command: [redis-server,/etc/redis/redis.conf] # 指定配置文件启动redis-server进程... 4.2.7 serivces - depends_on
在 Docker Compose 中depends_on 是一个用于定义服务之间依赖关系的关键字。它允许您指定一个或多个服务依赖于其他服务以确保在启动或重新创建容器时所依赖的服务先于依赖它们的服务启动。如下web容器启动时需要依赖db和redis两个容器的启动之后才会启动。
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres
depends_on补充说明 启动顺序 通过在服务的配置中使用 depends_on您可以告诉 Docker Compose 在启动容器时按照指定的顺序启动服务。例如如果服务 A 依赖于服务 B 和服务 C则在启动时Docker Compose 会先启动服务 B 和服务 C然后才会启动服务 A。 仅表示依赖关系 depends_on 只表示依赖关系而不会等待依赖的服务完全可用。它只确保在依赖的服务启动后再启动当前服务。因此依赖的服务可能仍在进行初始化或准备阶段而不一定已经完全可用。如果需要等待服务完全可用可以结合使用其他工具或技术例如健康检查或等待脚本。 无法保证健康状态 depends_on 并不能保证依赖的服务在启动后处于健康状态。它只负责在启动时按照指定顺序启动服务但并不检查服务的健康状态或等待服务变为可用状态。对于检查服务健康状态可以使用其他机制例如使用健康检查命令或工具。 并行启动 默认情况下Docker Compose 会尽可能并行启动服务而不是完全按照 depends_on 指定的依赖关系顺序启动。这是因为 Docker Compose 会尝试最大化容器的并发启动以提高启动效率。如果需要强制按照依赖关系顺序启动请使用 depends_on 结合 restart 关键字的 condition: [service_started] 选项。
4.2.8 serivces - deploy
用于指定当前服务容器的部署设置 docker-compose deploy命令的作用是将一个由docker-compose.yml定义的服务栈部署到Swarm集群。这个命令会创建所需的服务和网络并在集群中启动它们。它还会管理服务的更新和扩展。 deploy属性下有一个常用属性 replicas用于指定该服务启动的容器的数量。即实现一个服务多个容器。一旦指定了 deploy:replicas就不能再指定container_name 属性了。因为各个启动的容器名称不能相同而只能由系统自动生成。如下示例
version: 3.9services:wordpress:image: wordpressports:- 8080:80networks:- overlaydeploy:mode: replicatedreplicas: 2endpoint_mode: vipmysql:image: mysqlvolumes:- db-data:/var/lib/mysql/datanetworks:- overlaydeploy:mode: replicatedreplicas: 2endpoint_mode: dnsrrvolumes:db-data:networks:overlay:
4.2.9 serivces - networks
用于指定当前服务容器要连接到的网络。该网络必须是已经存在的通常会提前创建好或通过顶级属性networks 创建的网络。
有些时候我们希望一些服务只能被一组特定的服务访问这个时候使用只依靠默认的网络就行不通了那么我们就需要根据自己的情况搭建我们的服务组的网络架构就会用到docker-compose的networks功能了。networks主要有下面的几种 default
默认情况下docker-compose会建立一个默认的网络名称为docker-compose.yml所在目录名称小写形式加上“_default”我们的TFLinux环境就是“tflinux_default”。 这个默认网络会对所有services下面的服务生效所以services下面的各个服务之间才能够通过service名称互相访问。如果要自定义默认网络可以针对“default”网络进行设置这样就会影响导默认网络了。 networks:default:driver: bridge
自定义
除了默认网络之外我们也可以建立自定义的网络这个网络名称就比较随意了。
networks:persist:driver: bridge
已存在的网络
有时候我们想使用我们通过docker network create创建好的网络而不是让docker-compose创建一个新的这个时候就需要用到“external”关键字了。
networks:persist:external:name: bridge2
4.2.10 serivces - volumes
volume 允许您在 Docker Compose 文件中定义卷以便在多个容器之间共享数据。这些卷可以用于持久性数据存储例如数据库文件、配置文件等。通过使用 docker-compose volume您可以轻松地管理这些数据卷并确保它们在容器之间共享和持久化。volume 通常可以使用路径与卷标两种方式。 比如像下面这种就是路径的方式直观且易于查看但需要管理本地路径。
db:image: mariadb:latestports:- 3306:3306volumes:- /etc/mysql:/var/lib/mysql
而下面是卷标方式backend 与 backup 两个服务共享了 db-data 的卷逻辑简洁明了且无需管理本地路径。但具体卷标所代表的是 Docker 主机的哪个路径并不能直观的看到。需要通过 docker volume inspect [卷标]来查看。
services:backend:image: awesome/databasevolumes:- db-data:/etc/databackup:image: backup-servicevolumes:- db-data:/var/lib/backup/data
volumes:db-data:
4.3 Docker Compose常用命令指令
Docker Compose通过docker-compose系列命令查看和控制compose中的所有服务容器。常用的操作命令总结如下。 docker-compose pull 拉取 compose 中服务依赖的全部镜像或指定镜像。通过在命令后添加服务名称来指定。 docker-compose config 检查 compose 文件是否正确。可添加选项-q表示只有存在问题时才有输出。 docker-compose up 启动 compose 配置文件中的所有容器。-d 选项表示后台启动。 docker-compose logs 查看 comopse 中所有服务或指定服务的运行日志。通过在命令后添加服务名称来指定。 默认情况下将对不同的服务日志使用不同的颜色来区分。 docker-compose ps 列出 compose 中所有服务或指定服务。通过在命令后添加服务名称来指定。 docker-compose top 列出 compose 中当前正在运行的所有服务或指定服务。通过在命令后添加服务名称来 指定。 docker-compose images 列出 compose 中所有服务或指定服务对应的镜像。通过在命令后添加服务名称来指定。 docker-compose port 列出指定服务容器的指定端口所映射的宿主机端口。 docker-compose run 在指定服务上执行一条命令。 docker-compose exec 进入指定服务容器。通过在命令后添加服务名称来指定。 docker-compose pause 暂停 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。 docker-compose unpause 恢复 compose 中处于暂停状态的所有服务容器或指定服务容器。通过在命令后添加服 务名称来指定。 docker-compose stop 停止 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。 docker-compose restart 重启 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。 docker-compose start 启动 compose 中所有服务容器或指定服务容器。通过在命令后添加服务名称来指定。 docker-compose kill 通过发送 SIGKILL 信号停止指定服务的容器。 docker-compose rm 删除 compose 中的、处于停止状态的所有服务容器或指定服务容器。通过在命令后添 加服务名称来指定。 docker-compose down 停止并删除 compose 中的所有服务容器、网络、镜像、数据卷。 五、Docker Compose 构建容器使用案例
有了上面的理论基础接下来通过几个实际的案例更深入理解Docker Compose中配置属性的使用。 5.1 使用Docker Compose构建redis镜像
创建一个docker-compose-redis.yml文件参照上文的配置项说明配置内容如下
version: 3
services:redis: # 服务名称image: redis:6 # redis镜像版本container_name: redis6 # 容器名称ports:- 6379:6379 # 指定宿主机端口与容器端口映射关系宿主机容器volumes:- /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf # 映射配置文件目录宿主机:容器- /usr/local/docker/redis/data:/data # 映射数据目录宿主机:容器privileged: true # 获取宿主机root权限command: [redis-server,/etc/redis/redis.conf] # 指定配置文件启动redis-server进程
使用下面的命令进行启动 docker compose -f docker-compose-redis.yml up -d 可以通过docker ps检查容器是否启动成功 5.2 使用自定义网络创建mysql镜像
docker 容器的网络通信方式有多种但是自定义网络最灵活最有用在Docker中使用自定义网络可以帮助我们更好地管理容器之间的通信和隔离。在docker中使用自定义网络比较简单只需要下面简单的几步即可 创建自定义网络 查看自定义网络 启动容器连接到自定义网络 查看容器网络 下面看一个具体的使用案例使用自定义网络创建一个mysql镜像
1自定义网络 docker network create mysql_network 2查看自定义网络 docker network ls 3使用自定义网络启动mysql容器
docker run --name mysql_02 --network mysql_network -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 上面演示了如何在docker 容器中使用自定义网络如果是在docker-compose中使用自定义网络可以参考下面的配置
version: 3.8services:mysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: mydbnetworks:- my-networkports:- 3306:3306
#自定义网络
networks:my-network:driver: bridge
在这段配置中的最后一部分networks标签中定义了一个名为my-network的网络模式为bridge最后再在启动mysql5.7镜像时指定网络为上述自定义的网络。使用下面的命令运行并启动镜像
docker-compose up -d 关于docker-compose网络相关的设置更详细的可以参阅官网文档进行深入研究Networks top-level elements | Docker Docs 5.3 使用自定义数据卷 5.3.1 使用自定义volume方式一
使用自定义数据卷可以避免容器宕机之后数据丢失在docker compose中可以使用自定义数据卷仍以上文案例为例再在docler-compose.yml配置文件中添加volume相关的信息在下面的这种方式中与我们使用docker创建一个mysql容器并且指定数据卷的方式相似
version: 3.8services:mysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: mydbnetworks:- my-networkports:- 3306:3306volumes:- /data/mysql/conf:/etc/mysql/conf.d- /data/mysql/data:/var/lib/mysql
networks:my-network:driver: bridge
然后使用docker-compose up -d启动容器 进入到数据卷目录文件已经自动生成 5.3.2 使用自定义volume方式二
也可以像配置networks那样在配置的最后面统一定义一个volume名称也即声明数据卷声明之后docker compose在启动容器的时候就会自动去创建这个名称的数据卷最后再在service属性配置镜像的时候进行引用即可如下创建一个nginx的配置文件配置内容如下
version: 2.1services:nginx-demo:image: nginxnetworks:- nginx-networkports:- 80:80volumes: #引用下面的数据卷名称右边与容器的目录映射- nginx_volume:/usr/share/nginx/htmlnetworks:nginx-network:driver: bridgevolumes:nginx_volume: #声明数据卷这里可以只需要声明即可也可以填写具体的数据卷目录
然后使用命令启动
docker compose -f docker-nginx-compose.yml up -d 容器是否启动成功呢可以使用curl命令访问一下nginx 数据卷更详细的文档可以参考Volumes top-level element | Docker Docs 5.4 links与depends_on定义容器依赖关系
Docker Compose的links指令是一种连接容器的方式它允许一个容器连接到另一个容器或者说一个容器的启动依赖另一个容器先启动并且可以通过容器名称来访问连接的容器。 在Docker Compose中links可以在服务之间创建连接以便它们可以相互通信。在引用中提到的错误是因为使用了links扩展方式而links只能直接在docker-compose.yml文件中使用不能在扩展文件中使用。如果需要在扩展文件中使用可以使用networks来代替links。 5.4.1 Docker Compose links指令使用案例
比如下面的案例中使用docker compose的方式定义了两个容器nginx和redis而nginx容器的启动需要依赖redis的启动也可以说redis的启动影响nginx
version: 3.1services:nginx-demo:image: nginxnetworks:- nginx-networkports:- 80:80volumes:- nginx_volume:/usr/share/nginx/htmllinks:- redis:devredis:image: redis:6ports:- 6379:6379networks:nginx-network:driver: bridgevolumes:nginx_volume: #声明数据卷
使用命令docker compose -f docker-links-compose.yml up -d 启动从镜像的拉取和启动顺序来看redis容器启动先于nginx 最后通过docker ps命令检查容器是否启动成功 5.4.2 Docker Compose depends_on 指令使用案例
depends-on 指令用于指定一个容器的启动运行依赖于另一个容器。当 depends-on 指令被使用时Docker 将不会启动依赖容器直到被依赖的容器启动并运行成功。仍然以上面的links案例进行说明只需要对配置做简单的调整即可。如下将links标签更换为depends_on即可
version: 3.1services:nginx-demo:image: nginxnetworks:- nginx-networkports:- 80:80volumes:- nginx_volume:/usr/share/nginx/htmldepends_on:- redisredis:image: redis:6ports:- 6379:6379networks:nginx-network:driver: bridgevolumes:nginx_volume: #声明数据卷
再次启动容器可以看到效果和上面的links差不多 关于depends-on指令的详细说明可以参照上文中的介绍进行理解该指令在对微服务部署实践中非常实用而且也是经常会使用到的一个指令值得深入探究 六、写在文末
本文通过较大的篇幅从多个角度深入详细探讨了docker编排工具Docker Compose的使用并结合相关的案例对其中涉及到的指令进行了深入的说明合理使用Docker Compose可以为docker镜像的编排和管理带来很多好处提升docker的运维效率本篇到此结束感谢观看。