Primers passos amb docker

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

(TBD, curs GDS)

Instal·lació de docker a Linux

$ sudo apt-get update

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ lsb_release -cs
ulyana -> ulyana a linux mint és equivalent a focal a Ubuntu

Descarrego els debs necessaris:

containerd.io_1.4.9-1_amd64.deb  
docker-ce-cli_19.03.10~3-0~ubuntu-focal_amd64.deb 
docker-ce_19.03.10~3-0~ubuntu-focal_amd64.deb

$ sudo dpkg -i *
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
---

Poder executar sense sudo:

$ sudo groupadd docker (ja existeix)
$ sudo usermod -aG docker $USER

(necessari tancar la sessió)

Ús bàsic de docker

https://www.linux.com/training-tutorials/how-create-docker-image/

https://hub.docker.com/
ID: joanillo (fa el paper de username)
joanqc@gmail.com / S*******44

$ sudo docker login

You should just set your timezone BEFORE installing of tzdata:

$ sudo docker build -t apache .
triga molt de temps (es queda penjat) quan demana el timezone. Per saltar aquest pas:
*https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai

# Set timezone:
RUN ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone

...
 ---> Running in d6db9c2de751
Removing intermediate container d6db9c2de751
 ---> 551b4092b0be
Successfully built 551b4092b0be
Successfully tagged apache:latest

Now let’s run the server:

$ docker run -d apache
a1cc4cd11320075a7ba280170a57c19ce9014a46b7d8cff2bbdabb2bd837f607

però no va bé perquè fa un exit automàtic

$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS     NAMES
953f000ee3b6   ea0cf22c184d   "/usr/sbin/apache2 -…"   3 minutes ago   Exited (1) 3 minutes ago             happy_blackburn
...

$ sudo docker image ls
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
apache         latest    551b4092b0be   3 minutes ago   186MB
...


per tal de què funcioni:
$ sudo docker run -t -i -d apache /bin/bash

$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
90249591a657   apache    "/bin/bash"   22 seconds ago   Up 21 seconds   80/tcp    musing_mestorf

You can kill the container with the docker kill command:

$ docker kill 90249591a657

Ara ja sé fer un docker amb Apache, però això no em serveix per servir pàgines web...
*https://hub.docker.com/_/httpd

$ mkdir apache_meu
joan@HP:~/dockerprojects$ cd apache_meu/


$ sudo docker build -t apache_meu .
$ sudo docker run -dit --name el_meu_apache -p 8080:80 -d apache_meu /bin/bash
d8cf69bd6d17bb9cd87178724e323ebf01adc02a2aa02186848c5accb078b836

$ sudo docker ps
CONTAINER ID   IMAGE        COMMAND       CREATED          STATUS          PORTS                  NAMES
d8cf69bd6d17   apache_meu   "/bin/bash"   18 seconds ago   Up 17 seconds   0.0.0.0:8080->80/tcp   el_meu_apache


finalment el que sí ha funcionat és:
*https://hub.docker.com/_/httpd
(tot i que he hagut de comentar el COPY)

$ docker build -t my-apache2 .
$ docker run -dit --name my-running-app -p 8080:80 my-apache2

Pujar un docker a dockerhub

https://www.linuxnix.com/how-to-push-an-image-to-docker-hub/

$ sudo docker image ls
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
apache         latest    88cf71135dc2   30 minutes ago   186MB
apache_meu     latest    88cf71135dc2   30 minutes ago   186MB
httpd          2.4       30287d899656   6 days ago       138MB
my-apache2     latest    30287d899656   6 days ago       138MB
dockp          latest    9873176a8ff5   12 days ago      72.7MB
ubuntu         latest    9873176a8ff5   12 days ago      72.7MB
hello-world    latest    d1165f221234   3 months ago     13.3kB
darribas/gds   5.0       2d37947f8674   11 months ago    7.89GB

sudo docker tag 30287d899656 joanillo/apache-server:v1

$ sudo docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
...
joanillo/apache-server   v1        30287d899656   6 days ago       138MB
...

$ sudo docker push joanillo/apache-server:v1

The push refers to repository [docker.io/joanillo/apache-server]
dfd488a286c9: Mounted from library/httpd 
15176fdb9a61: Mounted from library/httpd 
61172cb5065c: Mounted from library/httpd 
9fbbeddcc4e4: Mounted from library/httpd 
764055ebc9a7: Mounted from library/httpd 
v1: digest: sha256:9d1304c0f9d348940fbc9f554e0b58ad6ef90ab6db474bb6ea1fe6991b354243 size: 1366

Ara que ja hem fet el push volem verificar si la imatge que tenim penjada la podem fer servir.


primer de tot l'esborrem en local
$ sudo docker image rm 30287d899656

$ sudo docker image ls
ja no hi és

$ sudo docker pull joanillo/apache-server:v1

v1: Pulling from joanillo/apache-server
b4d181a07f80: Already exists 
4b72f5187e6e: Already exists 
12b2c44d04b2: Already exists 
ef481fc2a03a: Already exists 
d483d945fcab: Already exists 
Digest: sha256:9d1304c0f9d348940fbc9f554e0b58ad6ef90ab6db474bb6ea1fe6991b354243
Status: Downloaded newer image for joanillo/apache-server:v1
docker.io/joanillo/apache-server:v1

$ sudo docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
...
joanillo/apache-server   v1        30287d899656   6 days ago       138MB
...

i ara que ja me l'he descarregat, el puc arrecncar per fer-lo servir

$ sudo docker run -dit --name my-running-app2 -p 8080:80 joanillo/apache-server:v1
a5b8a2cbc8fce8d053c4b88ad48ccea22e1df536afbe3110f3691046817b67cf

$ sudo docker ps
CONTAINER ID   IMAGE                       COMMAND              CREATED          STATUS          PORTS                  NAMES
a5b8a2cbc8fc   joanillo/apache-server:v1   "httpd-foreground"   29 seconds ago   Up 27 seconds   0.0.0.0:8080->80/tcp   my-running-app2

i ho provo en el navegador:
localhost:8080

si entro a https://hub.docker.com/ puc veure el meu docker:
*https://hub.docker.com/r/joanillo/apache-server

Utilitzar el docker creat a Windows 10

Doker windows.png

Hem creat un docker molt simple (un servidor Apache pel port 8080 que només mostra It Works). L'hem creat des d'una màquina Linux, i hem penjat la imatge al núvol, al Hub. Ara volem utilitzar aquest docker des d'una màquina Windows.

Instal·lo el Docker Desktop 3.5.2

Hem de reiniciar l'ordinador. Arrenco el Docker Desktop, i protesta perquè la instal·lació de WSL2 és incompleta. Seguir les instruccions. Senzillament es tracta d'instal·lar el paquet d'actualització wsl_update_x64.msi

The Windows Subsystem for Linux (WSL) is a way to run a full Linux environment on your Windows machine, without having to install a "heavier" virtual machine, such as Virtual Box, VM Ware, or Hyper-V. WSL 2 also provides a mechanism for running Docker (with Linux containers) on your Windows machine. We'll install it as a prerequisite for Docker Desktop for Windows

A Windows obrim un terminal (és el cmd), i descarreguem el nostre docker que vam penjar:

C:\Users\rviap>docker pull joanillo/apache-server:v1
v1: Pulling from joanillo/apache-server
b4d181a07f80: Pull complete
4b72f5187e6e: Pull complete
12b2c44d04b2: Pull complete
ef481fc2a03a: Pull complete
d483d945fcab: Pull complete
Digest: sha256:9d1304c0f9d348940fbc9f554e0b58ad6ef90ab6db474bb6ea1fe6991b354243
Status: Downloaded newer image for joanillo/apache-server:v1
docker.io/joanillo/apache-server:v1

Si ara obrim el Docker Desktop ja el veuré, que està funcionant. Aquest docker el puc apagar, reiniciar, fins i tot esborrar. Aquestes accions les podré fer des de la línia de comandes, o des de la interfícies gràfica del Desktop.

Obrim un navegador web i http://localhost:8080 puc veure el meu Apache Server funcionant.

A partir d'aquí es poden fer coses més complicades.

Docker sense sudo

Use Docker as a non-privileged user, or install in rootless mode?

The installation script requires root or sudo privileges to install and use Docker. If you want to grant non-root users access to Docker, refer to the post-installation steps for Linux. Docker can also be installed without root privileges, or configured to run in rootless mode. For instructions on running Docker in rootless mode, refer to run the Docker daemon as a non-root user (rootless mode).

$ sudo groupadd docker (ja existeix)
$ sudo usermod -aG docker $USER

Log out and log back in so that your group membership is re-evaluated (tancar la sessió X i tornar a entrar). Ara ja puc utilitzar docker sense sudo.

Docker bàsic, línia de comanda Linux

$ cd dockerprojects

(repository name must be lowercase)

En el fitxer Dockerfile senzillament tinc:

FROM ubuntu
$ sudo docker build -t dam_m02_v0 .
Sending build context to Docker daemon  10.75kB
Step 1/1 : FROM ubuntu
 ---> 9873176a8ff5
Successfully built 9873176a8ff5
Successfully tagged dam_m02_v0:latest

$ docker run -d dam_m02_v0

$ sudo docker run -d dam_m02_v0
ed879fd2ea1a88e5fcfb7d44e816f9df803e7f379b1f4539c5716fa8a8d4122f

$ sudo docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                          PORTS     NAMES
ed879fd2ea1a   dam_m02_v0                  "bash"                   About a minute ago   Exited (0) About a minute ago             strange_varahamihira

$ sudo docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
...
dam_m02_v0               latest    9873176a8ff5   5 weeks ago     72.7MB

per tal de què funcioni:

$ sudo docker run -t -i -d dam_m02_v0 /bin/bash

$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
6cc8158ec1c7   dam_m02_v0   "/bin/bash"   22 seconds ago   Up 20 seconds             charming_wescoff

Per apagar-lo:

$ sudo docker kill 6cc8158ec1c7

De fet per apagar-lo millor fer stop:

$ sudo docker stop 6cc8158ec1c7

Però així no l'eliminem. Per eliminar-lo:

$ sudo docker rm 6cc8158ec1c7
$ sudo docker run -dit -d dam_m02_v0 /bin/bash

docker exec -it dam_m02_v0 bash
docker exec -t -i dam_m02_v0 /bin/bash

Per entrar dins del docker:

$ sudo docker exec -t -i 8c7535c45e10 /bin/bash
root@8c7535c45e10:/#

i per sortir:

root@8c7535c45e10:/# exit
$

I ara l'esborrem:

sudo docker image rm 30287d899656

La manera d'esborrar un repositori localment:

$ docker rmi dam_m02_v0:latest (on latest és el TAG)
Untagged: dam_m02_v0:latest

En el fitxer Dockerfile senzillament tenia 'FROM ubuntu'. Ara puc fer coses més complicades.

Fer córrer aplicacions GUI

Xclock.png
$ docker build -t gui -f ./Dockerfile3 .
...
Successfully built 63a55a09c233
Successfully tagged gui:latest

run the container:

$ docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -h $HOSTNAME -v $HOME/.Xauthority:/home/joan/.Xauthority gui

i efectivament, se m'obre el Mozilla Firefox (i el xclock en l'altra prova que he fet).

$ docker image ls
REPOSITORY               TAG       IMAGE ID       CREATED              SIZE
gui                      latest    63a55a09c233   About a minute ago   464MB

script Dockerfile3:

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y firefox
#RUN apt-get install -y x11-apps
RUN groupadd -g 1000 joan
RUN useradd -d /home/joan -s /bin/bash -m joan -u 1000 -g 1000
USER joan
ENV HOME /home/joan
CMD /usr/bin/firefox
#CMD /usr/bin/xclock

Networking with standalone containers

He seguit el tutorial, i funciona correctament, és aclaridor.

Fan servir la imatge de alpine. Què és alpine?: A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!

És a dir, que va bé per fer proves.


creat per Joan Quintana Compte, juny 2021, agost 2021