O Docker um motor de cdigo aberto que automatiza a
implementao de qualquer aplicao encapsulando-a num contentor porttil, auto-suficiente e leve, que ser executado em praticamente qualquer ambiente de O/S e infra-estruturas de Clouds pblicas e privadas. O Docker, atualmente usa o sistema de LinuX Containers (LXC), os quais so 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 automticamente gere as configuraes 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 prprio recipiente de montagem para a escrita. Ento, digamos que voc tem uma imagem de recipiente que de 1GB de tamanho. Se, ao contrrio quiser usar uma mquina virtual completa, iria precisa ter 1GB vezes x nmero 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 espao para o sistema operativo dos recipientes (containers), assumindo todos eles so a imagem do mesmo sistema operativo em execuo. Um sistema virtualizado completo recebe o seu prprio conjunto de recursos que lhe so atribudos, e faz a partilha mnima. Ganha em mais isolamento, mas muito mais pesado (requer muito mais recursos). Com LXC pode ter menos isolamento, mas como os containers so 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 no falar no Hyper-V?!! Se no tiver ao seu dispor um servidor altamente potente e caro, tal no ir ser possvel. LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 1 Um sistema virtualizado completo geralmente leva alguns minutos para comear, enquanto os recipientes LXC levam apenas alguns segundos, e s vezes at menos de umsegundo. H prs 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, fsico ou virtual, com um tamanho razovel, ento 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 apresentao aqui. (Para mais informaes sobre o Docker consultar aqui. Passando parte mais prtica ! Vamos construir um contentor com o Docker, que armazenar um servidor web e aplicao OwnCloud (soluo 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 porttil e criado automticamente atravs da execuo de um script ou Dockerfile. Vamos a isso !!? Partindo do pressuposto de que dispe de um host, fisico ou virtual em Linux / Unix, o primeiro passo ser a instalao do executivo Docker.io. As instrues para esta instalao podem ser encontradas na home page do Docker. Aqui vamos assumir que dispomos de um host virtual de base Debian ou Ubuntu, para facilitar o exemplo. 1. Instalao do Docker (Ubuntu 13.04) - Para outras verses 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 Preparar repositrio do docker e instalar : LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 2 # 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 (instalao completa - fcil no!? ) 2. Criao de um container com o owncloud e respectiva configurao # 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 wget http://download.opensuse.org/reposit...04/Release.key RUN apt-key add - < Release.key LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 3 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 wget http://ftp.us.debian.org/debian/pool....1-1_amd64.deb 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 LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 4 #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"] # LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 5 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 # http://stackoverflow.com/questions/2...g-kexinit-sent 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 # http://stackoverflow.com/questions/1...sshd-on-docker 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 LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 6 # 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= emailAddress=demo@yourcompany.com " 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 LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 7 # 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 # LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 8 #/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 <Directory /var/www/owncloud> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <VirtualHost *:443> DocumentRoot /var/www/owncloud <Directory /var/www/owncloud/> Options Indexes FollowSymLinks MultiViews AllowOverride All LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 9 Order allow,deny allow from all </Directory> SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key </VirtualHost> # 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 criao do Container que ir albergar o OwnCloud # cd OwnCloud # docker build -t Demo/OwnCloud6s . LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 10 Aps terminar a execuo 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 execuo atravs do comando: # docker ps Pode remover parar ou iniciar um container: # docker start id-container LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 11 #docker stop id_container Ou remover um container: # docker rmi id-container Aps instalado e running o container do Owncloud, bastar que no seu Browser use o url no formato que se segue: https://your-ipaddress:446 Agora s criar um novo utilizador com mysql e no esquea que o user da base de dados owncloud tal como a password. E boa sorte ! LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 12 Francisco Gonalves IT Architect & Open-Source Solutions Advisor LXC Linux Containers - O Docker vai mesmo mudar tudo na sua infra-estrutura de TI ! 13