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"]