# Docker Developer Guide#02

Docker Concepts & Guide

### Summary

1.  **Concepts of Container**
2.  **Development Container**
3.  **Deploy of Container**
4.  **GitHub Package**
5.  **Upload Image to Docker Hub**
6.  **Docker Install WSL2**
7.  **Import & Export Container**
8.  **Docker Cheat Sheet**
9.  **Docker Volumes**
10.  **Portainer.io**
11.  **Setup /etc/docker/daemon.json**
12.  **References**

### 1\. Concepts of Contaitner

Diference Container x Virtual Machine

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834150762/b-dxOFxN7.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834152057/UQe_K3Kpb.png)

### 2\. Developer Container

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834153989/UWg1i1jQf.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834157204/lflC7711-.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834158706/JPJkkqzGv.png)

### 3\. Deploy Container

### 3.1. Google Cloud Platform

**Google Cloud Run**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834160091/sO3CZRbD_.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834161422/fVWliry-N.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834162789/dDe3oK58-.png)

### 3.2. AWS

**AWS Elastic Container Service**

[**Amazon EC2 Container Service - AWS**  
*O Amazon EC2 container service (EC2 ECS) permite escalar contêineres do docker com alto desempenho, e executa…*aws.amazon.com](https://aws.amazon.com/pt/ecs/ "https://aws.amazon.com/pt/ecs/")[](https://aws.amazon.com/pt/ecs/)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834164169/Nml4fisoj.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834165580/7sGHlCwgp.png)

[**Amazon EC2 Container Service - AWS**  
*O Amazon EC2 container service (EC2 ECS) permite escalar contêineres do docker com alto desempenho, e executa…*aws.amazon.com](https://aws.amazon.com/pt/ecs/ "https://aws.amazon.com/pt/ecs/")[](https://aws.amazon.com/pt/ecs/)

### 3.3. Kurbenetes

Diferences Beteween K8s x K3s

[**What's the difference between k3s vs k8s - Civo.com**  
*For those of you not in the know, Kubernetes is a "container orchestration platform". This effectively means taking…*www.civo.com](https://www.civo.com/blog/k8s-vs-k3s "https://www.civo.com/blog/k8s-vs-k3s")[](https://www.civo.com/blog/k8s-vs-k3s)

**K3S**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834166842/GzPrtB1cn.png)

[**Lightweight Kubernetes**  
*The above figure shows the difference between K3s server and K3s agent nodes. For more information, see the…*k3s.io](https://k3s.io/ "https://k3s.io/")[](https://k3s.io/)

```
curl -sfL https://get.k3s.io | sh -  
# Check for Ready node,  
takes maybe 30 seconds  
k3s kubectl get node
```

### 3.4. Start Docker

sudo dockerd &  
  

### **4\. GitHub Package**

*   ghcr.io

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834168517/eqC5TSL8A.png)

*   [https://github.com/Software-Engineering-2030/sample-docker/new/main?filename=.github%2Fworkflows%2Fmain.yml&workflow\_template=blank](https://github.com/Software-Engineering-2030/sample-docker/new/main?filename=.github%2Fworkflows%2Fmain.yml&workflow_template=blank)

name: CI

on:  
  workflow\_dispatch:  
    
jobs:  
  build:  
    runs-on: ubuntu-latest  
    steps:  
    - name: Checkout  
      uses: actions/checkout@v2  
        
    - uses: azure/docker-login@v1  
      with:  
        login-server: ghcr.io  
        username: ${{ secrets.GH\_PACKAGES\_USER }}  
        password: ${{ secrets.GH\_PACKAGES\_TOKEN }}  
          
    - run:   
        docker build -t ghcr.io/Software-Engineering-2030/sample-docker/demovideo:latest -f Dockerfile  
        docker tag ghcr.io/Software-Engineering-2030/sample-docker/demovideo ghrc.io/Software-Engineering-2030/sample-docker/demovideo:${{github.sha}}  
          
    - run:   
        docker push ghcr.io/Software-Engineering-2030/sample-docker/demovideo:latest  
        docker push ghcr.io/Software-Engineering-2030/sample-docker/demovideo:${{github.sha}}

### **5\. Upload Image to Docker Hub**

*   docker ps -a
*   docker commit Imagem repo
*   docker push repo
*   docker login -username=username -email=email@docker.com
*   [https://hub.docker.com](https://hub.docker.com)

docker login -u=xxxx -p=yyyy

```
docker login -u="${DOCKER_USERNAME}" -p="${DOCKER_PASSWORD}"
```

### 6\. Docker Install WSL2

### Pre-reqs

sudo apt update && sudo apt upgrade  
sudo apt remove docker docker-engine docker.io containerd runc  
sudo apt-get install \\  
    apt-transport-https \\  
    ca-certificates \\  
    curl \\  
    gnupg \\  
    lsb-release

### Update Sources Ubuntu

curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
echo \\  
  "deb \[arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg\] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) \\  
  $(lsb\_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

### Install Docker Engine

sudo apt-get update  
sudo apt-get install docker-ce docker-ce-cli containerd.io

### Docker Permission Users

sudo usermod -aG docker $USER

### Install Docker Composer

sudo curl -L "[https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname](https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$%28uname) -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
sudo chmod +x /usr/local/bin/docker-compose  
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

### Install Docker Service Start(\*)

sudo service docker start

### Docker Bash, Commit, Push

docker pull ubuntu

docker run -it -d ubuntu

docker exec -it aa3e7607dbac bash

docker commit aa3e7607dbac viannaandre/ubuntu-test:latest

docker push viannaandre/ubuntu-test:latest

### GitHub Package

### 7\. Import & Export Container

*   [https://www.vivaolinux.com.br/dica/Como-exportar-um-container-Docker-para-outra-maquina](https://www.vivaolinux.com.br/dica/Como-exportar-um-container-Docker-para-outra-maquina)

#### Export Container

**\# docker container ls -a**

**\# docker export meudjango | gzip > meudjango.gz**

#### Copy Container

**scp meudjango.gz servidor:/destino**

#### Destination Host

**\# ssh usuario@servidor**

**\# zcat meudjango.gz | docker import - meudjango**

#### Execute Host

**\# docker run -it meudjango bash**

### **8\. Docker Cheat Sheet**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834170056/MRTiwOT3z.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834171641/h5NKYmAB-.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834173304/UVHM5OoX0.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834175092/d92UyWYyg.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834176978/qYOFPXqlv.png)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834179916/6rwlU2DqP.png)

*   [https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md](https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md)

### 9\. Docker Volumes

### Docker Backup / Restore

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834181967/qCxGvyqVw.png)

Docker Backup / Restore

### Docker Volume Bind

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834185348/5igZ1JP92.png)

Docker Volume Bind

### Docker Migration Strategy

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834186834/6gNP-SktH.jpeg)

### How to persist and backup PostgreSQL Docker container

*   [https://dev.to/sirak/how-to-persist-and-backup-postgresql-docker-container-b75](https://dev.to/sirak/how-to-persist-and-backup-postgresql-docker-container-b75)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834188294/FegVI8X7_r.png)

PostgreSQL Docker Backup

```
version: '3.1'  
services:  
  db:  
    image: postgres  
    restart: always  
    environment:  
      POSTGRES_USER: myuser  
      POSTGRES_PASSWORD: mypassword  
      POSTGRES_DB: mydb  
    volumes:  
       - ./data:/var/lib/postgresql/data
```

### How to persist and backup MySQL Docker container

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834189681/r2OmMqZQ7m.jpeg)

### Structure

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834190987/v20NscLut.png)

### Docker Migration Volumes

*   [https://www.youtube.com/watch?v=ZEy8iFbgbPA&t=86s](https://www.youtube.com/watch?v=ZEy8iFbgbPA&t=86s)
*   Volumes
*   Binds

### Docker Backup / Restore Volumes

*   [https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md](https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md)

### Backup a container

Backup docker data from inside container volumes and package it in a tarball archive. `docker run --rm --volumes-from CONTAINER -v $(pwd):/backup busybox tar cvfz /backup/backup.tar CONTAINERPATH`

### Restore container from backup

Restore the volume with a tarball archive. `docker run --rm --volumes-from CONTAINER -v $(pwd):/backup busybox bash -c "cd CONTAINERPATH && tar xvf /backup/backup.tar --strip 1"`

### ¬

### Docker Volume Backup / Restore (Checked)

*   [https://stackoverflow.com/questions/26331651/how-can-i-backup-a-docker-container-with-its-data-volumes#:~:text=To%20backup%20a%20data%20volume,data%20for%20a%20MySQL%20server](https://stackoverflow.com/questions/26331651/how-can-i-backup-a-docker-container-with-its-data-volumes#:~:text=To%20backup%20a%20data%20volume,data%20for%20a%20MySQL%20server).

### Backup

```
#!/bin/bash  
# This script allows you to backup a single volume from a container  
# Data in given volume is saved in the current directory in a tar archive.  
CONTAINER_NAME=$1  
VOLUME_NAME=$2  
  
usage() {  
  echo "Usage: $0 [container name] [volume name]"  
  exit 1  
}  
  
if [ -z $CONTAINER_NAME ]  
then  
  echo "Error: missing container name parameter."  
  usage  
fi  
  
if [ -z $VOLUME_NAME ]  
then  
  echo "Error: missing volume name parameter."  
  usage  
fi  
  
sudo docker run --rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME
```

### Restore

```
#!/bin/bash  
# This script allows you to restore a single volume from a container  
# Data in restored in volume with same backupped path  
NEW_CONTAINER_NAME=$1  
  
usage() {  
  echo "Usage: $0 [container name]"  
  exit 1  
}  
  
if [ -z $NEW_CONTAINER_NAME ]  
then  
  echo "Error: missing container name parameter."  
  usage  
fi  
  
sudo docker run --rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar
```

Usage can be like this:

```
$ volume_backup.sh old_container /srv/www  
$ sudo docker stop old_container && sudo docker rm old_container  
$ sudo docker run -d --name new_container myrepo/new_container  
$ volume_restore.sh new_container
```

### 10\. Portainer.io

*   [https://www.portainer.io/](https://www.portainer.io/)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834193003/6PQPoLP28.png)

portainer.io

*   [https://docs.portainer.io/v/ce-2.11/start/install/server/docker/wsl](https://docs.portainer.io/v/ce-2.11/start/install/server/docker/wsl)

### Docker Volume

docker volume create portainer\_data

### Docker Container

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer\_data:/data portainer/portainer-ce:2.11.0

[https://localhost:9443](https://localhost:9443)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1662834194976/db7neKBum.png)

### **11\. Setup /etc/docker/daemon.json**

**/etc/docker/daemon.json**

{  
  "dns": \["8.8.8.8"\]  
}

Restart Docker:

sudo service docker restart

*   [https://github.com/gliderlabs/docker-alpine/issues/334](https://github.com/gliderlabs/docker-alpine/issues/334)
*   [https://github.com/Backend-2030/NestJS-Keycloak-Bug-Fix](https://github.com/Backend-2030/NestJS-Keycloak-Bug-Fix)

### **11\. References**

*   [https://www.docker.com/sites/default/files/d8/2019-09/docker-cheat-sheet.pdf](https://www.docker.com/sites/default/files/d8/2019-09/docker-cheat-sheet.pdf)
*   [https://dockerlabs.collabnix.com/](https://dockerlabs.collabnix.com/)
*   [https://hub.docker.com/](https://hub.docker.com/)
*   [https://caylent.com/blog/docker/docker-commands-cheat-sheet](https://caylent.com/blog/docker/docker-commands-cheat-sheet)
*   [https://dev.to/sirak/how-to-persist-and-backup-postgresql-docker-container-b75](https://dev.to/sirak/how-to-persist-and-backup-postgresql-docker-container-b75)
*   [https://www.nanoshots.com.br/2017/01/docker-restaurando-dumps-em-containers.html](https://www.nanoshots.com.br/2017/01/docker-restaurando-dumps-em-containers.html)
*   [https://www.youtube.com/watch?v=ZEy8iFbgbPA&t=86s](https://www.youtube.com/watch?v=ZEy8iFbgbPA&t=86s)
*   [https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md](https://github.com/xcad2k/cheat-sheets/blob/main/infrastructure/docker.md)
