首页 > 其他分享 >Docker Compose详解

Docker Compose详解

时间:2022-11-22 16:34:26浏览次数:55  
标签:compose Compose app mysql 详解 MYSQL Docker docker

使用 Docker Compose

Docker Compose是一种用于帮助定义和共享多容器应用程序的工具。使用 Compose,我们可以创建一个 YAML 文件来定义服务,并且使用一个命令,可以启动所有内容或将其全部关闭。

使用 Compose的最大优势是您可以在一个文件中定义您的应用程序堆栈,将其保存在项目 repo 的根目录中(它现在是版本控制的),并且可以轻松地让其他人为您的项目做出贡献。有人只需要克隆您的存储库并启动撰写应用程序。事实上,你现在可能会在 GitHub/GitLab 上看到不少项目正是这样做的。

那么,我们如何开始呢?

安装 Docker Compose

如果您为 Windows 或 Mac 安装了 Docker Desktop/Toolbox,那么您已经拥有 Docker Compose!Play-with-Docker 实例也已经安装了 Docker Compose。如果您在 Linux 机器上,则需要安装 Docker Compose。

安装后,您应该能够运行以下命令并查看版本信息。

​$ docker-compose version

Docker Compose详解_应用程序

​创建 Compose 文件

在 app 项目的根目录下,创建一个名为 docker-compose.yml.

在撰写文件中,我们将从定义模式版本开始。在大多数情况下,最好使用支持的最新版本。您可以查看Compose 文件参考。

version: "3.7"

接下来,我们将定义我们希望作为应用程序的一部分运行的服务(或容器)列表。

version: "3.7"

services:

现在,我们将开始一次将一个服务迁移到 compose 文件中。

定义应用服务

记住,这是我们用来定义应用容器的命令。

$ docker run -dp 3000:3000 \

 -w /app -v "$(pwd):/app" \

 --network todo-app \

 -e MYSQL_HOST=mysql \

 -e MYSQL_USER=root \

 -e MYSQL_PASSWORD=secret \

 -e MYSQL_DB=todos \

 node:12-alpine \

 sh -c "yarn install && yarn run dev"

如果您使用的是 PowerShell,请使用以下命令:

PS> docker run -dp 3000:3000 `

 -w /app -v "$(pwd):/app" `

 --network todo-app `

 -e MYSQL_HOST=mysql `

 -e MYSQL_USER=root `

 -e MYSQL_PASSWORD=secret `

 -e MYSQL_DB=todos `

 node:12-alpine `

 sh -c "yarn install && yarn run dev"

首先,让我们为容器定义服务入口和镜像。我们可以为服务选择任何名称。该名称将自动成为网络别名,这在定义我们的 MySQL 服务时会很有用。

version: "3.7"

services:

  app:

    image: node:12-alpine

通常,您会看到command接近image定义的内容,尽管对订购没有要求。所以,让我们继续把它移到我们的文件中。

version: "3.7"

services:

  app:

    image: node:12-alpine

    command: sh -c "yarn install && yarn run dev"

让我们通过定义服务来迁移-p 3000:3000命令的一部分ports。我们将在这里使用 短语法,但也有更详细 的长语法可用。

version: "3.7"

services:

  app:

    image: node:12-alpine

    command: sh -c "yarn install && yarn run dev"

    ports:

      - 3000:3000

接下来,我们将使用and定义迁移工作目录 ( -w /app) 和卷映射 ( )。Volumes 也有短句和长句。-v "$(pwd):/app"working_dirvolumes

Docker Compose 卷定义的一个优点是我们可以使用当前目录的相对路径。

version: "3.7"

services:

  app:

    image: node:12-alpine

    command: sh -c "yarn install && yarn run dev"

    ports:

      - 3000:3000

    working_dir: /app

    volumes:

      - ./:/app

最后,我们需要使用environment密钥迁移环境变量定义。

version: "3.7"

services:

  app:

    image: node:12-alpine

    command: sh -c "yarn install && yarn run dev"

    ports:

      - 3000:3000

    working_dir: /app

    volumes:

      - ./:/app

    environment:

      MYSQL_HOST: mysql

      MYSQL_USER: root

      MYSQL_PASSWORD: secret

      MYSQL_DB: todos

定义 MySQL 服务

现在,是时候定义 MySQL 服务了。我们用于该容器的命令如下:

$ docker run -d \

 --network todo-app --network-alias mysql \

 -v todo-mysql-data:/var/lib/mysql \

 -e MYSQL_ROOT_PASSWORD=secret \

 -e MYSQL_DATABASE=todos \

 mysql:5.7

如果您使用的是 PowerShell,请使用以下命令:

PS> docker run -d `

 --network todo-app --network-alias mysql `

 -v todo-mysql-data:/var/lib/mysql `

 -e MYSQL_ROOT_PASSWORD=secret `

 -e MYSQL_DATABASE=todos `

 mysql:5.7

我们将首先定义新服务并为其命名,mysql以便它自动获取网络别名。我们将继续并指定要使用的图像。

version: "3.7"

services:

  app:

    # The app service definition

  mysql:

    image: mysql:5.7

接下来,我们将定义卷映射。当我们使用 运行容器时docker run,会自动创建命名卷。但是,在使用 Compose 运行时不会发生这种情况。我们需要在顶层 volumes:部分定义卷,然后在服务配置中指定挂载点。通过仅提供卷名,使用默认选项。不过,还有更多选择。

version: "3.7"

services:

  app:

    # The app service definition

  mysql:

    image: mysql:5.7

    volumes:

      - todo-mysql-data:/var/lib/mysql

volumes:

  todo-mysql-data:

最后,我们只需要指定环境变量。

version: "3.7"

services:

  app:

    # The app service definition

  mysql:

    image: mysql:5.7

    volumes:

      - todo-mysql-data:/var/lib/mysql

    environment:

      MYSQL_ROOT_PASSWORD: secret

      MYSQL_DATABASE: todos

volumes:

  todo-mysql-data:

此时,我们的完成docker-compose.yml应该是这样的:

version: "3.7"

services:

 app:

   image: node:12-alpine

   command: sh -c "yarn install && yarn run dev"

   ports:

     - 3000:3000

   working_dir: /app

   volumes:

     - ./:/app

   environment:

     MYSQL_HOST: mysql

     MYSQL_USER: root

     MYSQL_PASSWORD: secret

     MYSQL_DB: todos

 mysql:

   image: mysql:5.7

   volumes:

     - todo-mysql-data:/var/lib/mysql

   environment:

     MYSQL_ROOT_PASSWORD: secret

     MYSQL_DATABASE: todos

volumes:

 todo-mysql-data:

运行应用程序栈

现在我们有了我们的docker-compose.yml文件,我们可以启动它了!

确保没有其他 app/db 副本首先运行(docker ps和docker rm -f <ids>)。

docker-compose up使用命令启动应用程序堆栈。我们将添加-d标志以在后台运行所有内容。

docker-compose up -d

当我们运行它时,我们应该看到如下输出:

Creating network "app_default" with the default driver

Creating volume "app_todo-mysql-data" with default driver

Creating app_app_1   ... done

Creating app_mysql_1 ... done

您会注意到该卷以及一个网络已创建!默认情况下,Docker Compose 会自动为应用程序堆栈创建一个网络(这就是我们没有在 compose 文件中定义的原因)。

docker-compose logs -f让我们使用命令查看日志。您将看到每个服务的日志交错到一个流中。当您想要查看与时间相关的问题时,这非常有用。标志“-f跟随”日志,因此会在生成时为您提供实时输出。

如果您已经运行了该命令,您将看到如下所示的输出:

mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.

mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

app_1    | Connected to mysql db at host mysql

app_1    | Listening on port 3000

服务名称显示在行首(通常是彩色的)以帮助区分消息。如果要查看特定服务的日志,可以将服务名称添加到 logs 命令的末尾(例如, docker-compose logs -f app)。

提示:在启动应用程序之前等待 DB

当应用程序启动时,它实际上会等待 MySQL 启动并准备好,然后再尝试连接它。Docker 没有任何内置支持来等待另一个容器完全启动、运行和准备好,然后再启动另一个容器。对于基于节点的项目,您可以使用等待端口 依赖项。其他语言/框架也存在类似的项目。

此时,您应该能够打开您的应用程序并看到它正在运行。嘿!我们只需要一个命令!

在 Docker Dashboard 中查看应用程序堆栈

如果我们查看 Docker Dashboard,我们会看到有一个名为app的组。这是来自 Docker Compose 的“项目名称”,用于将容器组合在一起。默认情况下,项目名称只是其所在目录的名称 docker-compose.yml。

带有应用程序项目的 Docker 仪表板

如果您旋转应用程序,您将看到我们在 compose 文件中定义的两个容器。这些名称也更具描述性,因为它们遵循. 所以,很容易快速看出我们的应用是什么容器,哪个容器是mysql数据库。

扩展了应用项目的 Docker 仪表板

全部卸下来

当您准备好将其全部拆除时,只需运行docker-compose down或点击整个应用程序的 Docker Dashboard 上的垃圾桶即可。容器将停止,网络将被删除。

警告

删除卷

默认情况下,运行时不会删除撰写文件中的命名卷docker-compose down。如果要删除卷,则需要添加–volumes标志。

删除应用程序堆栈时,Docker 仪表板不会删除卷。

一旦拆除,您可以切换到另一个项目,运行docker-compose up并准备为该项目做出贡献!真的没有比这更简单的了!

回顾

在本节中,我们了解了 Docker Compose 以及它如何帮助我们显着简化多服务应用程序的定义和共享。我们通过将我们使用的命令翻译成适当的撰写格式来创建一个撰写文件。

至此,我们开始结束本教程。然而,我们想要介绍一些关于镜像构建的最佳实践,因为我们一直在使用的 Dockerfile 存在一个大问题。那么,让我们来看看吧!


标签:compose,Compose,app,mysql,详解,MYSQL,Docker,docker
From: https://blog.51cto.com/u_15867943/5878218

相关文章

  • Linux程序编译过程详解
    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因......
  • C语言abs和labs函数详解和示例
    文章目录​​1、包含头文件​​​​2、函数声明​​​​3、功能说明​​​​4、示例​​​​5、其它说明​​​​6、获取视频教程​​​​7、版权声明​​C语言提供了一系......
  • C语言rand函数生成随机数详解和示例
    文章目录​​1、生成随机数​​​​2、生成一定范围随机数​​​​3、获取视频教程​​​​4、版权声明​​在C/C++程序开发中,会经常用到随机数这个功能,例如编写游戏类(纸牌......
  • docker 挂载目录
    Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定,这个其实也是创建一个数据卷,只不过是把一个本地主机的目录当做数据卷挂载在容器上。dockerrun-d--n......
  • docker PANIC: could not locate a valid checkpoint record
    dockerpostgresql启动异常一般是非正常的关闭造成事务的日志文件损坏了恢复办法关闭或者删除当前容器使用交互方式启动dockerrun-it-v/Users/jimogangdan/......
  • redis安装-docker安装
    docker安装redis更加简单,一个命令就搞定。1、首先要安装docker略过。2、准备工作准备配置文件,这里单独根目录下建立一个redis文件夹存放cd/&mkdir-p/redis/co......
  • Docker stack(9)
    Dockerstack一个stack是一组相互关联的service,这组service共享依赖,可被安排在一起运行和扩展docker-compose单机部署docker-composeup-dwordpress.yamldocker......
  • Docker Secret(10)
    DockerSecrethttps://docs.docker.com/engine/reference/commandline/secret/1、什么secret用户名密码SSHKeyTLS认证任何不想让别人看到的数据2、DockerSwarmMo......
  • Docker Config(11)
    DockerConfighttps://docs.docker.com/engine/reference/commandline/config/官网介绍查看官网介绍,config是daemonAPI1.30之后引入的,它运行在swarm上的命令命令介......
  • Linux Python Web 离线部署非 Docker部署
    实际项目中,避免不了遇到私有化部署。不能在线安装有些问题,项目中各种包需要很多依赖非常痛苦。如果,项目支持容器化部署这个是最简单的。以下介绍离线安装Python包、包相关d......