O Docker é um motor de código aberto que automatiza a implementação de qualquer aplicação encapsulando-a num contentor portátil, auto-suficiente e leve, que será executado em praticamente qualquer ambiente de O/S e infra-estruturas de Clouds públicas e privadas.
O Docker, atualmente usa o sistema de LinuX Containers (LXC), os quais são executados no mesmo sistema operativo em que reside o Docker. Isso permite que este partilhe os recursos do sistema operativo base em que reside. Usa o sistema de ficheiros AuFS e automáticamente gere as configurações de rede nos respectivos containers.
O AuFS é um sistema de ficheiros dispostos em camadas. Desta forma poderá ter uma única parte só de leitura e outra
de escrita, ou mesclar os dois modos. Assim, pode ter as partes comuns do sistema operativo como somente de leitura tal como os dados que necessitam ser partilhados entre todos os seus recipientes, e, de seguida, dar a cada um o seu próprio recipiente de montagem para a escrita.
Então, digamos que você tem uma imagem de recipiente que é de 1GB de tamanho. Se, ao contrário quiser usar uma máquina virtual completa, iria precisa ter 1GB vezes x número de VMs que você deseja. Com LXC e AuFS pode partilhar a maior parte do 1GB e se tem por exemplo 1000 contentores, ainda pode ter apenas um pouco mais de 1 GB de espaço para o sistema operativo dos recipientes (containers), assumindo todos eles são a imagem do mesmo sistema operativo em execução.
Um sistema virtualizado completo recebe o seu próprio conjunto de recursos que lhe são atribuídos, e faz a partilha mínima. Ganha em mais isolamento, mas é muito mais pesado (requer muito mais recursos).
Com LXC pode ter menos isolamento, mas como os containers são mais leves e exigem menos recursos, pode-se facilmente executar 1000 recipientes /contentores num único host, e num piscar de olhos, como veremos a seguir. Tente fazer isso com Xen, para não falar no Hyper-V?!! Se não tiver ao seu dispor um servidor altamente potente e caro, tal não irá ser possível.
Um sistema virtualizado completo geralmente leva alguns minutos para começar, enquanto os recipientes LXC levam apenas alguns segundos, e às vezes até menos de um
segundo.
Há prós e contras de cada tipo de sistema virtualizado. Se quer isolamento total com recursos garantidos, em seguida, uma VM integral é a escolha perfeita. Mas se quiser apenas para isolar processos entre si e deseja executar uma tonelada deles e num único host, físico ou virtual, com um tamanho razoável, então os Linux Containers ( LXC ) pode ser o caminho certo e algo que está a ser adoptado a uma velocidade enorme pela Google, Amazon AWS, PayPal, FaceBook, Azure, e por aí fora.. (do original). Ou assista a uma apresentação aqui.
(Para mais informações sobre o Docker consultar aqui.
Passando à parte mais prática !
Vamos construir um contentor com o Docker, que armazenará um servidor web e aplicação OwnCloud (solução open-source para a cloud privada, similar ao Dropbox) e com suporte de base de dados MySql. E pronto a executar! Tudo num único contentor portátil e criado automáticamente através da execução de um script ou Dockerfile. Vamos a isso !!?
Partindo do pressuposto de que dispõe de um host, fisico ou virtual em Linux / Unix, o primeiro passo será a instalação do executivo Docker.io.
Aqui vamos assumir que dispomos de um host virtual de base Debian ou Ubuntu, para facilitar o exemplo.
1. Instalação do Docker (Ubuntu 13.04) - Para outras versões de Ubuntu consultar em Docker!
# install the backported kernel
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
# reboot
sudo reboot
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
# reboot
sudo reboot
Preparar repositório do docker e instalar :
# sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
# sudo apt-get update
# sudo apt-get install lxc-docker
> /etc/apt/sources.list.d/docker.list"
# sudo apt-get update
# sudo apt-get install lxc-docker
(instalação completa - fácil não!? )
2. Criação de um container com o owncloud e respectiva configuração
# mkdir OwnCloud
# cd OwnCloud
# mkdir resources
# mkdir mysqldata
# vi Dockerfile
FROM ubuntu:quantal
#
MAINTAINER Francisco Goncalves@SofteLabs,inc "fgoncalves@softelabs.com"
#
#RUN echo "deb http://archive.ubuntu.com/ubuntu raring main universe" >> /etc/apt/sources.list
RUN echo 'deb http://download.opensuse.org/reposit...xUbuntu_13.04/ /' >> /etc/apt/sources.list.d/owncloud.list
#
RUN sudo apt-get install -y wget
RUN apt-key add - < Release.key
RUN apt-get -y update
#
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl
RUN locale-gen pt_PT pt_PT.UTF-8
RUN dpkg-reconfigure locales
#
RUN apt-get install -y owncloud owncloud-client smbclient curl libcurl3 php5-mysql php5-curl bzip2 wget vim openssl ssl-cert openssh-server openssh-client
RUN echo "mysql-server-5.5 mysql-server/root_password password donuts" | debconf-set-selections
RUN echo "mysql-server-5.5 mysql-server/root_password_again password donuts" | debconf-set-selections
RUN echo "mysql-server-5.5 mysql-server/root_password seen true" | debconf-set-selections
RUN echo "mysql-server-5.5 mysql-server/root_password_again seen true" | debconf-set-selections
RUN apt-get -y install mysql-server
#
RUN dpkg -i sharutils_4.11.1-1_amd64.deb
ADD resources/cfgmysql.sh /tmp/cfgmysql.sh
RUN chmod +x /tmp/cfgmysql.sh
RUN /tmp/cfgmysql.sh
#ADD resources/sshd_config1 /etc/ssh/sshd_config
#ADD resources/authorized_keys /root/.ssh/authorized_keys
#
ADD resources/001-owncloud.conf /etc/apache2/sites-available/
ADD resources/start.sh /start.sh
RUN chmod +x /start.sh
RUN /start.sh
#
ADD resources/passuser.txt /opt/passuser.txt
#RUN useradd demo
#RUN passwd demo < /opt/passuser.txt
RUN passwd root < /opt/passuser.txt
#
ADD resources/startup.sh /opt/startup.sh
RUN chmod +x /opt/startup.sh
EXPOSE 3306
EXPOSE 22
EXPOSE 443
#CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
CMD ["/bin/bash", "/opt/startup.sh"]
#
|
Criar os seguintes scripts invocados pelo Dockerfile acima :
# cd resources
#
# vi start.sh
#!/bin/bash
#
# Prepare ssh server
#
#mkdir -p /var/run/sshd ; chmod -rx /var/run/sshd
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# Bad security, add a user and sudo instead!
sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
#sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
service ssh restart
#
# Set apoache2 with SSL KEY
#
mkdir /etc/apache2/ssl
#
chown -R www-data:www-data /var/www/owncloud
ln -s /etc/apache2/sites-available/001-owncloud.conf /etc/apache2/sites-enabled/
a2ensite 001-owncloud.conf
a2enmod rewrite ssl
2enmod ssl
#
#
ulimit -n 826214 826214
#
if [ ! -f /etc/apache2/ssl/server.key ]; then
mkdir -p /etc/apache2/ssl
KEY=/etc/apache2/ssl/server.key
DOMAIN=$(hostname)
export PASSPHRASE=$(head -c 128 /dev/urandom | uuencode - | grep -v "^end" | tr "\n" "d")
SUBJ="
C=PT
ST=Portugal
O=eLabs
localityName=Lisbon
commonName=$DOMAIN
organizationalUnitName=
"
openssl genrsa -des3 -out /etc/apache2/ssl/server.key -passout env:PASSPHRASE 2048
openssl req -new -batch -subj "$(echo -n "$SUBJ" | tr "\n" "/")" -key $KEY -out /tmp/$DOMAIN.csr -passin env:PASSPHRASE
cp $KEY $KEY.orig
openssl rsa -in $KEY.orig -out $KEY -passin env:PASSPHRASE
openssl x509 -req -days 365 -in /tmp/$DOMAIN.csr -signkey $KEY -out /etc/apache2/ssl/server.crt
fi
HOSTLINE=$(echo $(ip -f inet addr show eth0 | grep 'inet' | awk '{ print $2 }' | cut -d/ -f1) $(hostname) $(hostname -s))
#echo $HOSTLINE >> /etc/hosts
#
|
# vi startup.sh
#
#!/bin/bash
#
if [ ! -f /var/lib/mysql/ibdata1 ]; then
mysql_install_db
/usr/bin/mysqld_safe &
sleep 10s
# echo "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('owncloud');" | mysql -uroot -pdonuts
echo "create database owncloud;" | mysql
sleep 5s
echo "CREATE USER 'admin'@'localhost' IDENTIFIED BY 'donuts';" | mysql
sleep 5s
echo "GRANT ALL ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;" | mysql
sleep 5s
echo "GRANT ALL ON *.* TO 'admin'@'%' IDENTIFIED BY 'donuts' WITH GRANT OPTION;" | mysql
sleep 5s
echo "CREATE USER 'owncloud'@'localhost' IDENTIFIED BY 'owncloud'" | mysql
sleep 5s
echo "SET PASSWORD FOR 'owncloud'@'localhost' = PASSWORD('owncloud');" | mysql
sleep 5s
echo "GRANT ALL ON *.* TO 'owncloud'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql
killall mysqld
sleep 5s
echo "Initial MySql (OutSide the Container) Setup & OwnCloud Db creation Sucessfull"
fi
/usr/bin/mysqld_safe &
echo "MySql is up and running "
#
service ssh restart
#
#/usr/sbin/sshd -D
#
echo "ssh started ok.."
#
ping -c5 localhost
#
ulimit -n 826214 826214
#
/usr/sbin/apache2ctl -D FOREGROUND
#
echo "Apache2 Up and running "
echo " "
#
echo "Linux Docker Container is up and running "
#
|
# vi 001-owncloud.conf
ServerName localhost
ServerAdmin webmaster@localhost
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
|
DocumentRoot /var/www/owncloud
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
# vi cfgmysql.sh
#!/bin/bash
sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
#
/usr/bin/mysqld_safe &
sleep 5s
#mysqadmin shutdown -u root -pdonuts
#
|
# vi passuser.txt
( modificar a password da root para este container )
password
password
|
Agora a criação do Container que irá albergar o OwnCloud…
# cd OwnCloud
# docker build -t Demo/OwnCloud6s .
Após terminar a execução deste script contido no Dockerfile que acima editou deverá ter sido criado um container.
Para visualizar a imagem do container agora criado use o comando:
# docker images
Para “correr” o container e disponibilizar o Woncloud, usar o comando que se descreve e (talvez!) criando um script conforme se segue :
dockid=$(docker run -d -p 446:443 -p 3400:3306 -p 100:22 -privileged -v /Docker/owncloud6r-mysql-docker/mysqldata:/var/lib/mysql -h "owncloud6r.softelabs.com" Demo/OwnCloud6s /opt/startup.sh)
#
echo "Instance id = $dockid "
sleep 60
#
docker logs $dockid
#
docker ps
|
Pode ver todos os containers em execução através do comando:
# docker ps
Pode remover parar ou iniciar um container:
# docker start id-container
#docker stop id_container
Ou remover um container:
# docker rmi id-container
Após instalado e “running” o container do Owncloud, bastará que no seu Browser use o url no formato que se segue:
Agora é só criar um novo utilizador com mysql e não esqueça que o user da base de dados é owncloud tal como a password.
E boa sorte !
IT Architect & Open-Source Solutions Advisor
Comentários