sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
Add user to docker group
sudo usermod -aG docker $USER
Test docker
docker run hello-world
Create file:
/etc/docker/daemon.json
Add configuration:
{
"ipv6": false,
"dns": ["8.8.8.8","1.1.1.1"]
}
Restart docker
systemctl restart docker
Verify
docker run hello-world
docker pull nginx
docker pull ubuntu
docker pull mysql
docker run -d --name mynginx -p 8080:80 nginx
Explanation
-d = run in background
--name mynginx = container name
-p 8080:80 = map container port 80 to host port 8080
docker exec -it mynginx bash
docker stop mynginx
docker start mynginx
docker restart mynginx
docker logs mynginx
docker logs -f mynginx
docker stop mynginx
docker rm mynginx
Remove all stopped containers
docker container prune
docker run -d --name mynginx -p 8081:80 nginx
Container port 80 → Host port 8081
Create configuration file
mkdir -p /data/docker
touch /data/docker/my.cnf
chown 999:999 /data/docker/my.cnf
chmod 644 /data/docker/my.cnf
Run MySQL container
docker run -d \
--name mydb \
-e MYSQL_ROOT_PASSWORD=pass123 \
-v /data/mysql:/var/lib/mysql \
-v /data/docker/my.cnf:/etc/mysql/conf.d/my.cnf \
-p 3306:3306 \
mysql:latest
Create Dockerfile
cat > Dockerfile <<EOF
FROM mysql:8.0
LABEL maintainer="you@example.com"
COPY my.cnf /etc/mysql/conf.d/my.cnf
RUN apt-get update && apt-get install -y \
vim \
net-tools \
&& apt-get clean
EOF
docker images # list images
docker ps # list containers
docker stats # container resource usage
docker logs -f name # view logs
docker inspect name # container config
docker exec -it name bash # enter container
docker top name # processes inside container
docker system df # disk usage
docker run -d \
--name mydb5 \
-e MYSQL_ROOT_PASSWORD=pass123 \
-p 3308:3306 \
--memory="1g" \
--cpus="1.5" \
mysql:8.0
Verify limits
docker inspect mydb5 | grep -i -E "memory|cpus"
Live resource usage
docker stats mydb5
Check inside container
docker exec -it mydb5 cat /sys/fs/cgroup/memory/memory.limit_in_bytes
docker exec -it mydb5 cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
docker exec -it mydb5 cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
docker run -d \
--name mydb10 \
--restart=always \
-e MYSQL_ROOT_PASSWORD=pass123 \
-p 3310:3306 \
mysql:latest
Restart options
no
on-failure
always
unless-stopped
Default network: bridge
Create network
docker network create mynet2
docker network inspect mynet2
Run container on network
docker run -d \
--name mydb12 \
--restart=always \
-e MYSQL_ROOT_PASSWORD=pass123 \
-p 3312:3306 \
--network mynet2 \
mysql:latest
Connect container to multiple networks
docker network connect mynet mydb9
docker network connect mynet1 mydb9
docker network connect mynet2 mydb9
docker network connect mynet3 mydb9
Network types
bridge : containers on same host
host : use host network
none : isolated container
overlay : multi-host cluster networking
Example
docker run -d \
--name web2 \
--restart unless-stopped \
--health-cmd="curl -f http://localhost:80 || exit 1" \
--health-interval=30s \
--health-retries=3 \
--health-timeout=5s \
nginx
Exit codes
0 = success
1 = failure
command missing = failure
docker cp temp-tomcat:/usr/local/tomcat/conf /data/mytomcat
docker run -d \
--name mydb16v8 \
-e MYSQL_ROOT_PASSWORD=pass123 \
-e TZ="Asia/Kolkata" \
--restart unless-stopped \
--health-cmd="mysqladmin ping -h localhost -u root --password=pass123 || exit 1" \
--health-interval=5s \
--health-retries=5 \
-v /data/mysql16v8:/var/lib/mysql \
-v /data/docker/my.cnf:/etc/mysql/conf.d/my.cnf \
-p 3316:3306 \
--memory="1g" \
--cpus="1.5" \
--network mynet2 \
my-mysql-image:8.0
docker run -d \
--name tomcat3 \
--restart unless-stopped \
--health-cmd="curl -f http://localhost:8080 || exit 1" \
--health-interval=30s \
--health-retries=3 \
--health-timeout=5s \
-e TZ="Asia/Kolkata" \
-e JAVA_OPTS="-Xms128m -Xmx256m -Duser.timezone=Asia/Kolkata" \
-p 8083:8080 \
--network mynet2 \
-v /data/tomcat_docker/tomcat_common/warfile/log-api-1.0.war:/usr/local/tomcat/webapps/log-api-1.0.war \
-v /data/tomcat_docker/tomcat3/logs:/usr/local/tomcat/logs \
-v /data/tomcat_docker/tomcat_common/db_properties/db.properties:/usr/local/tomcat/conf/db.properties \
tomcat:9.0.111-jdk8-corretto-al2
docker run -d \
--name nginxlb \
--restart unless-stopped \
--network mynet2 \
-p 80:80 \
-p 443:443 \
-v /data/nginx-lb/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /data/nginx-lb/SSL:/etc/nginx/SSL:ro \
-v /data/nginx-lb/logs:/var/log/nginx \
--health-cmd="sh -c 'echo > /dev/tcp/127.0.0.1/80 || exit 1'" \
--health-interval=30s \
--health-retries=3 \
--health-timeout=5s \
-e TZ="Asia/Kolkata" \
nginx:stable
Test request
curl -k "https://localhost:443/log-api-1.0/log?msgtext=thisistest4011116&status=ok"
Start containers
docker compose up -d
Stop containers
docker compose down
Rebuild containers
docker compose up -d --build
Force recreate
docker compose up -d --force-recreate