Docker Fundamentals: A Comprehensive Guide

For this guide, we'll be using CentOS 7 as our base operating system.

Step 1: Remove Old Docker Versions

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

Step 2: Configure Docker YUM Rpeository

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Step 3: Install Latest Docker

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Step 4: Enable Docker at Startup

# Combined enable and start
systemctl enable docker --now

Step 5: Configure Mirror Acceleration

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mirror.baidubce.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Essential Docker Commands

# List running containers
docker ps
# List all containers
docker ps -a
# Search for images
docker search nginx
# Pull an image
docker pull nginx
# Pull specific version
docker pull nginx:1.24.0
# List all images
docker images
# Remove image by ID
docker rmi 7d4d540a2b43

# Run a new container
docker run nginx
# Stop container
docker stop curious_einstein
# Start container
docker start 592
# Restart container
docker restart 592
# View container resource usage
docker stats 592
# View container logs
docker logs 592
# Remove specific container
docker rm 592
# Force remove container
docker rm -f 592
# Run container in background
docker run -d --name myweb nginx
# Run with port mapping
docker run -d --name myweb -p 8080:80 nginx
# Access container shell
docker exec -it myweb /bin/bash

# Commit changes to create new image
docker commit -m "modified index.html" myweb myweb:v1.0
# Save image to file
docker save -o myweb.tar myweb:v1.0
# Remove multiple images
docker rmi a1b2c3d4e5f6 7g8h9i0j1k2l 3m4n5o6p7q8r
# Load image from file
docker load -i myweb.tar 

# Login to Docker Hub
docker login
# Retag image
docker tag myweb:v1.0 myusername/myweb:v1.0
# Push image
docker push myusername/myweb:v1.0

Storage Management

Docker provides two primary methods for persistent storage:

1. Bind Mount: `-v /local/path:/container/path`
2. Volume: `-v myvolume:/container/path`
docker run -d -p 80:80 \
-v /local/web:/usr/share/nginx/html \
-v nginx-conf:/etc/nginx \
--name webserver \
nginx

Networking

Create custom networks for stable hostname-based communication between containers.

Example: Redis Master-Slave Setup

# Create custom network
docker network create redisnet
# Master node
docker run -d -p 6379:6379 \
-v /redis/master:/data \
-e REDIS_MODE=master \
-e REDIS_PASSWORD=secret123 \
--network redisnet --name redis-master \
redis:alpine

# Slave node
docker run -d -p 6380:6379 \
-v /redis/slave:/data \
-e REDIS_MODE=slave \
-e REDIS_MASTER_HOST=redis-master \
-e REDIS_MASTER_PORT=6379 \
-e REDIS_MASTER_PASSWORD=secret123 \
-e REDIS_PASSWORD=secret123 \
--network redisnet --name redis-slave \
redis:alpine

Example: MySQL Deployment

docker run -d -p 3306:3306 \
-v /mysql/config:/etc/mysql/conf.d \
-v /mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=securepass \
mysql:8.0.33

Docker Compose

Method 1: Command-based Setup

# Create network
docker network create blognet

# Start MySQL
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=securepass \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /blog/config:/etc/mysql/conf.d \
--restart always --name db \
--network blognet \
mysql:8.0

# Start WordPress
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=db \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=securepass \
-e WORDPRESS_DB_NAME=wordpress \
-v wp-content:/var/www/html \
--restart always --name blog \
--network blognet \
wordpress:latest

Method 2: Compose File

name: myblog
services:
  database:
    container_name: db
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=securepass
      - MYSQL_DATABASE=wordpress
    volumes:
      - mysql-data:/var/lib/mysql
      - /blog/config:/etc/mysql/conf.d
    restart: always
    networks:
      - blognet

  application:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: securepass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html
    restart: always
    networks:
      - blognet
    depends_on:
      - database

volumes:
  mysql-data:
  wp-content:

networks:
  blognet:

Key Features

  • Incremental updates - Modifying the Compose file and restarting only affects changed serivces
  • Data persistence - Volumes are preserved even when containers are stopped

Dockerfile Example

Here's a simple Dockerfile for a Java application:

FROM openjdk:17-jdk-slim

LABEL maintainer="tech@example.com"

COPY application.jar /app/application.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app/application.jar"]

Tags: docker containerization devops centos docker-compose

Posted on Sun, 28 Jun 2026 17:15:25 +0000 by pieychpi