参考:比特就业课
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念:
服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义, 整个docker-compose.yml定义一个项目。
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。通过compose可以方便的管理多个服务。
Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程。
如果一个应用需要涉及到 MySQL、nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。
另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker 容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。
我们安装docker的时候已经顺便安装了,大家可以看看前面的章节(第一章)。
检查是否安装上了。
root@ALiCentos7:~$ docker compose versionDocker Compose version v2.20.2You have new mail in /var/spool/mail/rootroot@ALiCentos7:~$Compose 使用的步骤:
使用docker-compose.yml定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker compose up 命令来启动并运行整个应用程序。
Compose 具有管理应用程序整个生命周期的命令:
启动,停止和重建服务
查看正在运行的服务的状态
流式传输运行服务的日志输出
在服务上运行一次性命令
目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。当前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。
官方文档:
version"3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本services# 服务,可以存在多个servicename# 服务名字,它也是内部bridge 网络可以使用的DNS name,如果不是集群模式相当于 docker run的时候指定的一个名称#集群(Swarm)模式是多个容器的逻辑抽象image# 必选,镜像的名字command# 可选,如果设置,则会覆盖默认镜像里的 CMD 命令environment# 可选,等价于 docker container run 里的 --env 选项设置环境变量volumes# 可选,等价于docker container run 里的 -v 选项 绑定数据卷networks# 可选,等价于 docker container run 里的 --network 选项指定网络ports# 可选,等价于 docker container run 里的 -p 选项指定端口映射expose# 可选,指定容器暴露的端口build#构建目录depends_on#服务依赖配置env_file#环境变量文件servicename2imagecommandnetworksportsservicename3#...volumes# 可选,等价于 docker volume createnetworks# 可选,等价于 docker network createimageimageredisimageredis5imageredis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7imagelibrary/redisimagedocker.io/library/redisimagemy_private.registry5000/redis先准备好目录先。

把配置文件写好。

启动配置文件里面的所有东西。

会默认创建一个桥网络的,然后把工程相关的容器加入到这个项目的网络里面去,和docker默认网络分开的。


停止和删除。

command覆盖容器启动的默认命令。
command"bundle" "exec" "thin" "-p" "3000"commandbundle exec thin -p 3000


entrypoint覆盖容器默认的 entrypoint。
两种格式。
entrypoint/code/entrypoint.shentrypointphp-dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so-dmemory_limit=-1vendor/bin/phpunit

environment添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
# map语法environmentRACK_ENVdevelopmentSHOW"true"USER_INPUT# 数组语法environmentRACK_ENV=developmentSHOW=trueUSER_INPUT

networks指定容器运行的网络。


要调整网络的信息也很容易。如下面的例子所示即可。
services frontend imageawesome/webapp networks front-tier ipv4_address172.16.238.10networks front-tier ipam driverdefault configsubnet"172.16.238.0/24"volumes将主机的数据卷或者文件挂载到容器里。
xxxxxxxxxx#短语法 对应 -v 的精简的配置services db imagepostgreslatest volumes"/localhost/postgres.sock:/var/run/postgres/postgres.sock""/localhost/data:/var/lib/postgresql/data"#完整语法 对应 --mount 的详细的配置services backend imageawesome/backend volumestypevolume #命名卷 sourcedb-data target/data volume nocopytrue #绑定卷typebind source/var/run/postgres/postgres.sock target/var/run/postgres/postgres.sockvolumes db-dataports端口映射,其实就是命令中的-p选项。
xxxxxxxxxx#完整语法portstarget80 host_ip127.0.0.1 # 设置成 0.0.0.0 就是所有机器都能来访问 published8080 protocoltcp modehosttarget80 host_ip127.0.0.1 published8000-9000 protocoltcp modehost#短语法ports"3000""3000-3005""8000:8000""9090-9091:8080-8081""49100:22""127.0.0.1:8001:8001""127.0.0.1:5000-5010:5000-5010""6060:6060/udp"expose暴露端口,但不映射到宿主机,只被连接的服务访问。
xxxxxxxxxxexpose"3000""8000"build这个参数我们学完dockerFile之后就能理解了,现在先不讲。
depends_on设置依赖关系。
docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和redis ,才会启动 web。
docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 db 和 redis。
docker compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和redis 之前停止。
这个参数比较复杂,大家来看看例子。
xxxxxxxxxxversion"3.7" services web build. depends_ondbredis redis imageredis db imagepostgres可以指定条件,healthy 需要配置 healthcheck 来完成。
xxxxxxxxxxservices web build. depends_on db conditionservice_healthy redis conditionservice_started redis imageredis db imagepostgreshealthcheck案例。
xxxxxxxxxxversion"3.8" services web imagenginx1.24.0 environment TEST1 depends_on mysql conditionservice_healthy mysql imagemysql5.7 environment MYSQL_ROOT_PASSWORD"bit@123" volumes/data/maxhou/mysqldata/varlib/:/var/lib/mysql healthcheck testmysql --user=root --password='bit@123' -e "SELECT 1;" interval10s timeout5s retries10

env_file从文件添加环境变量。可以是单个值或列表的多个值。
xxxxxxxxxxenv_file.envxxxxxxxxxxenv_file./common.env./apps/web.env/opt/secrets.env
| 命令 | 功能 |
|---|---|
docker compose build | 构建服务 |
docker compose config | 规范的格式来显示服务配置 |
docker compose cp | 在本地系统和服务容器直接拷贝文件 |
docker compose create | 创建服务的容器 |
docker compose down | 停止所有容器,并删除容器 |
docker compose events | 从服务器获取实时时间 |
docker compose exec | 在容器中执行命令 |
docker compose images | 列出所有容器使用的镜像 |
docker compose kill | 强制停止服务的容器 |
docker compose logs | 显示日志 |
docker compose ls | 显示所有项目 |
docker compose pause | 暂停服务 |
docker compose port | 列出所有的端口映射 |
docker compose ps | 该命令可以列出项目中目前的所有容器 |
docker compose pull | 拉取服务镜像 |
docker compose push | 推送服务镜像 |
docker compose restart | 重启或者重启某个服务 |
docker compose rm | 删除服务停止的容器 |
docker compose run | 在指定服务容器上执行相关的命令 |
docker compose start | 启动当前停止的某个容器 |
docker compose stop | 停止当前运行的某个容器 |
docker compose top | 显示运行的进程 |
docker compose unpause | 恢复服务 |
docker compose up | up 命令会构建,(重新)创建,启动, 链接一个服务相关的容器。 默认情况下如果容器已经存在, 将会停止并尝试重新创建他们。并使用之前挂载的卷。 --no-recreate 参数可以让容器不被停止或者重新创建, -d 表示后台运行 |
docker compose version | 查看版本 |
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。docker-compose 命令的基本的使用格式为如下所示。
xxxxxxxxxxdocker compose [OPTIONS] COMMAND [ARGS...]-f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
-p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名。
up该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
xxxxxxxxxxdocker compose up [options] [SERVICE...]参数。
xxxxxxxxxx-d 在后台运行服务容器, 推荐在生产环境下使用该选项--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用down停止所有容器,并删除容器和网络。
xxxxxxxxxxdocker compose down [options] [SERVICE...]参数。
xxxxxxxxxx-v, --volumes 删除容器同时删除目录映射run该命令可以在指定服务容器上执行相关的命令。
xxxxxxxxxx# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令# docker compose run ubuntu ping docker.comdocker compose run [options] SERVICE [COMMAND] [ARGS...]参数。
xxxxxxxxxx-d 后台运行容器--name NAME 为容器指定一个名字--entrypoint CMD 覆盖默认的容器启动指令-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量-u, --user="" 指定运行容器的用户名或者 uid--rm 运行命令后自动删除容器-p, --publish=[] 映射容器端口到本地主机nginx反向代理到我们的web服务,对外提供浏览服务
查询mysql数据库用户信息返回用户数据
创建用户库,写入用户数据
设计数据非常简单的一个表信息,写入两条数据,文件为init.sql
xxxxxxxxxxdrop database if exists test;CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 ;use `test`;CREATE TABLE `users` ( `sno` int(11) DEFAULT NULL, `sname` varchar(50) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO users (sno,sname) VALUES (1,'pony'), (2,'maxhou');
这样手动操作是可以的。但是我们希望,每次启动服务的时候,会直接运行这些,初始化我的数据。所以这些东西要写到一个sql文件里面去。
这个就叫做数据初始化脚本!

注意本地测试的时候红色部分调整为 ip 地址,而我们实际的服务使用的 mysql 的一个服务名称。
简单配置,不再去涉及 mapper 那些内容通过 jdbc 直接完成操作。
WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP 语言和 MySQL 数据库开发的,用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客。
WordPress 有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用 HTML 代码、CSS、PHP 等相关知识。WordPress 官方支持中文版,同时有爱好者开发的第三方中文语言包,如 wopus 中文语言包。WordPress 拥有成千上万个各式插件和不计其数的主题模板样式。

xxxxxxxxxxversion"3.8"services wordpress imagewordpress restartalways depends_on db conditionservice_healthy ports8080:80 environment WORDPRESS_DB_HOSTdb WORDPRESS_DB_USERmywordpressuser WORDPRESS_DB_PASSWORDmywordpresspass WORDPRESS_DB_NAMEwordpress volumes./wordpress/:/var/www/html db imagemysql5.7 environment MYSQL_ROOT_PASSWORDroot MYSQL_DATABASEwordpress MYSQL_USERmywordpressuser MYSQL_PASSWORDmywordpresspass volumes./mysqlvarlib/:/var/lib/mysql healthcheck testmysql -u root -proot -e "select 1;" interval10s timeout5s retries10通过这个命令检查这个文件的语法是否有问题。
xxxxxxxxxxdocker compose configxxxxxxxxxxdocker compose up -d
直接用8080端口访问。

输入东西,然后安装。


其实我们所有东西都存在这里了。
