Containers amb Linux

6 març 2019
Josep Ma Solanes 0

Si bé fa temps vaig escriure una entrada sobre els containers en les versions primerenques de Windows Server 2016, que cal revisar degut als canvis produïts, en aquesta entrada fem el salt als containers amb Linux.

L’objectiu d’aquesta entrada és posar en pràctica els conceptes dels containers amb Linux desplegant un entorn de blocs de WordPress pel que disposarem de:

  • Un servidor de bases de dades MariaDB on allotjar les bases de dades dels blocs WordPress.
  • A la vegada aquest servidor farà de servidor de containers amb Linux. Instal·lant la versió de la comunitat de Dockers.
  • També farà de servidor de directoris persistents als containers, concretament pel directori de configuració de sites i pels propis sites. I al que s’hi pugui arribar des de la xarxa amb el protocol CIFS per poder modificar els fitxers dels llocs web. Al modificar aquests fitxers, els containers que ofereixen el servei s’han d’actualitzar automàticament.
  • Tenir un container amb Linux, basat amb Ubuntu Server, amb l’Apache corrent que servirà d’imatge per desplegar els diferents llocs web.
  • Container amb Linux per a cada lloc web. Dos en concret.

I tot això des d’un Microsoft Windows 10. Comencem.

El primer que necessitem és tenir un sistema operatiu Linux corrent. Per aquesta entrada he optat per la instal·lació de Ubuntu Server 1810 en una màquina virtual que podeu trobar en aquest enllaç.

Amb el sistema operatiu Ubuntu Server en funcionament podeu continuar amb:

Instal·lació de l’entorn de containers amb Linux amb Docker

Arribats a aquest punt, despleguem l’entorn de containers amb Linux en el servidor Ubuntu Server que hem preparat. Preparem el mateix per incorporar el repositori de Docker:

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

Afegir la clau del repositori de Docker:

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Comprovar que s’ha donat d’alta la clau de Docker al repositori:

sudo apt-key fingerprint 0EBFCD88

Afegir el repositori estable de Docker a la base de dades de catàlegs:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Actualitzar la llista del repositori i procedir amb la instal·lació dels paquets de Docker de l’edició de la comunitat:

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

Comprovar que s’ha creat una nova xarxa “virtual” amb identificador 172.17.0.0/16. Cal tenir-ho en compte per obrir el tallafocs cap al servidor de MariaDB i servidor de fitxers NFS pels containers que hi hagin d’accedir.

ifconfig

Provar que l’entorn de containers funciona executant, el com no, Hola món!:

sudo docker run hello-world

Per no haver d’elevar sempre els privilegis per les operacions amb Docker, afegir l’usuari amb què es treballi al grup de seguretat Docker. Recordar que cal tancar la sessió per aplicar els canvis:

usermod -G docker operador

Comprovar les imatges Docker que tenim disponibles sobre el servidor de containers amb Linux:

docker images

Operacions bàsiques dels containers amb Linux

Carregar la imatge de Ubuntu com a container. Primer la cerquem al repositori. Això es pot fer via navegador a l’adreça https://hub.docker.com o bé des de la consola de comandes amb:

docker search ubuntu

Identificar la què ens interessa, en el meu cas, la última versió oficial. Procedeixo a descarregar-la:

docker pull ubuntu:latest

Tornar a comprovar que ja tenim la imatge de container Ubuntu disponible:

docker images

Per visualitzar els containers amb Linux creats i el seu estat, utilitzar la comanda:

docker ps -a

Tot i què actualment no hi ha cap container creat. El llistat surt en blanc.

Procedir a la creació d’un dels primers containers amb Linux (anomenat primer_container) executant la següent comanda de forma interactiva:

docker run --name primer_container -it ubuntu:latest

Se’ns retorna un nou símbol de comandes. Ara mateix estem dins un container!

Per sortir de l’entorn de comandes del container, escriure:

exit

Podem comprovar els containers amb Linux que tenim creats i si estan en execució amb la comanda:

docker ps -a

A l’haver sortit del símbol de comandes del container, es pot veure per la columna de STATUS que tots els containers estan aturats.

Per tornar a engegar el container, però sense accedir a ell, s’utilitza la comanda, canviant el nom containerid per l’identificador o nom del container:

docker start containerid

Si ho proveu amb el container acabat de crear, a l’executar la comanda de comprovació de containers, podeu veure com el container s’està executant. Això sí, sense cap símbol de comandes, perquè no hem entrat al seu entorn:

docker ps -a

Per accedir dins l’entorn d’execució del container, s’utilitza la comanda exec, indicant la forma per poder actuar de forma interactiva amb el container (-it) i executant un símbol de comandes (/bin/bash):

docker exec -it containerid /bin/bash

Es pot aprofitar per actualitzar els paquets del sistema operatiu Ubuntu Server i sortir del container:

apt-get update
apt-get upgrade
exit

Tenim el container actualitzat, però recordo que els containers són efímers, quan es destrueixi o es vulgui crear un nou container a partir de la imatge de Ubuntu, aquest no estarà actualitzat. Per tant, com creem una nova imatge de Ubuntu Server actualitzat?

Aturem el container per crear una imatge del mateix:

docker stop containerid

Creem una nova imatge del container indicant el containerid i el nom que se li vol donar a la imatge, seguit de la versió. Per exemple, ubuntu:20190316

docker commit containerid ubuntu:20190316

Si llistem les imatges de containers es visualitza la nova imatge:

Tornar a desplegar un nou container amb el sistema operatiu actualitzat és tant senzill com:

docker run --name segon_container ubuntu:20190316

Ja no ens interessa un container concret que s’ha creat i el vull destruir:

docker rm containerid

I si també vull destruir la pròpia imatge, sempre que no hi hagi una dependència de containers:

docker rmi nom_imatge_container

Es pot obtenir la informació de configuració del propi container amb la comanda:

docker inspect containerid

Per copiar fitxers cap a dinsdel container de forma local tenim la comanda:

docker cp origen containerid:/desti

Per altra banda, per copiar fitxers des del container cap a fora utilitzem:

docker cp containerid:/origen /desti

Connexió de xarxa en els containers amb Linux

Tenim containers amb Linux creats i executant-se de forma local, però l’objectiu és que aquests containers es comuniquin amb altres o puguem comunicar-nos-hi nosaltres des de la xarxa.

Per fer-ho, el primer que hem d’esbrinar són les connexions de xarxa que l’amfitrió de containers té disponible per aquests. Executar la comanda:

docker network list

En la foto anterior podem veure tres identificadors de xarxa amb tres controladors (drivers) de diferents funcions:

  • bridge. Proporciona un entorn de xarxa tipus NAT cap a la xarxa externa. No hi ha problema de conflictes de IP perquè s’emmascara per la IP pública de l’amfitrió de containers. La xarxa que es crea aquí, normalment, acostuma a ser del tipus 172.17.0.0./16. Per tant, en cada amfitrió caben molts containers.
  • host. Només per la comunicació amb l’amfitrió de containers, no té accés a la xarxa externa.
  • none. Més clar impossible, simplement no hi ha comunicacions externes.

Com a resum, el més habitual serà utilitzar el bridge per emmascarar els ports locals de l’equip amfitrió amb els diferents containers. Ull que això vol dir que no es poden duplicar ports en la mateixa IP. No puc tenir dos ports local TCP 80 a dos containers diferents, per exemple.

Però com associem el port TCP 4022, per exemple, de l’equip local amb el port 22 del container? Amb el paràmetre -p port_amfitrió:port_container al crear el propi container:

docker create --name containerid -it --network bridge -p 4022:22 ubuntu:20190316 

A l’engegar el container, i si visualitzem l’estat d’execució, es veu l’enllaç d’aquests ports.

Ep! abans que proveu la connexió anterior sapigueu que us donarà un error. Per què? Doncs perquè el container d’Ubuntu no disposa del servidor de SSH per defecte. El podeu habilitar accedint dins el container:

docker exec -it containerid /bin/bash

Dins el container, instal·lar el servidor SSH i l’editor VI o NANO per poder modificar fitxers:

apt-get install openssh-server vim

Per engegar el servei de SSH. Que caldrà fer-ho sempre que engeguem el container, ja què no existeix el Systemctl per iniciar automàticament serveis. Si es volgués arrancar sempre per defecte cal crear un container específic indicant que s’iniciï de forma automàtica aquesta aplicació:

service ssh start

Per la connexió externa amb usuari root, editar el fitxer /etc/ssh/sshd_config afegint la següent línia:

PermitRootLogin yes

Reiniciar el servei de SSH per aplicar els canvis.

service ssh restart

Per major seguretat, també es pot crear un usuari addicional al root i, amb l’entorn sudo, executar els permisos elevats o accedir a l’usuari root (havent canviat la seva contrasenya per una de coneguda per nosaltres):

apt-get install sudo
adduser operador sudo
passwd root

Sempre hi quan tingueu el tallafocs de l’amfitrió que permeti les connexions de xarxa, ja es pot accedir des de fora de l’entorn de containers.


T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author: