Docker
CLI
docker build -t <tagname>
docker run -d <tagname>
docker ps --all
docker pull <docker>
docker container stop <id>
docker container rm <id>
docker images
docker image rm <id>
docker logs <container id>
docker exec -it <container id> cat server.js
docker cp . <container id>:/usr/src/app
docker run -p 8001:8001 -d --name <container> -e TZ=Asia/Kuala_Lumpur <image>
docker update --restart unless-stopped redis
systemctl start docker
docker stats --no-stream
docker inspect --format='{{.LogPath}}' container_id
Useful params
change time zone
-e TZ=Asia/Kuala_Lumpur
MariaDB using docker
Create db
docker run -p 127.0.0.1:3306:3306 -v /root/database:/var/lib/mysql --name $dbname -e MYSQL_ROOT_PASSWORD=$1 -d mariadb
podman run -p 3306:3306 -v $dbpath:/var/lib/mysql:Z --name mariadb -e MYSQL_ROOT_PASSWORD=$1 -d mariadb
Z - private z - share
Start db
docker run -p 10.1.130.10:3306:3306 -v /root/database:/var/lib/mysql --name $dbname -d mariadb
Connect db
docker run --rm -it --net=host mariadb mysql -h 10.1.130.10 -u root -p
if systemd keep clearing podman cache file. Use command below:
loginctl enable-linger $userId
$userId
that running the docker
version: '3.3'
services:
database:
image: mariadb
container_name: mariadb
logging:
options:
max-size: "10m"
max-file: "3"
# join same network if available, else create bridges
# network_mode: bridge
# either one
networks:
app-network:
ipv4_address: 172.18.88.10
ports:
- "3306:3306"
environment:
TZ: Asia/Kuala_Lumpur
MARIADB_ROOT_PASSWORD: somepassword
volumes:
- /data/database:/var/lib/mysql
# command: npm run start
# entrypoint: npm run start
restart: unless-stopped
# Join external network
networks:
app-network:
name: app-network
external: true
Httpd using podman
Create docker file
echo "FROM httpd:2.4-alpine" > Dockerfile
Create docker
sudo podman run -dit --name httpd -p 80:80 -p 443:443 httpd
sudo podman cp httpd:/usr/local/apache2/conf/ ./
Add certificate, private key and ca certificate to ./conf folder
create import.sh
which include following command
sudo podman cp $1 httpd:/usr/local/apache2/$1
For httpd configuration, refer Web Server
Nginx using docker
First time
sudo docker run --name nginx -p 80:80 -p 443:443 -v -d nginx:alpine
sudo docker cp nginx:usr/share/nginx/html ./html
sudo docker cp nginx:etc/nginx/nginx.conf ./nginx.conf
sudo docker cp nginx:etc/nginx/conf.d ./conf.d
Run sc
sudo docker run --name nginx -v /home/ubuntu/httpd/www:/usr/share/nginx/html -p 80:80 -p 443:443 -v /home/ubuntu/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/ubuntu/nginx/conf.d:/etc/nginx/conf.d -d nginx
sudo docker run --name nginx -v ./html:/usr/share/nginx/html -p 80:80 -p 443:443 -v ./nginx.conf:/etc/nginx/nginx.conf -v ./conf.d:/etc/nginx/conf.d -d nginx
version: '3.3'
services:
webserver:
# either from context or build from Dockerfile
image: nginx:alpine
# build: .
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
app-network:
ipv4_address: 172.18.88.2
environment:
TZ: Asia/Kuala_Lumpur
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
networks:
app-network:
driver: bridge
ipam:
config:
- subnet: 172.18.88.0/16
gateway: 172.18.88.1
LetCrypt
Refer to: DOCKER COMMUNITY FORUMS
# install certbot
sudo docker run -it --rm -p 80:80 -p 443:443 --name certbot \
-v "/local-path/etc:/etc/letsencrypt" \
-v "/local-path/lib:/var/lib/letsencrypt" \
certbot/certbot certonly -v
sudo docker run -it --rm --name certbot \
-v "/local-path/etc:/etc/letsencrypt" \
-v "/local-path/lib:/var/lib/letsencrypt" \
-v "/local-path/.cloudflare:/etc/letsencrypt/cloudflare" \
certbot/dns-cloudflare renew \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/config.ini
config.ini
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = <api key>
Alpine - nginx - certbot
FROM alpine:latest
RUN apk add --no-cache nginx certbot certbot-nginx
RUN mkdir /etc/letsencrypt
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
Then run
docker build ./ -t nginx-certbot
Node
Dockerfile
This is to make use of node user in official image
FROM node:22-alpine
WORKDIR /usr/src/app
RUN mkdir /usr/src/app/node_modules
RUN chown -R node:node /usr/src/app
Docker compose to set up nodejs environment (docker-compose.yaml)
services:
node:
image: node:18-alpine
# Use Dockerfile to build
# build: .
container_name: node18
logging:
options:
max-size: "10m"
max-file: "3"
# join same network if available, else create bridges
network_mode: bridge
# either one
# networks:
# bridge:
# ipv4_address: 172.17.0.100
# user: "${UID}:${GID}"
user: "node"
working_dir: /usr/src/app
ports:
- "8088:8088"
environment:
TZ: Asia/Kuala_Lumpur
volumes:
# include all the file in /usr/src/app
- ./:/usr/src/app
# exclude node_modules
- /usr/src/app/node_modules
# - ./package.json:/usr/src/app/package.json
# - ./index.js:/usr/src/app/index.js
# - ./.env:/usr/src/app/.env
# - ./src:/usr/src/app/src
command: npm run start
# entrypoint: npm run start
# restart: unless-stopped
# Join external network
# networks:
# default:
# name: nginx-proxy_default
# external: true
if required python, run
apk add --no-cache python3 py3-pip make g++
Create networks
docker network create \
--driver=bridge \
--subnet=172.18.88.0/16 \
--ip-range=172.18.88.0/24 \
--gateway=172.18.88.1 \
app-network
ubuntu test
sudo docker run -ti --rm -p 8443:443 --name ubuntu-test ubuntu /bin/bash
apt install nginx certbot python3-certbot-nginx
WordPress
version: '3.1'
services:
wordpress:
container_name: wordpress-server
image: wordpress
restart: always
ports:
- 8090:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: username
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: db_name
volumes:
- ./wordpress:/var/www/html
db:
container_name: wordpress-db
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: db_name
MYSQL_USER: username
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: root-password
volumes:
- ./db:/var/lib/mysql
volumes:
wordpress:
db: