En el servidor dockerhost descrito anteriormente vamos a crear nuestras imágenes propias de Centos 7 para Docker.
Imagen base de CentOS 7
Primero definimos un directorio para la instalación de CentOS 7.
mkdir -p ~/Docker_Images/CentOS7
export centos_root=~/Docker_Images/CentOS7
cd ~/Docker_Images
Luego inicializamos la base de datos rpm.
rpm --root $centos_root --initdb
Descargamos e instalamos el paquete centos-release.
sudo yum reinstall --downloadonly --downloaddir . centos-release
sudo rpm --root $centos_root -ivh centos-release*.rpm
sudo rpm --root $centos_root --import $centos_root/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Instalamos yum sin documentación y sólo en inglés.
sudo yum -y --installroot=$centos_root --setopt=tsflags='nodocs' --setopt=override_install_langs=en_US.utf8 install yum
Modificamos la configuración de yum para evitar la instalación de documentación y archivos en otro idioma que no sea inglés.
sudo sed -i "/distroverpkg=centos-release/a override_install_langs=en_US.utf8\ntsflags=nodocs" $centos_root/etc/yum.conf
Creamos un entorno "enjaulado" con chroot y procedemos a instalar algunos paquetes útiles.
sudo cp /etc/resolv.conf $centos_root/etc
sudo chroot $centos_root /bin/bash <<EOF
yum install -y procps-ng iputils net-tools vim lsof wget git initscripts passwd
yum clean all
EOF
sudo rm -f $centos_root/etc/resolv.conf
Cambiamos la contraseña del usuario root.
sudo chroot $centos_root /bin/bash
En el entorno chroot (bash-4.2# indica que nos encontramos dentro del entorno enjaulado) ejecutamos el comando passwd
bash-4.2# passwd
bash-4.2# exit
Imagen base de CentOS 7 para Docker
Creamos ahora la imagen base de CentOS 7 para Docker. Todos los comandos serán ejecutados con los privilegios del usuario root, por eso vamos a omitir el sudo en cada línea.
export centos_root=/home/dockero/Docker_Images/CentOS7
tar -C $centos_root -c . | docker import - dockero/centos7
Comprobamos la creación de la imagen.
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockero/centos7 latest 3e4dba68901g 11 seconds ago 267.3 MB
Podemos ahora inicializar la imagen "dockero/centos7".
docker run -t -i dockero/centos7 /bin/bash
En el contenedor (bash-4.2# indica que nos encontramos dentro del contenedor) ejecutemos el comando cat /etc/centos-release
bash-4.2# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
Abrimos ahora otra terminal en el servidor dockerhost y ejecutamos el comando docker ps para ver lo que hemos creado.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
g588a5f01f63 dockero/centos7 "/bin/bash" 9 minutes ago Up 9 minutes clever_golick
Exportemos el contenedor ("clever_golick" es el nombre aleatorio asignado por Docker al contenedor).
docker export --output=centos7base-container.tar clever_golick
En la terminal del contenedor ejecutamos el comando exit para salir.
bash-4.2# exit
Finalmente, podemos eliminar el contenedor inactivo.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
g588a5f01f63 dockero/centos7 "/bin/bash" 35 minutes ago Exited (0) 42 seconds ago clever_golick
Con el comando docker rm eliminamos el contenedor.
docker rm clever_golick
Subir la imagen a un registro de Docker
Podemos subir la imagen a un registro de Docker para compartirla con nuestro equipo. En este ejemplo usamos el registro de Docker en GitLab.
Primero necesitamos saber la identificación de la imagen (Image ID).
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockero/centos7 latest 3e4dba68901g 35 minutes ago 267.3 MB
Ahora tenemos que etiquetar la imagen para especificar el destino del registro de Docker en GitLab.
docker tag 3e4dba68901g registry.gitlab.com/<namespace>/<project>/centos7
Finalmente iniciamos una sesión en GitLab y subimos la imagen.
docker login registry.gitlab.com
docker push registry.gitlab.com/<namespace>/<project>/centos7
Image propia de MySQL para Docker
Vamos a crear una imagen propia de MySQL usando la imagen base de CentOS7. Todos los comandos serán ejecutados con los privilegios del usuario root, por eso vamos a omitir el sudo en cada línea.
docker run -t -i --cap-add=SYS_ADMIN -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup --name mysql-container dockero/centos7:latest /usr/sbin/init
Veremos al final unas líneas similares a las que se muestran abajo.
CentOS Linux 7 (Core)
Kernel 3.10.0-693.11.6.el7.x86_64 on an x86_64
541r8gf47d43 login:
Podemos iniciar nuestra sesión usando la contraseña del usuario root que ya hemos definido anteriormente en la imagen de Centos7. En los siguientes comandos, "bash-4.2#" indica que nos encontramos dentro del contenedor.
bash-4.2# yum update
bash-4.2# yum install mariadb-server
bash-4.2# systemctl enable mariadb.service
bash-4.2# systemctl start mariadb.service
bash-4.2# mysql_secure_installation
bash-4.2# yum clean all
Con la contraseña del usuario root de MySQL ejecutamos los siguientes comandos.
bash-4.2# mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION;
Necesitamos ahora crear un servicio que realize operaciones (init script) en la base de datos cada vez que la imagen de MySQL sea inicializada.
bash-4.2# touch /etc/systemd/system/docker-entrypoint-initdb.service
bash-4.2# chmod 644 /etc/systemd/system/docker-entrypoint-initdb.service
bash-4.2# touch /opt/docker-entrypoint-initdb.sh
bash-4.2# chmod 744 /opt/docker-entrypoint-initdb.sh
Contenido del archivo: /etc/systemd/system/docker-entrypoint-initdb.service
[Unit]
After=mariadb.service
[Service]
ExecStart=/opt/docker-entrypoint-initdb.sh
[Install]
WantedBy=default.target
Contenido del archivo: /opt/docker-entrypoint-initdb.sh
#!/bin/bash
for sqlfile in /docker-entrypoint-initdb.d/*.sql
do
mysql -uroot -pMySQLrooPassword -hlocalhost < $sqlfile
done
Ahora sólo falta activar el nuevo servicio.
bash-4.2# systemctl daemon-reload
bash-4.2# systemctl enable docker-entrypoint-initdb.service
Exportemos el contenedor "mysql-container".
docker export --output=centos7mysql-container.tar mysql-container
FInalmente creamos una nueva imagen de MySQL para Docker.
bash-4.2# poweroff
docker commit -a "Dockero" -m "Imagen propia de MySQL" mysql-container dockero/centos7mysql
docker rm mysql-container
Y subimos la imagen nueva a GitLab.
docker images | grep centos7mysql
docker tag 6ed78a6380p8 registry.gitlab.com/<namespace>/<project>/centos7mysql
docker login registry.gitlab.com
docker push registry.gitlab.com/<namespace>/<project>/centos7mysql
Image propia de Apache para Docker
En esta última sección vamos a crear una imagen propia de Apache. Todos los comandos serán ejecutados con los privilegios del usuario root, por eso vamos a omitir el sudo en cada línea.
docker run -t -i -p 80:80 --cap-add=SYS_ADMIN -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup --name apache-container dockero/centos7:latest /usr/sbin/init
Iniciamos una sesión y ejecutamos los siguientes comandos (bash-4.2# indica que nos encontramos dentro del contenedor).
bash-4.2# yum update
bash-4.2# yum install httpd php php-pear php-mysql php-gd
bash-4.2# yum install epel-release
bash-4.2# yum install phpmyadmin
bash-4.2# yum clean all
bash-4.2# mv /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.disabled
Extracto del archivo: /etc/php.ini
error_reporting = E_ALL
display_errors = On
Continuamos ejecutando los siguientes comandos.
bash-4.2# systemctl enable httpd.service
bash-4.2# cd /var/www/html/
bash-4.2# ln -s /usr/share/phpMyAdmin phpmyadmin
bash-4.2# systemctl start httpd.service
En un navegador como Firefox probamos el funcionamiento del servicio de Apache. En este ejemplo, la dirección IP del servidor dockerhost es 192.168.56.110.
http://192.168.56.110/
http://192.168.56.110/phpmyadmin/
Podemos copiar directo los archivos de configuración de Apache y phpMyAdmin del contenedor al servidor dockerhost (PID es el número del proceso Apache en dockerhost).
cp /proc/<PID>/root/etc/httpd/conf/httpd.conf .
cp /proc/<PID>/root/etc/phpMyAdmin/config.inc.php .
Exportemos el contenedor "apache-container".
docker export --output=centos7apache-container.tar apache-container
FInalmente creamos una nueva imagen de Apache para Docker y la subimos a GitLab.
bash-4.2# poweroff
docker commit -a "Dockero" -m "Apache base image" apache-container dockero/centos7apache
docker rm apache-container
docker images | grep centos7apache
docker tag 2ds64g2915d4 registry.gitlab.com/<namespace>/<project>/centos7apache
docker login registry.gitlab.com
docker push registry.gitlab.com/<namespace>/<project>/centos7apache