Docker极简入门:使用Docker-Compose 运行网站浏览量统计Demo
Docker-Compose 是一个可以对 Docker 容器集群的快速编排的工具,能够减轻您心智和手指的负担。
简单的来说 Docker-Compose 就是将你运行多个容器的命令编写到了一起,类似于你会为一系列重复操作写一个 doSomething.sh 文件,只不过 Docker-Compose 提供了更简便的语法。
当然如果想管理多主机多容器还是推荐使用 k8s。
我们的 demo 是一个基于 node.js 的网站服务,当用户访问当前服务器的根目录时,将 redis 中的浏览量计数增加1。
先不看具体的业务代码,这其实无关紧要。假设我们已经写好了 node 服务,那么我们下一步就是写一个Dockerfile文件去构建镜像,然后执行 docker run 命令,这样整个服务就启动了。
FROM node:18-alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
CMD ["npm","start"]
这个Dockerfile 做的事情就是
- 在容器中创建一个 app 目录,并切换到该目录。
- 将宿主机当前目录下的 package.json 文件拷贝到容器中的当前目录(/app)下
- 执行命令
npm install - 将宿主机当前目录下的所有文件拷贝到容器中(因为主体程序index.js还没有拷贝到容器中)
- 运行命令
npm start启动服务
因为我们的 node 服务用到了 redis,所以我们还需要启动一个 redis 容器。
但 docker 的机制使得这两个容器是互相隔离的,所以想要通信的话
- 将 redis 端口与宿主机端口做映射,通过宿主机的端口访问 redis
- 创建 docker network,将两个容器放在同一个 docker network下
- 编写 docker-compose.yml 文件,让Docker-Compose帮我们创建 docker network 搞定一切

docker-compose.yml
version: '3'
services:
## 容器名
redis-server:
## 指定镜像
image: 'redis:6.0.16-alpine'
## 容器重启策略
restart: 'always'
## 容器名
node-app:
## 当前目录执行 docker build
build: .
## 端口映射
ports:
- "8888:8081"
虽然我们在文件中没有写任何有关 network 的代码,但 Docker-Compose会自动帮我们创建一个network
运行命令
sudo docker-compose up --build ## 会执行yaml文件中的build命令
访问 localhost:8888 你应该能看到类似这样的界面

docker-compose 的命令跟 docker类似
docker-compose up -d ## 后台运行
docker-compose down ## 停止
最后是文件目录结构和 index.js 以及 package.json的具体代码
.
├── docker-compose.yml
├── Dockerfile
├── index.js
├── package.json
package.json
{
"dependencies": {
"express": "^4.17.3",
"redis": "^4.0.6"
},
"scripts": {
"start": "node index.js"
}
}
index.js
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
url : 'redis://redis-server:6379' // redis-server会被docker解析并转发
});
const db = {
async set(key,value){
return fun(async()=>{
return await client.set(key,value)
},key,value)
},
async get(key){
return fun(async()=>{
return await client.get(key)
},key)
}
}
async function fun(callback,key,value){
return new Promise(async (res,rej)=>{
await client.connect();
let ok = callback(key,value);
await client.quit();
res(ok);
})
}
db.set("visits",0);
async function cntVisits(){
let cnt = await db.get("visits");
await db.set("visits",parseInt(cnt)+1);
return parseInt(cnt)+1;
}
app.get('/', (req, res) => {
cntVisits().then( result => {
res.send('Number of visits is ' + result);
});
});
// 8081是容器内部的端口,我们需要访问的是8888,因为在docker-compose.yml文件中已经做过端口映射了
app.listen(8081, () => { console.log('Listening on port 8081'); });
Docker极简入门:使用Docker-Compose 运行网站浏览量统计Demo的更多相关文章
- .Net Core in Docker极简入门(下篇)
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...
- Docker极简入门:使用Docker运行Java程序
运行简单的Java程序 先在当前目录创建App.java文件 public class App{ public static void main(String[] args){ String os = ...
- 小白的docker极简入门(二)、5分钟教你玩转docker安装
0-前言 上一篇中,我们已经安装后Linux了,我们需要在Linux下安装docker,然后才能在docker中安装和部署各种应用 同样,5分钟教你完成docker正确安装和使用, 不是纸上谈兵,不是 ...
- .Net Core in Docker极简入门(上篇)
目录 前言 开始 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & run 前言 Docker 是一个开源 ...
- Docker极简入门:使用Docker-Compose 搭建redis集群
为了构建一个集群,我们首先要让 redis 启用集群模式 一个简单的配置文件如下redis.conf # redis.conf file port 6379 cluster-enabled yes c ...
- Spring Security极简入门三部曲(上篇)
目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...
- Git 极简入门教程学习笔记
Git 极简入门教程 http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...
- ElasticSearch极简入门总结
一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...
- Spring Security极简入门三部曲(中篇)
目录 Spring Security极简入门三部曲(中篇) 验证流程 Authentication接口 过滤器链 AuthenticationProvider接口: demo时刻 代码讲解 小结 Sp ...
随机推荐
- Java Study two
由于前段时间再做.NET 项目没做更新,今天简单的学习java项目的新建和入门的学习 今日目标 基础语法了解 新建第一个java项目 新建第一个项目Class ->HelloWorld 运行并输 ...
- SolidWorks在一个零件中设置不同的尺寸版本
问题 比如想设置一系列螺丝的长度,一个一个建零件非常麻烦,希望在一个零件中设置不同的长度尺寸版本 解决 比如想设置不同的拉伸长度,右键拉伸>配置特征 可以生成新配置,设置不同的D1参数,即可生成 ...
- [使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
根本原因 依赖托管仓库的库存不足.有的仓库,就是没有团队上传这个依赖.所以多加几个镜像源,总有一个仓库能找到. 解决方案 修改 maven 默认配置文件 "C:\Users\<user ...
- python 模块和包的基础知识
1.常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀 2.为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理.这时我们不仅 ...
- 什么是可重入锁ReentrantLock?
举例来说明锁的可重入性 public class UnReentrant{ Lock lock = new Lock(); public void outer(){ lock.lock(); inne ...
- nginx搭建简单直播服务器
1.下载模块(nginx-rtmp-module) 1 cd /data/nginx 2 yum install git3 git clone https://github.com/arut/ngin ...
- 学习DNS(一)
DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串.通过主机名,最终得到该主 ...
- MySQL怎么用命令修改字段长度
MySQL怎么用命令修改double字段长度 1 alter table 表名 modify column 列名 类型(要修改的长度) COMMENT 备注信息; 2 alter table t_ov ...
- docker 容器简单使用
文章目录 docker简介 docker容器简单使用 1.HelloWorld 2.运行交互式的容器 3.启动容器(后台模式) 安装docker容器的博文有很多这里就不做过多赘述了,另外如果不想安装d ...
- s函数中第一个程序修改(介绍function sys = mlupdate(t, x, u)用法)
示例: dx1/dt=-0.5572x1-0.7814x2+u1-u2; dx2/dt=0.7814x1+2u2; y=1.9691x1+6.4493x2; simulink模型的建立 s函数程序 A ...