my file learn about tech container (docker, podman, kubernetes)
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.29.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
# or
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
docker compose version
# docker-compose or docker compose
docker-compose up --force-recreate # create ulang / network yang error
docker-compose create # membuat container
docker-compose start # start container semua docker container yang di konfigurasi
docker-compose ps # list container yang ada pada file konfigurasi
docker-compose stop # stop container yang ada pada konfigurasi
docker-compose down # menghapus container, volume, network (meskipun sedang container berjalan)
docker-compose ls # list docker compose (list berdasarkan nama folder yang berisi docker-compose.yaml yang sudah dibuat)
docker-compose build # hanya melakukan build docker file / image
docker compose -f prod.yaml create
docker compose -f prod.yaml start
docker compose -f prod.yaml down
docker compose -f docker-compose.yaml -f prod.yaml create
docker events --filter 'container=nama' # melihat kejadian secara realtime
version: "3.18"
services:
  nginx-aria:
    container_name: nginx-aria
    image: nginx:latest
HOST:CONTAINER misal 8080:80target: <port didalam container>
published: <port yang digunakan di host>
protocol: <jenis port (TCP/UDP)>
mode: <host untuk port di tiap node, atau ingress untuk swarm mode>
# karena kita tidak menggunakan docker swarm. jadi kita cukup gunakan nilai host
# docker-compose.yaml
version: "3.18"
services:
  nginx-aria-1:
    container_name: nginx-aria-1
    image: nginx
    ports:
      - target: 80
        published: 8081
        protocol: tcp
  nginx-aria-2:
    container_name: nginx-aria-2
    image: nginx
    ports:
      - "8082:80"
environment
    MONGO_INITDB_ROOT_USERNAME: ariafatah
    MONGO_INITDB_ROOT_PASSWORD: ariafatah
    MONGO_INITDB_DATABASE: 
SOURCE:TARGET:MODE
# SOURCE => lokasi di host (bisa gunakan relative path dengan diawali titik atau absolute path)
# TARGET => lokasi di container
# MODE => mode bind mount
    # ro (read only)
    # rw (read write) default
volumes:
    - "./data:/data/db"
type: volume/bind # type mount, (volume/bind)
source: ./data # target path di container
target: /data/db # target path di container
read_only: false # flag read only atau tidak defaultnya false
volumes:
    - type: bind
      source: "./data-2"
      target: "/data/db"
      read_only: false
volumes:
    mongo-data1:
        name: mongo-data-1
    mongo-data-2:
        name: mongo-data-2
services:
    mongodb-1:
        volumes:
            - "mongo-data-1:/data/db"
    mongodb-2:
        volumes:
            - type: volume
                source: mongo-data-2
                target: "/data/db"
                read_only: false
networks:
    network-harbas:
        name: network-harbas
        driver: bridge/host/none # type network 
mongodb-harbas:
    networks:
        - network-harbas
services:
  mongodb-server: # ini
    image: mongo
  mongodb-express-web:
    container_name: mongodb-express-web
    image: mongo-express
    depends_on:
      - mongodb-server # id nya bukan name contianer
restart: <option>
# option
no #default nya tidak pernah restart
always # selalu restart jika container berhenti
on-failure # restart jika container error dengan indikasi error ketike exit
unless-stopped # selalu restart container ketika dihentikan manual
deploy:
    resources:
        reservations:
            cpus: "0.25"
            memory: 50M
        limits:
            cpus: "0.5"
            memory: 100M
docker container stats
version: '3.8'
services:
  nginx-aria-1:
    container_name: nginx-aria-1
    image: nginx
    ports:
      - target: 80
        published: 8081
        protocol: tcp
    deploy:
      resources:
          reservations:
              cpus: "0.25"
              memory: 50M
          limits:
              cpus: "0.5"
              memory: 100M
services:
  app:
    container_name: app
    build:
      context: ./app
      dockerfile: dockerfile
    image: "app-golang:1.0.0" # nama image 
    environment:
      - "APP_PORT=9000"
    ports:
      - "9000:9000"
# context => lokasi folder path berisi dockerfile
# dockerfil => nama dockerfile
# image => nama image hasil build
# args => argument untuk environment docker file
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 1m30s
      timeout: 30s
      retries: 3
      start_period: 5s
health check
# test => berisikan cara melakukan test health check
# interval
# timeout
# retries => total retry
# start_period => waktu mulai
version: '3.9'
services:
  app:
    container_name: app
    build:
      context: "./app"
      dockerfile: Dockerfile
    image: "app-golang:3.0.0"
    environment:
      - "APP_PORT=8080"
      - "MODE=local"
    ports:
      - "8080:8080"
# prod.yaml
version: '3.9'
services:
  app:
    environment:
      - "MODE=prod"