DEV Community

Cover image for Docker+Deno: Containerize a Deno hello world server
Francesco Ciulla
Francesco Ciulla

Posted on

Docker+Deno: Containerize a Deno hello world server

Deno is the buzzword of the moment, and we still don't know how it will end.

Honestly, I am very fond of node, but I was intrigued, so I created a hello world server with deno, and immediately I tried to containerize it with docker.

Warning!
this example is based on this docker image https://hub.docker.com/r/hayd/deno

Which is not an official deno repository

Github Repository: https://github.com/FrancescoXX/deno-docker

Please note the this the first time I use deno, so it is something pretty new also to me

Short version

you can just clone the repository

git clone https://github.com/FrancescoXX/deno-docker
Enter fullscreen mode Exit fullscreen mode

navigate to the folder where the docker-compose.yml is located, and run

docker-compose up --build
Enter fullscreen mode Exit fullscreen mode

Done!


Long version

If you want to follow along, and you use Visual Studio Code, I suggest you install this extension:

Alt Text

First of all, we create a file for the deno dependencies, called deps.ts.

In Deno, we import third part code directly from urls, no node_modules or package.json is needed

export { serve } from "https://deno.land/std@0.50.0/http/server.ts";
Enter fullscreen mode Exit fullscreen mode

Then, we create the main.ts file, and import the deps.ts file as a regular ts file

We also define a very simple Server, based on the official example

import { serve } from "./deps.ts";

const PORT = 8000;

const s = serve({ port: 8000 });

const body = new TextEncoder().encode("Hello World\n");

console.log(`Server started on port ${PORT}`);
for await (const req of s) {
  req.respond({ body });
}
Enter fullscreen mode Exit fullscreen mode

then, we create a very simple Dockerfile, using the hayd/alpine-deno:1.0.0 image

FROM hayd/alpine-deno:1.0.0

EXPOSE 8000

WORKDIR /app

USER deno

COPY deps.ts .
RUN deno cache deps.ts

COPY . .
RUN deno cache main.ts

CMD ["run", "--allow-net", "main.ts"]
Enter fullscreen mode Exit fullscreen mode

And last, we create a very simple docker-compose.yml file, which is no needed for now, but it could be useful in the future, for example, if we start using a database or some other services

We define port 8000 as both inner and outer one and a default network

version: "3.7"

services:
  deno:
    image: "deno-docker:0.0.1"
    build: .
    ports:
      - "8000:8000"
    networks: 
      - deno

networks:
  deno: {}
Enter fullscreen mode Exit fullscreen mode

from the folder where the docker-compose.yml file is located, we build the image:

docker-compose build
Enter fullscreen mode Exit fullscreen mode

And finally, we can launch the service with this command

docker-compose up deno
Enter fullscreen mode Exit fullscreen mode

visit localhost:8000 from a browser

Alt Text

That is not the best and most useful server, but it is intended as a point to start from

Also, using docker, we didn't need to install deno on the machine

Please leave a comment if you want more articles about this topic

Github Repository: Github Repository: https://github.com/FrancescoXX/deno-docker

Oldest comments (4)

Collapse
 
kinensake profile image
kinensake

We can use some APIs like Browser APIs via global object ("window-like") without any module. I really love that.

Collapse
 
francescoxx profile image
Francesco Ciulla

yes that is interesting!

Collapse
 
devbambhaniya profile image
Devshi bambhaniya

@francescoxx
Thank you for sharing yes that is interesting!

Collapse
 
francescoxx profile image
Francesco Ciulla

you are welcome !!!