Skip to content

Commit

Permalink
Added docker multi-container example (pulumi#1022)
Browse files Browse the repository at this point in the history
* Added example for a multi-container application

* Fixing linting errors
  • Loading branch information
pierskarsenbarg committed Jun 21, 2021
1 parent 71a705e commit 3d82eb3
Show file tree
Hide file tree
Showing 9 changed files with 264 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docker-ts-multi-container-app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/bin/
/node_modules/
3 changes: 3 additions & 0 deletions docker-ts-multi-container-app/Pulumi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
name: docker-ts-multi-container-app
runtime: nodejs
description: Example app using multiple docker containers
114 changes: 114 additions & 0 deletions docker-ts-multi-container-app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
[![Deploy](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new)

# Docker multi-container example

This example Pulumi application runs two containers locally, one Redis container and one built from the application in the `app` folder. The application queries the Redis database and returns the number of times the page has been viewed.

## Prerequisites

To run this example, make sure [Docker](https://docs.docker.com/engine/installation/) is installed and running.

## Running the App

1. Create a new stack:

```
$ pulumi stack init containers-dev
```

1. Restore NPM modules via `npm install` or `yarn install`.

1. Preview and deploy the app via `pulumi up`. The preview will take a few minutes, as it builds a Docker container. A total of 19 resources are created.

```
$ pulumi up
```

```
Updating (dev)
View Live: https://app.pulumi.com/acmecorp/docker-ts-multi-container-app/dev/updates/1
Type Name Status
+ pulumi:pulumi:Stack docker-ts-multi-container-app-dev created
+ ├─ docker:image:Image appImage create
+ ├─ docker:index:Network network create
+ ├─ docker:index:RemoteImage redisImage create
+ ├─ docker:index:Container redisContainer create
+ └─ docker:index:Container appContainer create
Diagnostics:
docker:image:Image (appImage):
warning: #1 [internal] load build definition from Dockerfile
#1 sha256:0d4d685ddff69a0240b26fdc352c1ce914133b71c905d1fa977c90c87fd2146a
#1 transferring dockerfile: 36B done
#1 DONE 0.4s
#2 [internal] load .dockerignore
#2 sha256:24180ce9fb5e863c8cdccc1dd5cecca0118d138fd1a387c2ba99c0bd73eb0b46
#2 transferring context: 2B done
#2 DONE 0.5s
#3 [internal] load metadata for docker.io/library/node:16-alpine
#3 sha256:93febbdbcf5a756e6e084d46d56976a0630ae35cc38d744d3fb69ab9a7ce9b20
#3 DONE 0.7s
#4 [1/5] FROM docker.io/library/node:16-alpine@sha256:6b56197d33a56cd45d1d1214292b8851fa1b91b2ccc678cee7e5fd4260bd8fae
#4 sha256:155f61a07d0d5bd3922125fe0a1f61b6ad7c80fd53ad17af2014022698792303
#4 DONE 0.0s
#6 [internal] load build context
#6 sha256:de51bb2a6c39944feaa85aac4b0ef727d42885f4ce1547e0d76a290b76cdb7ec
#6 transferring context: 62B done
#6 DONE 0.2s
#5 [2/5] WORKDIR /app
#5 sha256:36e7704b507e21cfc90eb97c19f220899eebe00ef73ab450f2f9b689e02e3154
#5 CACHED
#7 [3/5] COPY package.json .
#7 sha256:54933f5857daeae271dc204a253bbf96c17b66dac0dc2a94dfc082a68964cb6d
#7 CACHED
#8 [4/5] RUN npm i
#8 sha256:75557c22149d35804b54234ece9155528520503babaad06969c30e8d0b5af67d
#8 CACHED
#9 [5/5] COPY index.js .
#9 sha256:704a81bac2b5e5318ca3a0ca730516ff27bec81defa1333e99b1d5b31cf8835d
#9 CACHED
#10 exporting to image
#10 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#10 exporting layers done
#10 writing image sha256:9ec8e52bb05a93f69a72db72407265586836d85a612578c39c6883b291c18ce3
#10 writing image sha256:9ec8e52bb05a93f69a72db72407265586836d85a612578c39c6883b291c18ce3 0.1s done
#10 naming to docker.io/library/app done
#10 DONE 0.3s
Outputs:
url: "http:https://localhost:3000"
Resources:
+ 6 created
Duration: 19s
```

1. View the endpoint URL, and run curl:

```bash
$ pulumi stack output
Current stack outputs (1)
OUTPUT VALUE
url http:https://localhost:3000

$ curl $(pulumi stack output url)
I have been viewed 1 times
```

1. Repeat the previous command multiple times to see the number of views increase.

## Clean up

To clean up resources, run `pulumi destroy` and answer the confirmation question at the prompt.
10 changes: 10 additions & 0 deletions docker-ts-multi-container-app/app/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM node:16-alpine
WORKDIR /app

COPY package.json .
RUN npm i
COPY index.js .

EXPOSE 3000

CMD [ "npm", "start" ]
33 changes: 33 additions & 0 deletions docker-ts-multi-container-app/app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const express = require("express");
const redis = require("redis");

const app = express();
const redisPort = process.env.REDIS_PORT
const redisHost = process.env.REDIS_HOST;
const redisClient = redis.createClient(redisPort, redisHost);
const redisKey = "numHits";

app.get("/", (req, res) => {
redisClient.get(redisKey, async (err, redisData) => {
if(err) throw err;

if(redisData) {
console.log(redisData);
let jsonData = JSON.parse(redisData);
let currentVisits = jsonData.num;
let data = {num: currentVisits + 1};
redisClient.set(redisKey, JSON.stringify(data));
res.send(`I have been viewed ${currentVisits} times.`);
} else {
let data = {num: 1};
redisClient.set(redisKey, JSON.stringify(data));
res.send(`I have been viewed ${data.num} time.`)
}
})
});

app.listen(3000, () => {
console.log("Node server started");
console.log(`Redis Host: ${redisHost}`);
console.log(`Redis Port: ${redisPort}`);
});
15 changes: 15 additions & 0 deletions docker-ts-multi-container-app/app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node ."
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"redis": "^3.1.2"
}
}
59 changes: 59 additions & 0 deletions docker-ts-multi-container-app/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright 2016-2021, Pulumi Corporation. All rights reserved.

import * as docker from "@pulumi/docker";
import * as pulumi from "@pulumi/pulumi";

// Set defaults for redis
const redisPort = 6379;
const redisHost = "redisdb";

// Create docker network
const network = new docker.Network("network", {
name: "services",
});

// Get redis image
const redisImage = new docker.RemoteImage("redisImage", {
name: "redis:6.2",
keepLocally: true,
});

// Run redis image
const redisContainer = new docker.Container("redisContainer", {
image: redisImage.latest,
ports: [
{ internal: redisPort, external: redisPort},
],
networksAdvanced: [
{name: network.name, aliases: [redisHost]},
],
});

// Create image from local app
const appImage = new docker.Image("appImage", {
build: {
context: "./app",
},
imageName: "app",
skipPush: true,
});

// Set external port for app url
const appPort = 3000;

// Run container from local app image
const appContainer = new docker.Container("appContainer", {
image: appImage.baseImageName,
ports: [
{internal: appPort, external: appPort},
],
envs: [
pulumi.interpolate`REDIS_HOST=${redisHost}`,
pulumi.interpolate`REDIS_PORT=${redisPort}`,
] ,
networksAdvanced: [
{name: network.name},
],
}, {dependsOn: [redisContainer]});

export const url = pulumi.interpolate`http:https://localhost:${appPort}`;
10 changes: 10 additions & 0 deletions docker-ts-multi-container-app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "docker-ts-multi-container-app",
"devDependencies": {
"@types/node": "^10.0.0"
},
"dependencies": {
"@pulumi/docker": "^3.0.0",
"@pulumi/pulumi": "^3.0.0"
}
}
18 changes: 18 additions & 0 deletions docker-ts-multi-container-app/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"strict": true,
"outDir": "bin",
"target": "es2016",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"experimentalDecorators": true,
"pretty": true,
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.ts"
]
}

0 comments on commit 3d82eb3

Please sign in to comment.