Table of Contents

docker

install

ubuntu
apt-get install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt-get install -y docker-ce docker-ce-cli containerd.io
mkdir /usr/local/lib/docker/cli-plugins -p
curl -SL https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

run docker as user

usermod -aG docker hass

/etc/docker/daemon.json

download
{
  "default-address-pools":
  [
    {"base":"172.16.0.0/21","size":26}
  ]
}

reset to factory and restart

download
# if swarm
docker swarm leave --force

systemctl stop docker
rm -fR /var/lib/docker/
ip l delete docker_gwbridge
ip l delete docker0
# and other bridges
systemctl start docker

deploy

get a docker-compose.yml file and edit it

create and run in background

docker-compose up -d

check

docker ps
docker stop <id>

autostart

docker update --restart unless-stopped <id>

apply changes on containers if change docker-compose.yml

docker-compose up -d --no-deps --build

docker backup example

#!/bin/sh
 
CONTAINER=52e59999a02b
TARGET=/backup/
SOURCE=/var/lib/docker/volumes/geonode_3x1t-backup-restore/_data/
 
set -x
rm $SOURCE/2*
docker exec -it $CONTAINER python manage.py backup -f --config=/usr/src/geonode_3x1t/geonode_3x1t/br/settings_docker.ini --backup-dir=/backup_restore/
rsync -av $SOURCE $TARGET

create image

start from a base image, alpine for example

docker pull alpine

# create a new container on alpine image
docker run -dit alpine sh

# get container id
docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
3fdbad8aa816   alpine    "sh"      4 minutes ago   Up 4 minutes             keen_black

attach to container and copy directory from host to container

docker attach 3f
apk update
apk add nss
mkdir /opt
exit

docker cp /opt/sslvpn-plus 3f:/opt # this op stop container
docker start 3f

commit container 3f into image

docker commit 3f 

tag image f8

docker tag f8 sslvpn-plus-leonardo

create container vpn-leonardo from image sslvpn-plus-leonardo

docker run --name vpn-leonardo --cap-add=NET_ADMIN --device=/dev/net/tun -dit sslvpn-plus-leonardo bash

clone source

docker pull dryseawind/wildfly14jdk8

create Dockerfile

FROM dryseawind/wildfly14jdk8
MAINTAINER Stefano Scipioni
RUN /opt/jboss/wildfly-14.0.1.Final/bin/add-user.sh admin admin#password --silent
CMD ["/opt/jboss/wildfly-14.0.1.Final/bin/standalone.sh", "-c", "standalone.xml", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "--debug"]
docker build -t "soes/wildfly:14" .

rename volume

docker volume create --name <new_volume>
docker run --rm -it -v <old_volume>:/from -v <new_volume>:/to alpine ash -c "cd /from ; cp -av . /to"
docker volume rm <old_volume>

multi platform build

Multi platform build need a docker registry, local or remote (see below)

create a docker builder or use existing one

NAME=builder1
docker buildx use $NAME || docker buildx create --use --name $NAME --driver-opt network=host

build from a Dockerfile and push to local registry

REGISTRY=localhost:5000
docker buildx build --platform=linux/amd64,linux/arm64 -t $REGISTRY/yololab/helloworld --push .

docker registry (private)

create local image and tag with remote registry url

# get image from official docker registry
docker pull docker.io/hello-world

# tag
docker tag hello-world docker.csgalileo.org/hello-world

create credentials in ~/.docker/config.json

docker login docker.csgalileo.org

push

docker push docker.csgalileo.org/hello-world

get remote info with aur/reg arch program

reg ls docker.csgalileo.org
reg digest docker.csgalileo.org/charta/httprest

docker registry on localhost

docker-compose.yml
services:
  registry:
    restart: no
    image: registry:2
    ports:
      - 5000:5000
    volumes:
      - ./data:/var/lib/registry

docker registry (public)

retag local builded image to remote image

download
docker tag galileo/trac:1.4.3 scipioit/trac:1.4.3

push to docker.io

download
docker push scipioit/trac:1.4.3

remote display via ssh

scenario: connect to remote docker host via ssh and run X11 GUI on client ssh

on docker host sshd edit /etc/ssh/sshd_config

X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no

on docker host create this helper script

| set-display.sh
XAUTH=/tmp/Xauthority
HOSTIP=$(ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p')
 
AUTH_COOKIE=$(xauth list ${DISPLAY} | awk '{print $3}')
DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
export DISPLAY=${HOSTIP}:${DISPLAY_NUMBER}
touch $XAUTH
xauth -f $XAUTH add ${DISPLAY} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}

session from client

ssh -X <hostip>
source set-display.sh
docker run --rm -e DISPLAY=$DISPLAY -v $XAUTH:/root/.Xauthority  -t beezu/xeyes

docker swarm

/etc/docker/daemon.json

{
  "default-address-pools":
  [
    {"base":"172.16.0.0/21","size":26}
  ]
}

init

docker swarm init --advertise-addr 10.244.0.5 --default-addr-pool 172.16.8.0/21 --default-addr-pool-mask-length 26

convert web network scoped “local” to swarm scope

docker network rm web
docker network create -d overlay web

deploy compose as swarm

cd ~/traefik
docker stack deploy -c docker-compose.yml hosting3

add worker

# on manager get token
docker swarm join-token worker

# on worker add to manager
docker swarm join --token xxxx 172.30.18.94:2377

# on manager check nodes
docker node ls

assign label to nodes

docker node ls
ID                            HOSTNAME     STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
n4z6nb6c8xi6el63a6b0vflyv *   ujitsi-dev   Ready     Active         Leader           20.10.7
jen361j71yr6k96zrhx7x7b6a     ujitsireg3   Ready     Active                          20.10.12

docker node update --label-add type=jibri jen361j71yr6k96zrhx7x7b6a
docker node update --label-add type=jvb n4z6nb6c8xi6el63a6b0vflyv

spread the deployment across nodes based on the value of “type” label: one node on type=jvb, one on type=jibri

docker service update --placement-pref-add 'spread=node.labels.type' meet2_jibri

check spread

docker service ps meet2_jibri |grep Running
rbv77rkxpq1f   meet2_jibri.1       galileo/jibri:stable-6726-1   ujitsireg3   Running         Running 5 hours ago                                        
jan7bs8ko2c0   meet2_jibri.2       galileo/jibri:stable-6726-1   ujitsi-dev   Running         Running 5 hours ago

add a contraint to other services (meet2_jvb, meet2_jicofo, …) to run on specific node

docker service update --constraint-add 'node.labels.type == jvb' meet2_jvb

show docker services across nodes

docker stack ps meet2 |grep Runn

show node labels

docker node ls -q | xargs docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ range $k, $v := .Spec.Labels }}{{ $k }}={{ $v }} {{end}}'

show service status across nodes

alias lsd='docker stack ls --format "{{.Name}}" | xargs -n1 docker stack ps --format "{{.Node}}\t{{.CurrentState}}\t{{.Name}}\t\t{{.Error}}" -f "desired-state=running"'

rebalance services across nodes after a node outage

alias rebalance='docker service ls --format "{{.ID}}" | xargs -n1  docker service update --force'

drain a node from containers and migrate to others

docker node update --availability drain <node>

# re-enable node after maintenance
docker node update --availability active <node>

get services using a particular network 'web'

docker network inspect --verbose web | jq '.[].Services | keys[]'

get ip allocation in docker networks

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock docker/ip-util-check