Swiftorial Logo
Home
Swift Lessons
Matchuup
CodeSnaps
Tutorials
Career
Resources

Docker Registry

A Docker registry is a storage and distribution system for Docker images. This guide covers key concepts, steps to create and manage a Docker registry, examples, and best practices for using Docker registry with Express.js applications.

Key Concepts of Docker Registry

  • Docker Registry: A storage and distribution system for Docker images. Docker Hub is a public registry, while private registries can also be set up.
  • Docker Repository: A collection of Docker images, often providing different versions of the same application.
  • Docker Tag: A label applied to a Docker image in a repository, used to differentiate between different versions of the image.
  • Private Registry: A self-hosted registry for storing Docker images privately.

Setting Up the Project

Initialize a new Express.js project and create a Dockerfile:

// Initialize a new project
// npm init -y

// Install Express
// npm install express

// Create the project structure
// mkdir src
// touch src/index.js Dockerfile .dockerignore .gitignore

// .gitignore
node_modules
.env

// .dockerignore
node_modules
npm-debug.log

Creating an Express Application

Create a simple Express application:

Example: index.js

// src/index.js
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    res.send('Hello, Docker Registry!');
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}/`);
});

Creating a Dockerfile

Create a Dockerfile to containerize your Express application:

Example: Dockerfile

// Dockerfile
FROM node:14

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

# Make port 3000 available to the world outside this container
EXPOSE 3000

# Run app when the container launches
CMD ["node", "src/index.js"]

Building and Tagging the Docker Image

Build and tag the Docker image for your Express application:

// Build the Docker image
docker build -t my-express-app .

// Tag the Docker image
docker tag my-express-app your-dockerhub-username/my-express-app:latest

Logging into Docker Hub

Log into your Docker Hub account from the CLI:

// Log in to Docker Hub
docker login

Pushing the Docker Image to Docker Hub

Push the Docker image to your Docker Hub repository:

// Push the Docker image to Docker Hub
docker push your-dockerhub-username/my-express-app:latest

Pulling the Docker Image from Docker Hub

Pull the Docker image from Docker Hub:

// Pull the Docker image from Docker Hub
docker pull your-dockerhub-username/my-express-app:latest

// Run the Docker container
docker run -p 3000:3000 your-dockerhub-username/my-express-app:latest

// Open http://localhost:3000 in your browser to see the application running

Setting Up a Private Docker Registry

Set up a private Docker registry to store Docker images:

Run the Private Registry

// Run a private Docker registry
docker run -d -p 5000:5000 --name registry registry:2

Tag and Push the Image to the Private Registry

// Tag the Docker image for the private registry
docker tag my-express-app localhost:5000/my-express-app:latest

// Push the Docker image to the private registry
docker push localhost:5000/my-express-app:latest

Pull the Image from the Private Registry

// Pull the Docker image from the private registry
docker pull localhost:5000/my-express-app:latest

// Run the Docker container
docker run -p 3000:3000 localhost:5000/my-express-app:latest

// Open http://localhost:3000 in your browser to see the application running

Best Practices for Using Docker Registry

  • Use Descriptive Tags: Use semantic versioning and descriptive tags to manage different versions of your Docker images.
  • Secure Your Registry: Use authentication and SSL to secure your private Docker registry.
  • Automate Builds: Use CI/CD pipelines to automate the building, testing, and pushing of Docker images to registries.
  • Keep Images Lightweight: Use multi-stage builds and minimal base images to keep your Docker images small.
  • Scan for Vulnerabilities: Regularly scan your Docker images for vulnerabilities to ensure security.

Testing Docker Registry Integration

Test your Docker registry setup to ensure it works correctly:

Example: Testing with Mocha and Chai

// Install Mocha and Chai
// npm install --save-dev mocha chai

// test/app.test.js
const chai = require('chai');
const expect = chai.expect;
const axios = require('axios');

describe('Express App', () => {
    it('should return Hello, Docker Registry!', async () => {
        const response = await axios.get('http://localhost:3000');
        expect(response.data).to.equal('Hello, Docker Registry!');
    });
});

// Add test script to package.json
// "scripts": {
//   "test": "mocha"
// }

// Run tests
// docker run -p 3000:3000 your-dockerhub-username/my-express-app:latest
// npm test

Key Points

  • Docker Registry: A storage and distribution system for Docker images. Docker Hub is a public registry, while private registries can also be set up.
  • Docker Repository: A collection of Docker images, often providing different versions of the same application.
  • Docker Tag: A label applied to a Docker image in a repository, used to differentiate between different versions of the image.
  • Private Registry: A self-hosted registry for storing Docker images privately.
  • Follow best practices for using Docker registry, such as using descriptive tags, securing your registry, automating builds, keeping images lightweight, and scanning for vulnerabilities.

Conclusion

A Docker registry is essential for storing and distributing Docker images in a consistent and efficient manner. By understanding and implementing the key concepts, steps, examples, and best practices covered in this guide, you can effectively use Docker registry to manage your Express.js applications. Happy coding!