<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rsollino</id>
		<title>VeRLab Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.verlab.dcc.ufmg.br/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rsollino"/>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:Contributions/Rsollino"/>
		<updated>2026-09-19T17:50:43Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1650</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1650"/>
				<updated>2026-09-17T17:12:25Z</updated>
		
		<summary type="html">&lt;p&gt;Rsollino: /* Configuração */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Docker Rootless Mode ==&lt;br /&gt;
&lt;br /&gt;
O modo disponível do Docker para os usuários da rede é o '''Docker Engine no modo Rootless''', ou seja, apenas a versão em linha de comando e no modo de acesso non-root ([https://dev.to/jiisanda/docker-rootless-high-security-and-high-performance-2ji8 mais detalhes nesse link]).&lt;br /&gt;
&lt;br /&gt;
Em geral, funciona para todas as aplicações e pode-se ler mais informações no [https://docs.docker.com/engine/security/rootless/ link Docker Rootless]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Importante''': para estas configurações é necessário que a máquina tenha um docker instalado com versão &amp;gt;= 20.10 (pode ser conferido com: &amp;lt;code&amp;gt;docker version&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Este processo está disponível em todas as máquinas e cada usuário deve fazer configurações na sua ''home'' para poder utilizar o docker-rootless.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modo 1(systemd): Configuração Docker rootless com Systemd (&amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;não é possível usar simultaneamente em outras máquinas, apenas em uma máquina da rede por vez&amp;lt;/span&amp;gt;) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A opção mais intuitiva para executar o Docker Rootless é gerenciando pelo '''systemctl --user'''. Porém tem a limitação de &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''funcionar em apenas uma máquina da rede por vez'''&amp;lt;/span&amp;gt;, pois o arquivo que gerencia o systemctl do usuário é salvo na /home que é compartilhada em todas as máquinas, portanto '''apenas um processo docker rootless do usuário pode ser criado, mas em qualquer máquina da rede'''.&lt;br /&gt;
&lt;br /&gt;
=== Pré-requisitos ===&lt;br /&gt;
Para utilizar docker rootless em uma máquina no laboratório é preciso que o usuário: &lt;br /&gt;
&lt;br /&gt;
* solicite à equipe de rede para criar uma pasta de rascunho no disco local como /draft-xxx/nome_do_usuario e dar permissão de leitura/escrita.&lt;br /&gt;
* solicite à equipe de rede a instalação do docker na máquina.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuração ===&lt;br /&gt;
Feito estas etapas, para configurar o acesso na máquina é preciso seguir os seguintes passos para executar o docker rootless:&lt;br /&gt;
&lt;br /&gt;
# Crie a pasta &amp;lt;code&amp;gt;~/.config/docker&amp;lt;/code&amp;gt; com o comando &amp;lt;code&amp;gt;mkdir -p ~/.config/docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Altere a pasta de armazenamento dos arquivos de cache do Docker para a pasta de rascunho /draft-xxx com:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;echo '{&amp;quot;data-root&amp;quot;:&amp;quot;/&amp;lt;path-em-disco-local&amp;gt;/&amp;lt;user&amp;gt;/docker-cache&amp;quot;}' | tee ~/.config/docker/daemon.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Importante:''' Lembre-se de ajustar o &amp;lt;code&amp;gt;&amp;lt;path-em-disco-local&amp;gt;/&amp;lt;user&amp;gt;&amp;lt;/code&amp;gt; para uma armazenamento de rascunho na máquina e alguma pasta do seu usuário (por exemplo, &amp;lt;code&amp;gt;/draft-hdd/fulano&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Esses dois primeiros passos são específicos para as máquinas do VeRLab: por padrão o Docker guarda arquivos na /home do usuário, mas essa pasta é compartilhada em rede (por NFS ou MooseFS) e o Docker não dá suporte a isso.[https://github.com/docker/for-linux/issues/1172 Aqui está um issue citando o problema]&lt;br /&gt;
&lt;br /&gt;
# Execute &amp;lt;code&amp;gt;dockerd-rootless-setuptool.sh install&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Importante''': Após terminar, o comando vai pedir que você altere seu .bashrc para adicionar uma linha semelhante a &amp;lt;code&amp;gt;export DOCKER_HOST=unix:///run/user/&amp;lt;uid&amp;gt;/docker.sock&amp;lt;/code&amp;gt; (varia por usuário). Faça essa alteração antes de prosseguir copiando e colando o comando no terminal.&lt;br /&gt;
# Reinicie o Bash com &amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Ative a inicialização automática do Docker em seu usuário: &amp;lt;code&amp;gt;systemctl --user enable --now docker&amp;lt;/code&amp;gt; ou manualmente: &amp;lt;code&amp;gt;systemctl --user start docker&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Com isso, a configuração está pronta!&lt;br /&gt;
&lt;br /&gt;
=== Utilização ===&lt;br /&gt;
Comandos para confirmar se o Docker está funcionando:&lt;br /&gt;
* Verificar status do docker daemon:  &amp;lt;code&amp;gt;systemctl --user status docker.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* Parar docker daemon:  &amp;lt;code&amp;gt;systemctl --user stop docker.service&amp;lt;/code&amp;gt;&lt;br /&gt;
* Verificar configurações do Docker Rootless: &amp;lt;code&amp;gt;docker version&amp;lt;/code&amp;gt;  ou  &amp;lt;code&amp;gt;docker info&amp;lt;/code&amp;gt;&lt;br /&gt;
* Baixar uma imagem teste e executá-la: &amp;lt;code&amp;gt;docker run hello-world&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modo 2 (Manual): Configuração Docker Rootless &amp;quot;Manual&amp;quot; para &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;execução simultânea em várias máquinas da rede&amp;lt;span&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Essa opção pode parecer menos intuitiva, pois o usuário precisará executar manualmente o '''daemon do docker rootless''' em um terminal e mantê-lo em execução para poder utilizar os comandos docker em outros terminais.&lt;br /&gt;
&lt;br /&gt;
Isso pode ser facilmente feito utilizando os [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Trabalhando_remotamente#Usando_tmux_ou_byobu:_multiplexador_de_terminais  multiplexadores de terminal como tmux ou byobu].&lt;br /&gt;
&lt;br /&gt;
Uma vez que parar a execução do docker daemon com ctrl+c ou fechar o terminal, isso vai &amp;quot;matar&amp;quot; a execução do docker rootless na máquina e parar todos seus containers de forma abrupta. Porém tem a flexibilidade de não precisar da pasta /home para armazenar as configurações do daemon, então &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;com essa configuração é possível executar o docker rootless em várias máquinas simultaneamente!&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pré-requisitos ===&lt;br /&gt;
Para utilizar Docker Rootless em uma máquina no laboratório é preciso que o usuário: &lt;br /&gt;
&lt;br /&gt;
* solicite à equipe de rede para criar uma pasta de rascunho no disco local como /draft-xxx/nome_do_usuario e dar permissão de leitura/escrita.&lt;br /&gt;
* solicite à equipe de rede a instalação do docker na máquina.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuração ===&lt;br /&gt;
&lt;br /&gt;
# Abra seu arquivo &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; no editor de texto preferido, se for no terminal pode usar o nano: &amp;lt;code&amp;gt;'''nano ~/.bashrc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Cole as seguintes funções no final desse arquivo e salve o mesmo:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Adicionar funções no .bashrc para facilitar o uso do '''docker-rootless mode'''&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Funções para adicionar no final do arquivo ~/.bashrc e usar docker rootless na rede VeRLab/JLab&lt;br /&gt;
# v4.1 set/2026 by mauferrari, rsollino&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&lt;br /&gt;
&lt;br /&gt;
  if [ -d /draft-hdd ]; then&lt;br /&gt;
    export USER_DOCKER_BASE_DIR=/draft-hdd&lt;br /&gt;
  elif [ -d /draft-ssd ]; then&lt;br /&gt;
    export USER_DOCKER_BASE_DIR=/draft-ssd&lt;br /&gt;
  elif [ -d /draft-nvme ]; then&lt;br /&gt;
    export USER_DOCKER_BASE_DIR=/draft-nvme&lt;br /&gt;
  elif [ -d /draft-nvme1 ];then&lt;br /&gt;
    export USER_DOCKER_BASE_DIR=/draft-nvme1&lt;br /&gt;
  elif [ -d /draft-nvme0 ];then&lt;br /&gt;
    export USER_DOCKER_BASE_DIR=/draft-nvme0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
#export USER_DOCKER_BASE_DIR=/draft-hdd&lt;br /&gt;
&lt;br /&gt;
# Função para criar pastas e configuração do docker rootless&lt;br /&gt;
function docker-rootless-create-dir(){&lt;br /&gt;
  MYUSER=$(whoami)&lt;br /&gt;
  # Cria environment variables para pastas&lt;br /&gt;
  echo -e &amp;quot;Creating Docker Rootless Folder for user $MYUSER...&amp;quot;&lt;br /&gt;
  export USER_BASE_DIR=$USER_DOCKER_BASE_DIR/${MYUSER}&lt;br /&gt;
  export USER_DOCKER_DIR=$USER_BASE_DIR/docker-rootless&lt;br /&gt;
  echo -e &amp;quot;  USER_BASE_DIR=$USER_BASE_DIR\n  USER_DOCKER_DIR=$USER_DOCKER_DIR&amp;quot;&lt;br /&gt;
  # Verfica se o diretorio base do usuário existe&lt;br /&gt;
  if [ ! -d &amp;quot;$USER_BASE_DIR&amp;quot; ]; then&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  USER_BASE_DIR=$USER_BASE_DIR needs to be created by user '$MYUSER'!&amp;quot;&lt;br /&gt;
    unset USER_BASE_DIR&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    return 1&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # Verifica pasta do usuário usada pelo docker rootless&lt;br /&gt;
  if [ ! -w &amp;quot;$USER_BASE_DIR&amp;quot; ]; then&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  USER_BASE_DIR=$USER_BASE_DIR needs to be writable by user '$MYUSER'!&amp;quot;&lt;br /&gt;
    unset USER_BASE_DIR&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    return 2&lt;br /&gt;
  fi&lt;br /&gt;
  # Verifica se a pasta do usuário já existe&lt;br /&gt;
  if [ -d &amp;quot;$USER_DOCKER_DIR&amp;quot; ]; then&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  USER_DOCKER_DIR=$USER_DOCKER_DIR already exists!&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;  Please remove it or use another folder!&amp;quot;&lt;br /&gt;
    unset USER_BASE_DIR&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    return 3&lt;br /&gt;
  fi&lt;br /&gt;
  # Cria pastas usadas pelo docker rootless&lt;br /&gt;
  mkdir --parents $USER_DOCKER_DIR&lt;br /&gt;
  export XDG_RUNTIME_DIR=$USER_DOCKER_DIR/.docker/run&lt;br /&gt;
  export XDG_CONFIG_HOME=$USER_DOCKER_DIR/.config&lt;br /&gt;
  mkdir --parents $XDG_RUNTIME_DIR&lt;br /&gt;
  mkdir --parents $XDG_CONFIG_HOME/docker&lt;br /&gt;
&lt;br /&gt;
  # Cria configuração do docker rootless&lt;br /&gt;
  echo &amp;quot;{\&amp;quot;data-root\&amp;quot;:\&amp;quot;${USER_DOCKER_DIR}/docker-cache\&amp;quot;}&amp;quot; | tee $XDG_CONFIG_HOME/docker/daemon.json  &amp;amp;&amp;amp; \&lt;br /&gt;
  nvidia-ctk runtime configure --runtime=docker --config=$XDG_CONFIG_HOME/docker/daemon.json&lt;br /&gt;
&lt;br /&gt;
  echo -e &amp;quot;\n\n  HOME=$HOME \n  XDG_CONFIG_HOME=$XDG_CONFIG_HOME \n  XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \n  XDG_DATA_HOME=$XDG_DATA_HOME \n  DOCKER_HOST=$DOCKER_HOST&amp;quot;&lt;br /&gt;
  echo -e &amp;quot;\n\ncat $XDG_CONFIG_HOME/docker/daemon.json\n&amp;quot; &amp;amp;&amp;amp; cat $XDG_CONFIG_HOME/docker/daemon.json&lt;br /&gt;
  echo -e &amp;quot;\n\nDocker Rootless Folders and Config Files Successfully Created!&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Função para iniciar manualmente daemon do docker no modo rootless&lt;br /&gt;
function docker-rootless-daemon-run(){&lt;br /&gt;
  MYUSER=$(whoami)&lt;br /&gt;
  echo -e &amp;quot;Exporting Environment Variables for Docker Rootless Daemon...&amp;quot;&lt;br /&gt;
  export USER_DOCKER_DIR=$USER_DOCKER_BASE_DIR/${MYUSER}/docker-rootless&lt;br /&gt;
&lt;br /&gt;
  echo -e &amp;quot;  USER_DOCKER_DIR=$USER_DOCKER_DIR\n  XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR\n  XDG_CONFIG_HOME=$XDG_CONFIG_HOME&amp;quot;&lt;br /&gt;
  # Verifica se o diretório do usuário existe e pode ser escrita pelo docker rootless&lt;br /&gt;
  if [ ! -d &amp;quot;$USER_DOCKER_DIR&amp;quot; ] &amp;amp;&amp;amp; [ ! -w &amp;quot;$USER_DOCKER_DIR&amp;quot; ]; then&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  USER_DOCKER_DIR=$USER_DOCKER_DIR does not exist or is not writable!&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;  Please run docker-rootless-create-dir first!&amp;quot;&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    return 1&lt;br /&gt;
  fi&lt;br /&gt;
  export XDG_RUNTIME_DIR=$USER_DOCKER_DIR/.docker/run&lt;br /&gt;
  export XDG_CONFIG_HOME=$USER_DOCKER_DIR/.config&lt;br /&gt;
  # Verifica se o daemon do docker rootless está rodando&lt;br /&gt;
  echo -e &amp;quot;Checking Docker Rootless Daemon...&amp;quot;&lt;br /&gt;
  if [ -S $XDG_RUNTIME_DIR/docker.sock ]; then&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  Docker Rootless Daemon is already running at $XDG_RUNTIME_DIR!&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;  Please stop it first!&amp;quot;&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    unset XDG_RUNTIME_DIR&lt;br /&gt;
    unset XDG_CONFIG_HOME&lt;br /&gt;
    return 2&lt;br /&gt;
  fi&lt;br /&gt;
  # Start docker daemon&lt;br /&gt;
  echo -e &amp;quot;\n\n  HOME=$HOME \n  XDG_CONFIG_HOME=$XDG_CONFIG_HOME \n  XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \n  XDG_DATA_HOME=$XDG_DATA_HOME \n  DOCKER_HOST=$DOCKER_HOST&amp;quot;&lt;br /&gt;
  echo -e &amp;quot;\n\ncat $XDG_CONFIG_HOME/docker/daemon.json\n&amp;quot; &amp;amp;&amp;amp; cat $XDG_CONFIG_HOME/docker/daemon.json&lt;br /&gt;
  echo -e &amp;quot;Starting Docker Rootless Daemon...&amp;quot;&lt;br /&gt;
  dockerd-rootless.sh&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Função para exportar variáveis de ambiente para executar comandos do docker rootless&lt;br /&gt;
function docker-rootless-export(){&lt;br /&gt;
  MYUSER=$(whoami)&lt;br /&gt;
  echo -e &amp;quot;Exporting Environment Variables for Docker Rootless Daemon...&amp;quot;&lt;br /&gt;
  export USER_DOCKER_DIR=$USER_DOCKER_BASE_DIR/${MYUSER}/docker-rootless&lt;br /&gt;
  # Verifica se o diretório do usuário existe e pode ser escrita pelo docker rootless&lt;br /&gt;
  if [ -d &amp;quot;$USER_DOCKER_DIR&amp;quot; ] &amp;amp;&amp;amp; [ -w &amp;quot;$USER_DOCKER_DIR&amp;quot; ]; then&lt;br /&gt;
    export DOCKER_HOST=unix://$USER_DOCKER_DIR/.docker/run/docker.sock&lt;br /&gt;
    echo -e &amp;quot;  USER_DOCKER_DIR=$USER_DOCKER_DIR\n  DOCKER_HOST=$DOCKER_HOST&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo -e &amp;quot;ERROR!\n  USER_DOCKER_DIR=$USER_DOCKER_DIR does not exist or is not writable!&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;  Please run docker-rootless-create-dir first!&amp;quot;&lt;br /&gt;
    unset USER_DOCKER_DIR&lt;br /&gt;
    return 1&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilização ===&lt;br /&gt;
Uma vez que tiver as funções salvas em seu &amp;lt;code&amp;gt;'''~/.bashrc'''&amp;lt;/code&amp;gt; elas serão usadas para:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Como usar as funções docker-rootless-*&lt;br /&gt;
|-&lt;br /&gt;
! Função !! Descrição !! Utilização&lt;br /&gt;
|-&lt;br /&gt;
|''docker-rootless-create-dir()''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|Cria uma pasta para os arquivos do docker rootless daemon em &amp;lt;code&amp;gt;&amp;quot;/draft-hdd/&amp;lt;usuario&amp;gt;/docker-rootless&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Usada apenas a primeira vez na máquina. Se a pasta já foi criada anteriormente, não precisa mais usar essa função na mesma máquina.&lt;br /&gt;
|-&lt;br /&gt;
|''docker-rootless-daemon-run()''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|Executar o docker rootless daemon no terminal atual no tmux ou byobu&lt;br /&gt;
|Usada uma vez, para não haver outro terminal executando o docker rootless daemon na máquina.&lt;br /&gt;
|-&lt;br /&gt;
|''docker-rootless-export()''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|Exportar as variáveis de ambiente com o path correto do docker rootless daemon e do docker.sock (''XDG_RUNTIME_DIR'' e ''DOCKER_HOST'')&lt;br /&gt;
|Usada em todo novo terminal que abrir e quiser usar comando docker. Também pode ser colocada no final do ~/.bashrc para valer automaticamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para utilizar o docker:&lt;br /&gt;
&lt;br /&gt;
# Faça ''ssh'' numa das máquinas que tem o docker rootless instalado&lt;br /&gt;
# Se a pasta &amp;lt;code&amp;gt;&amp;quot;/draft-hdd/&amp;lt;usuario&amp;gt;/docker-rootless&amp;quot;&amp;lt;/code&amp;gt; ainda não foi criada para seu usuário na máquina, execute: &amp;lt;code&amp;gt;'''docker-rootless-create-dir'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# No terminal abra o multiplexador de terminais, por exemplo, comando: &amp;lt;code&amp;gt;'''tmux'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Dentro da '''janela 0''' do tmux, execute o docker rootless daemon: &amp;lt;code&amp;gt;'''docker-rootless-daemon-run'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Abra outra janela no tmux: ctrl+b c&lt;br /&gt;
# Na '''janela 1''' faça o export do path para executar comandos docker:  &amp;lt;code&amp;gt;'''docker-rootless-export'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Na '''janela 1''' execute os comandos docker:  &amp;lt;code&amp;gt;'''docker version ; docker compose version; docker info;'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Na '''janela 1''' download e execute uma imagem de teste (13kB):  &amp;lt;code&amp;gt;'''docker run hello-world'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testando Docker Rootless ===&lt;br /&gt;
Considerando que a pasta para seu usuário na máquina já foi criada, ou seja, já existe o caminho &amp;lt;code&amp;gt;&amp;quot;/draft-hdd/&amp;lt;usuario&amp;gt;/docker-rootless&amp;quot;&amp;lt;/code&amp;gt;. Caso ainda não exista, execute: &amp;lt;code&amp;gt;'''docker-rootless-create-dir'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# Faça ''ssh'' numa das máquinas que tem o docker rootless instalado&lt;br /&gt;
# No terminal abra o multiplexador de terminais, por exemplo, comando: &amp;lt;code&amp;gt;'''tmux'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Dentro da '''janela 0''' do tmux, execute o docker rootless daemon: &amp;lt;code&amp;gt;'''docker-rootless-daemon-run'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Abra outra janela no tmux: ctrl+b c&lt;br /&gt;
# Na '''janela 1''' faça o export do path para executar comandos docker:  &amp;lt;code&amp;gt;'''docker-rootless-export'''&amp;lt;/code&amp;gt;&lt;br /&gt;
# Na '''janela 1''' download e execute uma das imagens de teste abaixo:   &lt;br /&gt;
&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Atenção para escolher uma imagem com CUDA compatível com o driver de vídeo Nvidia instalado na máquina!&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;Para saber a versão de CUDA toolkit suportada pelo driver Nvidia utilize o comando &amp;lt;code&amp;gt;'''nvidia-smi'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-weight:bold; font-family:serif !important;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-weight:normal; text-align:center;&amp;quot;&lt;br /&gt;
! Comando docker&lt;br /&gt;
! image size&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run hello-world&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 13kB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run --gpus all nvidia/cuda:11.2.2-base-ubuntu20.04 nvidia-smi&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 125MB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 154MB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run --gpus all nvidia/cuda:12.0.0-base-ubuntu20.04 nvidia-smi&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 240MB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run --gpus all nvidia/cuda:12.2.2-base-ubuntu20.04 nvidia-smi&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 242MB&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#CCC;&amp;quot; | docker run --gpus all nvidia/cuda:12.2.2-base-ubuntu22.04 nvidia-smi&lt;br /&gt;
| style=&amp;quot;font-weight:normal;&amp;quot; | 239MB&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limpar dados do docker rootless: cache, images e containers ==&lt;br /&gt;
&lt;br /&gt;
Para desocupar espaço em disco das máquinas, caso não esteja utilizando o docker, mas deseja manter a estrutura de pastas do docker rootless daemon, pode-se apagar todas as imagens, cache e containers com:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''docker system prune --all'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns links de referencia:&lt;br /&gt;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
* https://stackoverflow.com/questions/44785585/how-can-i-delete-all-local-docker-images&lt;br /&gt;
* https://contabo.com/blog/how-to-remove-docker-volumes-images-and-containers/?gad_source=1&amp;amp;gclid=CjwKCAjwydSzBhBOEiwAj0XN4JA5Mz8X1bAK-PaXKPz9PyQnJKdahvYG3Z6CBm5ydgRmsNymOFU9FhoC4a0QAvD_BwE&lt;br /&gt;
* https://earthly.dev/blog/docker-image-storage-on-host/&lt;br /&gt;
&lt;br /&gt;
== Docker abrindo janela no Ubuntu ==&lt;br /&gt;
exemplo com ROS&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker run --detach --privileged \ &lt;br /&gt;
--volume /tmp/.X11-unix:/tmp/.X11-unix \ &lt;br /&gt;
--volume /home:/home/host \ &lt;br /&gt;
--device=/dev/bus/usb:/dev/bus/usb \ &lt;br /&gt;
--volume /dev:/dev \ &lt;br /&gt;
--runtime=nvidia \ &lt;br /&gt;
--gpus 'all,&amp;quot;capabilities=utility,display,compute&amp;quot;' \ &lt;br /&gt;
--env DISPLAY=$DISPLAY \ &lt;br /&gt;
--network=host \ &lt;br /&gt;
--name ros_noetic_gps_testing_container \ &lt;br /&gt;
ros_noetic_gps_testing:latest \ &lt;br /&gt;
tail -f /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#docker run -it -v &amp;quot;$PWD&amp;quot;:/ros2_ws/ -P --device=/dev/ttyACM0 --device=/dev/bus/usb:/dev/bus/usb --name ros2_dev ros2_ws&lt;br /&gt;
&lt;br /&gt;
#docker exec -it ros2_dev /bin/bash&lt;br /&gt;
&lt;br /&gt;
docker run -it \&lt;br /&gt;
--name ros2_work \&lt;br /&gt;
--privileged \&lt;br /&gt;
--env DISPLAY=$DISPLAY \&lt;br /&gt;
--volume /tmp/.X11-unix:/tmp/.X11-unix \&lt;br /&gt;
--volume &amp;quot;$PWD&amp;quot;:/ros2_ws/ \&lt;br /&gt;
--device=/dev/ttyACM0 \&lt;br /&gt;
--device=/dev/ttyACM1 \&lt;br /&gt;
--device=/dev/bus/usb:/dev/bus/usb \&lt;br /&gt;
--gpus 'all,&amp;quot;capabilities=utility,display,compute&amp;quot;' \&lt;br /&gt;
--runtime=nvidia \&lt;br /&gt;
--network=host \&lt;br /&gt;
ros2_dev \&lt;br /&gt;
bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criar regra udev para dispositivo USB ==&lt;br /&gt;
Para descobrir o idProduct e idVendor do dispositivo, pode-se usar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; udevadm info -a -n /dev/ttyACM0 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para criar o arquivo com a regra:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; sudo nano /etc/udev/rules.d/99-ublox-gps.rules &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adicionar essa linha no arquivo e salvar o arquivo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1546&amp;quot;, ATTRS{idProduct}==&amp;quot;01a9&amp;quot;, MODE=&amp;quot;0666&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se quiser criar um novo nome (link simbolico /dev/ublox) adicionar SYMLINK:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SUBSYSTEM==&amp;quot;tty&amp;quot;, ATTRS{idVendor}==&amp;quot;1546&amp;quot;, ATTRS{idProduct}==&amp;quot;01a9&amp;quot;, SYMLINK+=&amp;quot;ublox&amp;quot;, MODE=&amp;quot;0666&amp;quot;, GROUP=&amp;quot;dialout&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Desconectar e conectar o dispositivo da USB novamente para acionar a nova regra&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Criar docker com S.O. windows ou macOs com acesso por site web ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/dockur/windows&lt;br /&gt;
&lt;br /&gt;
* https://github.com/dockur/macos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplo de docker compose com win11, 2 Cores, HD 64GB, RAM 8GB&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;compose.yaml&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  windows:&lt;br /&gt;
    image: dockurr/windows&lt;br /&gt;
    container_name: windows&lt;br /&gt;
    environment:&lt;br /&gt;
      VERSION: &amp;quot;11&amp;quot;&lt;br /&gt;
      DISK_SIZE: &amp;quot;64&amp;quot;&lt;br /&gt;
      RAM_SIZE: &amp;quot;8&amp;quot;&lt;br /&gt;
      CPU_CORES: &amp;quot;2&amp;quot;&lt;br /&gt;
    devices:&lt;br /&gt;
      - /dev/kvm&lt;br /&gt;
      - /dev/net/tun&lt;br /&gt;
    cap_add:&lt;br /&gt;
      - NET_ADMIN&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8006:8006&lt;br /&gt;
      - 3389:3389/tcp&lt;br /&gt;
      - 3389:3389/udp&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./windows:/storage&lt;br /&gt;
    restart: always&lt;br /&gt;
    stop_grace_period: 2m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para acessar a tela do Win11 entre a URL no navegador &amp;lt;code&amp;gt;localhost:8006&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exemplo de Dockerfile usado no Jetracer ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Modelo de Dockerfile usado no Jetracer&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usa a imagem base do Ubuntu 20.04 para arquitetura ARM64 (Jetson Nano)&lt;br /&gt;
FROM arm64v8/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
# Evita prompts interativos durante a instalação de pacotes&lt;br /&gt;
ENV DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
&lt;br /&gt;
# Atualiza o sistema e instala ferramentas básicas&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
		curl \                # Utilitário para baixar arquivos via HTTP&lt;br /&gt;
    gnupg2 \              # Para importar chaves GPG&lt;br /&gt;
    lsb-release \         # Para detectar a versão do Ubuntu&lt;br /&gt;
    locales \             # Para configurar o sistema com suporte a UTF-8&lt;br /&gt;
    sudo \                # Permite uso do comando sudo&lt;br /&gt;
    &amp;amp;&amp;amp; locale-gen en_US en_US.UTF-8 \             # Gera locale UTF-8&lt;br /&gt;
    &amp;amp;&amp;amp; update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8  # Atualiza variáveis de locale&lt;br /&gt;
&lt;br /&gt;
# Define variáveis de ambiente para o locale em UTF-8&lt;br /&gt;
ENV LANG=en_US.UTF-8 \&lt;br /&gt;
    LC_ALL=en_US.UTF-8&lt;br /&gt;
&lt;br /&gt;
# Adiciona o repositório do ROS oficial e sua chave GPG&lt;br /&gt;
RUN curl -sSL &amp;quot;http://packages.ros.org/ros.key&amp;quot; | apt-key add - &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list&lt;br /&gt;
&lt;br /&gt;
# Instala o ROS Noetic (ros-base) e ferramentas auxiliares&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
    ros-noetic-ros-base \               # ROS básico, sem GUI (leve)&lt;br /&gt;
    python3-rosdep \                    # Gerenciador de dependências ROS&lt;br /&gt;
    python3-rosinstall \               # Para importar pacotes ROS&lt;br /&gt;
    python3-rosinstall-generator \     # Ferramenta para gerar dependências&lt;br /&gt;
    python3-wstool \                   # Gerenciador de workspaces&lt;br /&gt;
    python3-pip \                      # Gerenciador de pacotes Python&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*     # Remove cache para reduzir tamanho da imagem&lt;br /&gt;
&lt;br /&gt;
# Inicializa o rosdep (necessário para instalar dependências de pacotes ROS)&lt;br /&gt;
RUN rosdep init &amp;amp;&amp;amp; rosdep update&lt;br /&gt;
&lt;br /&gt;
# Adiciona o script de configuração do ROS no bashrc do root&lt;br /&gt;
RUN echo &amp;quot;source /opt/ros/noetic/setup.bash&amp;quot; &amp;gt;&amp;gt; /root/.bashrc&lt;br /&gt;
&lt;br /&gt;
# Define o shell padrão como bash (necessário para scripts do ROS funcionarem corretamente)&lt;br /&gt;
SHELL [&amp;quot;/bin/bash&amp;quot;, &amp;quot;-c&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# Define uma variável de ambiente com a distro do ROS&lt;br /&gt;
ENV ROS_DISTRO=noetic&lt;br /&gt;
&lt;br /&gt;
# Cria o diretório do workspace ROS (catkin workspace)&lt;br /&gt;
RUN mkdir -p /root/catkin_ws/src&lt;br /&gt;
&lt;br /&gt;
# Define o diretório de trabalho padrão para o contêiner&lt;br /&gt;
WORKDIR /root/catkin_ws&lt;br /&gt;
&lt;br /&gt;
# Comando padrão ao iniciar o contêiner: inicia um terminal bash&lt;br /&gt;
CMD [&amp;quot;bash&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando para o docker build&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker build -t ros-noetic-nano .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando de RUN, primeira vez&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker run -it --name meu_ros_container \-v ~/jetrace/container:/root/catkin_ws \&lt;br /&gt;
  ros-noetic-nano&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando START&lt;br /&gt;
|-&lt;br /&gt;
|  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker start -ai develop_container&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dicas Docker Compose ==&lt;br /&gt;
* https://docs.docker.com/compose/gettingstarted/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dicas Docker com ROS Noetic ==&lt;br /&gt;
* https://discourse.openrobotics.org/t/running-ros-noetic-in-docker-a-practical-guide-for-simulation-and-teleoperation/42572&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rsollino</name></author>	</entry>

	</feed>