Nesse post, vou abordar a instalação do GitLab 15.0 em um Ubuntu Server 20.04.4 LTS / Focal Fossa. Também instalarei o gitlab-runner localmente e também em container. Além da instalação, farei o cadastro dos dois Runners.

Inicialmente, vamos instalar algum pacotes necessários:

apt install -y curl openssh-server ca-certificates tzdata perl

Em seguida, vamos adicionar o repositório oficial da versão community do GitLab.

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Agora com o repositório oficial já na lista dos repositórios que o nosso gerenciador de pacotes irá verificar, basta instalar o gitlab usando apt

apt install gitlab-ce -y

Ao concluir a instalação, vamos configurar a URL que servirá de acesso ao Gitlab. No nosso caso, não estamos utilizando nenhuma entrada de DNS ou domínio, portanto vamos apontar o IP do servidor mesmo. Nesse caso, é o IP interno 192.168.0.115. Esse procedimento não é recomendável para produção, que deve ser utilizado inclusive com certificado válido.

Para fazer a configuração, vamos editar o arquivo /etc/gitlab/gitlab.rb. Esse arquivo será lido no momento de configuração do gitlab.

vim /etc/gitlab/gitlab.rb

Agora, vamos procurar a linha que contém “external_url” e vamos colocar nosso ip:

Para iniciar o modo de edição do vim, basta apertar a tecla “i”. Ao concluir, basta apertar “Esc” e depois para sair do vim, basta digitar :wq!

Agora, vamos iniciar a configuração do gitlab usando o binário gitlab-ctl:

gitlab-ctl reconfigure

Ao concluir a configuração, o gitlab informará que a senha inicial do usuário root está em um arquivo chamado initial_root_password. Portanto, vamos exibir esse arquivo para visualizarmos a senha.

cat /etc/gitlab/initial_root_password

A senha será exibida na tela. Vamos copiá-la para o acesso inicial ao gitlab. Esse acesso inicial se dará pelo navegador e com o endereço informado anteriormente. Nesse caso, vou usar o Firefox para acessar o ip 192.168.0.115.

1 – No campo Username or email vamos colocar o usuário root

2 – No campo Password, vamos colocar a senha que copiamos anteriormente.

Depois basta clicar em Sign In.

 

Para modificar a senha do root, clique no lado direito superior e depois em Preferences.

 

No menu esquerdo, clique em Password.

 

1 – Inserir a senha atual em Current Password que foi copiada do arquivo initial_root_password

2 – Inserir uma senha nova em New password / Password confirmation.

Depois basta clicar em Save password para confirmar a senha. Ao clicar, você será redirecionado para a página inicial onde deve entrar novamente com o usuário root e a nova senha.

 

Instalação e Registro dos Runners (Shell e Docker)

Vamos fazer a instalação de depois Runners: um localmente e outro utilizando Docker.

Assim como o Gitlab, vamos fazer a configuração do repositório oficial do Runners.

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash

Agora, vamos instalar o gitlab-runner

apt install gitlab-runner -y

Após a instalação, vamos registrar o primeiro Runner. Para fazer o registro, vamos precisar do token. Esse token pode ser acessado em Admin que fica no Menu da esquerda.

Após o acesso da área Admin, vamos em Runners, ainda do lado esquerdo.

Já em Runners, no lado direito, clique em Register an instance runner e logo em seguida, vamos clicar no segundo símbolo para fazer a cópia do token.

Agora com o Token copiado, vamos voltar ao terminal e registrar o Runner que já foi instalado.

Abaixo o comando que deve ser inserido no terminal para fazer o registro do Runner.

É necessária a substituição das opções url (colocar a URL que está acessando o Gitlab), registration-token (colar o token que foi copiado anteriormente).

gitlab-runner register -n --url http://192.168.0.115 --registration-token se8sztuB1o1ewFbXHVav --executor shell --description "Runner Shell"

Ao acessar novamente os Runners no Gitlab, verá que o Runner foi registrado como Shell e com o descrição Runner Shell.

Em seguida, vamos subir um Runner usando Docker e depois fazer o registro desse Runner que estará rodando em container.

Caso não tenha o Docker instalado, seguem os comandos para a instalação. Não será abordado os detalhes aqui, pois o foco é a instalação e configuração do GitLab.

apt remove -y docker docker-engine docker.io containerd runc
apt update -y
apt install ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update -y
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Primeiramente, vamos executar o container do gitlab-runner:

Executando o Runner em Docker
docker run -dit \
--name runner-docker \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest

Agora com o Runner já sendo executado em container, vamos fazer o registro desse Runner. A ideia de registro é a mesma do Runner que está rodando localmente, porém precisamos fazer isso para o container, por tanto será necessário os ajustes da URL e Token assim como feito no anterior. Não é necessário a geração de um novo token. Pode-se aproveitar o token que foi utilizado para o runner anterior.

docker exec -it runner-docker \
gitlab-runner register -n \
--url http://192.168.0.115 \
--registration-token se8sztuB1o1ewFbXHVav \
--clone-url http://192.168.0.115 \
--executor docker \
--docker-image "docker:latest" \
--docker-privileged

Agora, onde havia apenas um Runner, há dois Runners sendo executados e registrados no Gitlab.

Referências:

https://about.gitlab.com/install/?version=ce
https://docs.gitlab.com/runner/install/
https://docs.docker.com/engine/install/ubuntu/

Ao som de: Ney Matogrosso – Sorte

O Docker Compose é uma ferramenta para executar aplicações multi-containers, conforme a documentação do site oficial do Docker (https://docs.docker.com/compose/overview/).

Imagine que você tem 4 Dockerfiles, um para cada aplicação que irá usar um container diferente. Você teria que “rodar” os 4 Dockerfiles para subir essas aplicações. Com o Docker Compose você define tudo isso em um único arquivo, o docker-compose.yml, ou seja, você cria e inicia todos os seus serviços com a configuração que você definiu para cada serviço com um único comando.

Para fazer a instalação do Docker Compose é necessário fazer o download no Github oficial do docker compose: https://github.com/docker/compose/releases . No momento dessa postagem, a versão mais atual é a v1.13.0

O comando para instalar/atualizar para essa versão é:

# curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose

 

Depois de instalado, como exemplo, vamos fazer um docker-compose.yml que irá subir 2 containers: Um container com o MySQL 5.7 e o outro container com o WordPress mais atual disponível no Docker Hub. Vamos criar um arquivo .env com as variáveis utilizadas nas configurações desses dois serviços. Lembre-se de criar um diretório para esse dois arquivos.

Nome do arquivo: docker-compose.yml

 

version: ‘3’

services:
db:
image: mysql:5.7
volumes:
– db_data:/var/lib/mysql
restart: always
env_file:
– .env
wordpress:

    depends_on:
– db
image: wordpress:latest
ports:
– “8000:80”
restart: always
env_file:
– .env
volumes:
db_data:

 

Agora vamos criar o arquivo com as variáveis de ambiente dentro do arquivo .env

Nome do arquivo: .env

#Variáveis MYSQL
MYSQL_ROOT_PASSWORD=wordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress

#Variáveis WORDPRESS
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_PASSWORD=wordpress

 

Com os dois arquivos prontos, vamos executar o docker compose:

# docker-compose up -d

 

Esse comando executará o arquivo docker-compose, baixar as imagens base, subir dois containers, um com o wordpress e outro com mysql.

A imagem abaixo é um resumo do que foi feito até agora com o Docker Compose e verificando se as imagens e containers estão funcionando.

 


Agora vamos detalhar o que foi usado no Docker Compose acima.

  • VERSION: é onde definimos qual a versão do Docker Compose File que estamos usando. A versão mais atual é a versão 3;
  • SERVICES: é o nome do serviços que vamos criar. Serve para diferenciar quais containers estarão no docker-compose.yml;
  • IMAGE: Determina imagem será usada como base para a criação do container. Semelhante ao FROM do Dockerfile;
  • VOLUME: Faz a montagem dos volumes no container;
  • RESTART: Determina quando o container será reiniciado. No nosso caso, será sempre reiniciado independente do status da saída do container. Para ler sobre as outras opções, clique aqui para ler ir ao Docker Docs.
  • ENV_FILE: Informa que há um arquivo com as variáveis de ambiente que serão usadas nos serviços executados nos containers;
  • DEPENDS_ON: Informa a ordem de dependência dos containers. Por exemplo, o container do wordpress só será iniciado após a criação do container do banco de dados;
  • PORTS: Expõe as portas do host e do container, em ordem;

Outras opções para utilização no docker-compose.yml:

  • BUILD: São opções para aplicar no momento da compilação do compose. Também é possível definir um diretório e compilar os arquivos dentro desse diretório, incluindo Dockerfiles;
  • COMMAND: Semelhante ao CMD do Dockerfile, executa um comando dentro do container;
  • CONTAINER_NAME: Informa o nome do container;
  • DNS: Informa o endereço do servidor DNS;
  • DNS_SEARCH: Informa o Search Domain;
  • DOCKERFILE: Deve ser usado no BUILD para informar a utilização de um Dockerfile;
  • ENTRYPOINT: Informa qual o processo principal do container;
  • ENVIRONMENT: Adiciona variáveis de ambiente. Semelhante ao ENV_FILE, mas sem criar o arquivo .env;
  • EXPOSE: Expõe a porta do container;
  • EXTERNAL_LINKS: Cria links com containers criados fora do arquivo do Docker Compose;
  • EXTRA_HOSTS: Adiciona o mapeamento de hostnames dentro do arquivo /etc/hosts do container;
  • HEALTHCHECK: Define como será testado o estado do container. É preciso determinar o teste que será realizado, o período, o timeout da resposta do teste e o número de tentativas;
  • LABELS: Adiciona informações de metadados no container;
  • LINKS: Cria links com containers que estão dentro do Docker Compose;
  • LOGGING: Configura os logs para um serviço de logs;
  • NETWORK_MODE: Define qual o modo de rede o container irá usar;
  • SYSCTLS: Configura informações relacionadas no Kernel para o container;

Para uma relação completa de todos os argumentos e como utilizá-los, basta ir à página oficial da documentação do docker.

Espero que tenham gostado das postagens e em breve postarei mais informações sobre Docker.

Ao som de: Primus – Wynona’s Big Brown Beaver

Até agora explicamos como o Docker funciona, como instalar, criar um container e administrá-lo. Agora veremos como colocar todas as informações de uma imagem em um único arquivo chamado Dockerfile.

 

Vamos fazer uma imagem para subir um container com o Debian 8.7 e instalar o NGINX.
Primeiramente devemos criar, no host Docker, um diretório onde ficará esse Dockerfile.

cd ~

mkdir Docker && cd Docker && mkdir Nginx && cd Nginx


Após isso, vamos criar um arquivo chamado Dockerfile. Atentar para a grafia com a primeira letra maiúscula. 
Dentro desse arquivo, vamos colocar as seguintes informações:

 

FROM debian:8.7

MAINTAINER contato@161.35.238.43

RUN apt-get update && apt-get install -y nginx

EXPOSE 80

 

Ao colocar essa informação, salve e feche o arquivo. Feito isso, vamos agora executar o Dockerfile com o seguinte comando:

# docker build .

O Docker Build não trabalha com o caminho do arquivo, apenas com o seu diretório, então é necessário informar o caminho do diretório ou, no nosso caso, como estamos no diretório onde se localiza o Dockerfile, apenas um ponto para identificar que o Dockerfile está no diretório atual.

Caso todas as informações estejam corretas, sua imagem será criada e podemos atestar isso com o “docker images”.

 

 

A imagem está criada, mas sem o REPOSITORY e a TAG, pois não repassamos essa informação. Caso queira preencher os campos, basta usar o parâmetro “-t”.

# docker build -t brunoizidorio/nginx:1.0

Utilizamos a nomenclatura repositório/nome e tag. Agora vamos detalhar o nosso primeiro Dockerfile:

  • O Dockerfile funciona no formato: INSTRUÇÃO argumento.
  • O campo FROM é o nome da imagem que utilizamos, nesse caso o Debian 8.7.
  • MAINTAINER é a informação de quem criou o Dockerfile.
  • RUN são os comandos que queremos executar na imagem que escolhemos. Aqui informamos a instalação do Nginx. Lembre-se de sempre colocar o parâmetro para aceitar automaticamente a instalação, caso contrário o Dockerfile apresentará erro, pois estará esperando uma interação.
  • Como o Nginx funciona na porta 80, vamos expor essa porta do container usando o EXPOSE.

 

O primeiro argumento do Dockerfile deve ser sempre o FROM, seguido da imagem e versão que será utilizada. Caso não seja informada a versão, o Docker vai procurar a mais atual do seu repositório oficial. Abaixo, outros argumento utilizados no Dockerfile:

  • MAINTAINER: quem escreve o dockerfile;
    Ex: MAINTAINER contato@161.35.238.43
  • RUN: executa os comandos dentro do container;
    Ex: apt-get update && apt-get install -y nginx
  • ADD: adiciona arquivos, diretórios do host ou de uma url para dentro de um diretório do container, mas não funciona com arquivos compactados;
    Ex: ADD arquivo.txt /home/bruno/
  • CMD: informa os parâmetros que serão usados no ENTRYPOINT. Também pode ser utilizado para informar qual comando será executado após a criação do container, mas pode ser sobrescrito caso seja passada algum parâmetro de execução de algum comando na hora de executar o container;
    Ex: CMD [“nginx”, “-g”, “daemon off;”]
  • LABEL: coloca um metadado para o container;
    Ex: LABEL description=”Container do Nginx”
  • COPY: copia arquivos e diretórios do host para dentro de um diretório do container. Funciona com com arquivos compactados;
    Ex: COPY arquivo.txt /home/bruno/
  • ENTRYPOINT: informa qual será a aplicação principal do container, sendo executada após a inicialização do container. Diferente do CMD, não será sobrescrita. Caso a seja finalizada a execução do programa definido no ENTRYPOINT, o container será encerrado;
    Ex: ENTRYPOINT [“nginx”, “-D”, “FOREGROUND”]
  • ENV: cria uma variável de ambiente;
    Ex: meunome=”Bruno Izidório”
  • EXPOSE: expõe a porta informada do container;
    Ex: EXPOSE 80
  • USER: define qual será o usuário padrão para o container. Caso não seja definido, o padrão é o usuário root;
    Ex: USER bruno
  • WORKDIR: determina qual diretório será o padrão ao fazer o login;
    Ex: WORKDIR /home/bruno/downloads
  • VOLUME: permite a criação de um diretório no host onde fica armazenado os dados do container;
    Ex: VOLUME /home/docker/nginx:/usr/share/nginx/html

 

Ao som de The Neal Morse Band – So Far Gone