Docker is a platform that enables developers to build, deploy, and manage applications in lightweight, portable containers. Containers encapsulate application code and dependencies, ensuring consistency across development, testing, and production environments.
Docker Architecture
Docker follows a client-server architecture comprising:
1. Docker Client
- Provides the command-line interface (CLI) for interacting with Docker.
- Sends commands (
docker run,docker build) to the Docker daemon.
2. Docker Daemon
- Responsible for building, running, and managing containers.
- Communicates with the Docker client via REST API.
3. Docker Images
- Read-only templates used to create containers.
- Define the environment and application (e.g., operating system, dependencies).
4. Docker Containers
- Lightweight, executable instances of images.
- Contain everything needed to run an application.
5. Docker Registries
- Repositories for storing and distributing Docker images.
- Examples: Docker Hub (public), Amazon ECR (private).
6. Networking
- Docker provides networking options to enable communication between containers.
- Types: Bridge, Host, None, and Overlay networks.
Core Docker Commands
Basic Commands
docker --version: Check Docker installation version.docker info: View system-wide information.
Image Management
docker pull <image>: Download an image from a registry.docker images: List downloaded images.docker rmi <image>: Remove an image.
Container Management
docker run <image>: Create and start a container from an image.docker ps: List running containers.docker ps -a: List all containers (running and stopped).docker stop <container>: Stop a running container.docker rm <container>: Remove a container.docker exec -it <container> bash: Access a running container’s shell.
Build and Push
docker build -t <tag> <path>: Build an image from a Dockerfile.docker tag <image> <repo>:<tag>: Tag an image for a registry.docker push <repo>:<tag>: Push an image to a registry.
Volume Management
docker volume create <name>: Create a volume.docker volume ls: List all volumes.docker volume rm <name>: Remove a volume.
Network Management
docker network ls: List available networks.docker network create <name>: Create a network.docker network connect <network> <container>: Connect a container to a network.
Uses of Docker
1. Application Deployment
- Simplifies deploying applications with consistent environments across machines.
- Example: Running a Node.js app in a Docker container ensures all dependencies are included.
2. Continuous Integration/Continuous Deployment (CI/CD)
- Docker integrates seamlessly with CI/CD tools like Jenkins, GitLab, and GitHub Actions.
- Example: Automating builds and deployments with containerized pipelines.
3. Microservices Architecture
- Facilitates microservices by deploying each service in an isolated container.
- Example: Running separate containers for authentication, database, and API services.
4. Testing and Development
- Provides isolated environments for testing without affecting the host system.
- Example: Running end-to-end tests in ephemeral containers.
5. Resource Efficiency
- Lightweight containers consume fewer resources than traditional virtual machines.
- Example: Scaling applications by deploying multiple containers on the same host.
Example: Deploying a Simple Web Application with Docker
Step 1: Create an Application
Create a simple Node.js application (app.js):
const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, Docker!');
});
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
Step 2: Create a Dockerfile
Define the image for the application:
# Use the official Node.js image FROM node:16 # Set the working directory WORKDIR /usr/src/app # Copy application files COPY package*.json ./ COPY app.js ./ # Install dependencies RUN npm install # Expose the application port EXPOSE 3000 # Start the application CMD ["node", "app.js"]
Step 3: Build the Docker Image
Build the image using the Dockerfile:
docker build -t my-node-app .
Step 4: Run the Container
Start the container:
docker run -p 3000:3000 my-node-app
Step 5: Verify the Application
Access the application at http://localhost:3000.
Advantages of Docker
- Portability: Ensures consistency across environments.
- Efficiency: Reduces overhead compared to virtual machines.
- Scalability: Simplifies scaling applications with orchestration tools like Kubernetes.
- Isolation: Runs applications in isolated environments, minimizing conflicts.
- Faster Deployment: Speeds up development and deployment processes.