6.docker-compose

这篇具有很好参考价值的文章主要介绍了6.docker-compose。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker compose

本节课我们学习一个多docker的案例:使用redis对多实例服务器进行访问量计数。

我们需要设计一种统计方式,一个比较符合直觉的思路是将redis和网络应用打包在一起部署。

这种模式比较接近于边车模式,但是当我们需要部署多实例时,统计很可能失去意义

因此,我们需要用一个单独的redis服务器。

准备NodeJS Web应用

mkdir visit
cd visit

touch package.json
touch index.js
touch Dockerfile

vim package.json

{
  "dependencies": {
    "express": "*",
    "redis": "2.8.0"
  },
  "scripts": {
    "start": "node index.js"
  }
}

vim index.js

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient();

client.set('visits', 0);

app.get('/', (req, res) => {
  client.get('visits', (err, visits) => {
    res.send('Number of visits: ' + visits);
    client.set('visits', parseInt(visits) + 1);
  });
});

app.listen(8081, () => {
  console.log('Listening on port 8081');
});

创建Dockerfile 构建镜像

FROM node:14-alpine

WORKDIR '/app'

COPY package.json .
RUN npm install
COPY . .

CMD ["npm","start"]
docker build -t s09g/visit:latest .

启动docker

尝试启动

docker run -p 8081:8081 s09g/visit
# (node:18) UnhandledPromiseRejectionWarning: Error: The client is closed
#     at Commander._RedisClient_sendCommand (/app/node_modules/@redis/client/dist/lib/client/index.js:440:31)

启动失败,因为redis client没有办法连上redis服务器
在新的窗口中启动redis

docker run redis

回到原有窗口

docker run -p 8081:8081 s09g/visit

依然失败

定义Docker Compose文件

我们需要将两个隔离的docker环境进行连接,最简单的工具就是docker compose

vim docker-compose.yml

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - '8081:8081'

vim index.js

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
    host: 'redis-server',
    port: 6379
});

client.set('visits', 0);

app.get('/', (req, res) => {
  client.get('visits', (err, visits) => {
    res.send('Number of visits: ' + visits);
    client.set('visits', parseInt(visits) + 1);
  });
});

app.listen(8081, () => {
  console.log('Listening on port 8081');
});

启动docker compose

# 启动容器
docker compose up

# 构建+启动容器
docker compose up --build

访问 localhost:8081,并且刷新

docker compose 管理

# detach 不向终端打印log
docker compose up -d

# 终止容器
docker compose down

# 查看容器状态
docker compose ps

docker compose 重启设置

修改 index.js,人为退出程序 exit(0)
vim index.js

const express = require('express');
const redis = require('redis');
const process = require('process');

const app = express();
const client = redis.createClient({
    host: 'redis-server',
    port: 6379
});

client.set('visits', 0);

app.get('/', (req, res) => {
  process.exit(0);
  client.get('visits', (err, visits) => {
    res.send('Number of visits: ' + visits);
    client.set('visits', parseInt(visits) + 1);
  });
});

app.listen(8081, () => {
  console.log('Listening on port 8081');
});

Note:exit(0)为正常退出,别的数字为异常退出

重新构建启动

docker compose up --build
# ...
# visit-node-app-1 exited with code 0

在新窗口中查看容器进程,只有redis

docker ps
# CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
# 8ff9924662e5   redis     "docker-entrypoint.s…"   43 seconds ago   Up 42 seconds   6379/tcp   visit-redis-server-1

我们的目标是web应用可以自动重启,我们可以修改docker-compose.yml文件

Restart 有四种可选值:

  • "no": 不重启 (需要引号,没有引号的no被yaml当做false)
  • always: 无论原因,一律重启
  • on-failure: 仅在异常退出时重启
  • unless-stopped: 仅在手动stop时停止,否则一律重启

vim docker-compose.yml

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    restart: always
    build: .
    ports:
      - '8081:8081'

访问 localhost:8081

docker compose up --build
# ...
# visit-node-app-1      | 
# visit-node-app-1      | > @ start /app
# visit-node-app-1      | > node index.js
# visit-node-app-1      | 
# visit-node-app-1      | Listening on port 8081
# visit-node-app-1 exited with code 0
# visit-node-app-1      | 
# visit-node-app-1      | > @ start /app
# visit-node-app-1      | > node index.js
# visit-node-app-1      | 
# visit-node-app-1      | Listening on port 8081

web 应用重启成功

修改restart为on-failure

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    restart: on-failure
    build: .
    ports:
      - '8081:8081'

访问 localhost:8081

docker compose up --build

web 应用没有重启文章来源地址https://www.toymoban.com/news/detail-820101.html

到了这里,关于6.docker-compose的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker容器与虚拟化技术:Docker-Compose

    目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 (1)使用场景 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务

    2024年02月12日
    浏览(51)
  • docker-compose 如何安排容器启动的顺序

    在使用docker-compose进行容器部署的时候,时常是需要对容器的启动顺序进行编排,比如在应用容器启动前,需要先启动数据库的容器。通过对官方文档的阅读,发现在docker-compose中,可以使用depends_on配合健康检查healthcheck来实现。 参考链接: https://docs.docker.com/compose/compose-fi

    2024年02月12日
    浏览(49)
  • 【云原生】Docker-compose单机容器集群编排

    Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。 Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、

    2024年02月09日
    浏览(57)
  • 【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

    本文通过docker-compose构建一个单体的rabbtimq容器。 首先需要有docker和docker-compose环境,docker安装[1],docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 docker-compose在/usr/local/bin里,我们就在/usr/local下构建一个docker-compose目录,里面再构建各级不同容器的目

    2024年04月25日
    浏览(48)
  • 实战:用docker-compose容器化springboot项目

    前面我们学习和实战了用dockerfile构建镜像,通过镜像可以任意在docker环境容器化部署项目。但是作为WEB领域的开发者,大多都是微服务架构,一个项目会有很多的子项目和中间件,一个个的容器化部署会非常的麻烦。那么,此时我们可以用docker-compose批量构建镜像和容器化,

    2024年02月10日
    浏览(44)
  • docker-compose 容器固定IP(network subnet)

    示例 如下是为容器设置固定IP的 docker-compose.yml 示例,其中包含定义 networks 和在应用中引用设定固定 IP 的配置。 参考官网链接: https://docs.docker.com/compose/compose-file/#ipam https://github.com/docker/compose/issues/4336 (END)

    2024年02月13日
    浏览(38)
  • 实战:win10安装docker并用docker-compose构建运行容器

    Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。但是某些时候我们没有Linux环境怎么破?为了解决这个问题我们可以用VM虚拟机上安装Linux系统进行处理。然而对于我们的WIN10系统自带Hyper-V虚拟机,简直不要太爽。我们可以直接开启Hyper-V服务,并安

    2024年02月12日
    浏览(54)
  • 尚硅谷Docker实战教程-笔记12【高级篇,Docker-compose容器编排】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】 视频地址:尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇,Docker理念简介、官网介绍、平台入门图解、平台架构图解】 尚硅谷Docker实战教程-笔记02【基础篇,Do

    2024年02月16日
    浏览(49)
  • 【Docker】解决docker-compose启动的容器一直处于restarting状态的问题

    通过如下的文件启动容器后 status一直处于Restarting 且执行如下命令报错: 改成如下后解决 参考:https://stackoverflow.com/a/63990209

    2024年02月11日
    浏览(44)
  • docker-compose 以交互式方式运行你的容器

    最近遇到一个问题,用docker-compose编排的mysql和django服务,在django模型上加了一个没有默认值(就不想在模型上加default=xxx)的非空字段,这时候django会要求你提供一个默认值给这个字段。这时候容器将会启动失败。想尝试docker run单独启动django服务,但又依赖容器化的mysql服务

    2023年04月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包