<?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=Camilachagascarv</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=Camilachagascarv"/>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:Contributions/Camilachagascarv"/>
		<updated>2026-04-03T22:26:40Z</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=1526</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1526"/>
				<updated>2025-06-11T13:05:10Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1525</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1525"/>
				<updated>2025-06-11T13:02:19Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando 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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1524</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1524"/>
				<updated>2025-06-11T13:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando no Jetracer ==&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1523</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1523"/>
				<updated>2025-06-11T12:58:41Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando no Jetracer ==&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;
}&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1522</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1522"/>
				<updated>2025-06-11T12:56:48Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando no Jetracer ==&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1521</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1521"/>
				<updated>2025-06-11T12:55:08Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Exemplo de Dockerfile usando no Jetracer */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando no Jetracer''' ==&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1520</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Docker&amp;diff=1520"/>
				<updated>2025-06-11T12:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Dicas Docker Compose */&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.&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 ainda se encontra em uma fase experimental e não está disponível em todas as máquinas. As máquinas disponíveis com docker até o momento são '''PROC1, PROC2, PROC5, PROC6, PROC7, EPONA, NYMERIA, DROGON''', '''EVA, WALL-E, MAGRITTE''' e '''DALEK'''.&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 mai/2025 by mauferrari&lt;br /&gt;
&lt;br /&gt;
# Path para o diretório base a ser utilizado pelo docker rootless do usuário&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;
&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://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;
* https://docs.docker.com/reference/cli/docker/system/prune/#extended-description&lt;br /&gt;
&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 usando no Jetracer ==&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;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=GAZEBO&amp;diff=1476</id>
		<title>GAZEBO</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=GAZEBO&amp;diff=1476"/>
				<updated>2025-03-31T14:53:54Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: Created page with &amp;quot;= Tutorial inserindo modelos customizados no gazebo =  == Criar um modelo desejado e exportá-lo em um arquivo .dae == Você consegue fazer isso no blender, selecionando a op...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tutorial inserindo modelos customizados no gazebo =&lt;br /&gt;
&lt;br /&gt;
== Criar um modelo desejado e exportá-lo em um arquivo .dae ==&lt;br /&gt;
Você consegue fazer isso no blender, selecionando a opção *export* e selecionando o tipo *.DAE*, como mostrado abaixo. Para isso, vá até o canto superior direito e procure File, depois vá em export e clique em um arquivo .dae.&lt;br /&gt;
&lt;br /&gt;
== O código completo de exemplo ==&lt;br /&gt;
&lt;br /&gt;
[mundo.sdf]&lt;br /&gt;
&lt;br /&gt;
== Agora, vamos entender como o arquivo .DAE exportado é referenciado no arquivo SDF (Simulation Description Format) e como é configurado alguns parâmetros ==&lt;br /&gt;
&lt;br /&gt;
=== Definição do Mundo (&amp;lt;nowiki&amp;gt;&amp;lt;world&amp;gt;&amp;lt;/nowiki&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
O código começa com a definição de um mundo chamado **&amp;quot;challenge&amp;quot;**. Esse é o espaço virtual onde a simulação acontece.&lt;br /&gt;
&lt;br /&gt;
=== Física do Mundo (&amp;lt;nowiki&amp;gt;&amp;lt;physics&amp;gt;&amp;lt;/nowiki&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
O bloco de física define como o mundo vai se comportar em termos de **simulação física**.&lt;br /&gt;
&lt;br /&gt;
* **`max_step_size`** controla a precisão do cálculo de física.&lt;br /&gt;
* **`real_time_factor`** controla a velocidade da simulação (1 significa que a simulação acontece em tempo real).&lt;br /&gt;
* **`real_time_update_rate`** define a taxa de atualização do tempo na simulação.&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
&lt;br /&gt;
**Plugins** são peças de código adicional que estendem as funcionalidades da simulação. Aqui, várias funcionalidades de simulação foram adicionadas, como sistemas de física, comandos de usuário, detecção de colisões, e até sistemas como IMU (unidade de medição inercial) e sensores magnéticos.&lt;br /&gt;
&lt;br /&gt;
=== Luz (&amp;lt;nowiki&amp;gt;&amp;lt;light&amp;gt;&amp;lt;/nowiki&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
A simulação tem uma **luz direcional** chamada &amp;quot;sun&amp;quot;. A luz é configurada para ter uma direção específica e iluminar o cenário, com diferentes parâmetros como intensidade e como a luz diminui com a distância.&lt;br /&gt;
&lt;br /&gt;
=== Configuração da Cena (&amp;lt;nowiki&amp;gt;&amp;lt;scene&amp;gt;&amp;lt;/nowiki&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
A cena da simulação tem configurações como a cor de fundo e a iluminação ambiente, além de permitir ou não as sombras.&lt;br /&gt;
&lt;br /&gt;
=== Modelo do Mundo (&amp;lt;nowiki&amp;gt;&amp;lt;model name=&amp;quot;mundo_com_textura&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Aqui, um **modelo 3D** chamado &amp;quot;mundo_com_textura&amp;quot; é adicionado ao cenário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;link name=&amp;quot;link&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Definição de visualização do modelo --&amp;gt;&lt;br /&gt;
    &amp;lt;visual name=&amp;quot;visual_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh&amp;gt;&lt;br /&gt;
          &amp;lt;uri&amp;gt;model://mundo_com_textura.dae&amp;lt;/uri&amp;gt; &amp;lt;!-- Caminho para o arquivo .dae --&amp;gt;&lt;br /&gt;
        &amp;lt;/mesh&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
    &amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O modelo é carregado a partir de um arquivo **.dae** (formato de arquivo de modelo 3D).&lt;br /&gt;
&lt;br /&gt;
Esse modelo é **estático**, ou seja, ele não cai, devido ao comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;static&amp;gt;true&amp;lt;/static&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Além disso, o modelo tem uma **superfície de colisão**, o que significa que ele vai interagir com outros objetos ou robôs na simulação, e a colisão tem um coeficiente de **fricção** definido.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Definição de colisão (superfície do chão) --&amp;gt;&lt;br /&gt;
    &amp;lt;collision name=&amp;quot;collision_link&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;geometry&amp;gt;&lt;br /&gt;
        &amp;lt;mesh&amp;gt;&lt;br /&gt;
          &amp;lt;uri&amp;gt;model://mundo_com_textura.dae&amp;lt;/uri&amp;gt; &amp;lt;!-- Caminho para o arquivo .dae --&amp;gt;&lt;br /&gt;
        &amp;lt;/mesh&amp;gt;&lt;br /&gt;
      &amp;lt;/geometry&amp;gt;&lt;br /&gt;
      &amp;lt;surface&amp;gt;&lt;br /&gt;
        &amp;lt;friction&amp;gt;&lt;br /&gt;
          &amp;lt;ode&amp;gt;&lt;br /&gt;
            &amp;lt;mu&amp;gt;0.5&amp;lt;/mu&amp;gt; &amp;lt;!-- Coeficiente de fricção: ver qual seria mais o padrão --&amp;gt;&lt;br /&gt;
            &amp;lt;mu2&amp;gt;0.5&amp;lt;/mu2&amp;gt;&lt;br /&gt;
          &amp;lt;/ode&amp;gt;&lt;br /&gt;
        &amp;lt;/friction&amp;gt;&lt;br /&gt;
      &amp;lt;/surface&amp;gt;&lt;br /&gt;
    &amp;lt;/collision&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OBS''': Ainda estou vendo os efeitos da mudança de fricção na simulação.&lt;br /&gt;
&lt;br /&gt;
== Material de apoio ==&lt;br /&gt;
&lt;br /&gt;
* [gazebo tutorials](https://gazebosim.org/docs/latest/building_robot/)&lt;br /&gt;
&lt;br /&gt;
== Créditos ==&lt;br /&gt;
&lt;br /&gt;
Camila Chagas Carvalho&lt;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=File:Screenshot_from_2025-03-18_14-45-56.png&amp;diff=1475</id>
		<title>File:Screenshot from 2025-03-18 14-45-56.png</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=File:Screenshot_from_2025-03-18_14-45-56.png&amp;diff=1475"/>
				<updated>2025-03-31T14:48:45Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: Camilachagascarv uploaded a new version of File:Screenshot from 2025-03-18 14-45-56.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=File:Screenshot_from_2025-03-18_14-45-56.png&amp;diff=1474</id>
		<title>File:Screenshot from 2025-03-18 14-45-56.png</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=File:Screenshot_from_2025-03-18_14-45-56.png&amp;diff=1474"/>
				<updated>2025-03-31T14:47:51Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1473</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1473"/>
				<updated>2025-03-31T14:43:08Z</updated>
		
		<summary type="html">&lt;p&gt;Camilachagascarv: /* Softwares */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Seja bem vindo a Wiki do VeRLab (Computer Vision and Robotics Laboratory - DCC - UFMG) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Regras de Conduta e Termo de Compromisso]] ===&lt;br /&gt;
=== [[Como rodar seu experimento]] ===&lt;br /&gt;
=== [[Trabalhando remotamente]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Dicas para escrever e apresentar sua publicação]] ===&lt;br /&gt;
=== [http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:AllPages  Relação de todas as páginas dessa wiki] ===&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Robot Robôs] ==&lt;br /&gt;
&lt;br /&gt;
==== Small size Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Main_Page/e-puck E-puck]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/HeRo HeRo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Espcopter Espcopter]&lt;br /&gt;
&lt;br /&gt;
==== Mobile Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Roomba Roomba]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kobuki Kobuki]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pioneer Pioneer - ActivMedia Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jackal Jackal - Clearpath Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Tamiya Tamiya TXT-1]&lt;br /&gt;
&lt;br /&gt;
==== Robot Arm ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kinova_Gen3_Ultra Gen3 Ultra lightweight robot arm - KINOVA]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Fenrir_Arm Fenrir]&lt;br /&gt;
&lt;br /&gt;
==== Multirotor ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ARdrone Parrot AR.Drone 2.0]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hummingbird AscTec Hummingbird]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pelican AscTec Pelican]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Iris 3DR IRIS+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/X8 3DR X8+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/DJI Tello]&lt;br /&gt;
&lt;br /&gt;
==== Fixed-Wing ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Aero 3DR Aero]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/E384 Drone E384]&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sensor Sensores] ==&lt;br /&gt;
==== Laser ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Laser_Hokuyo Hokuyo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/LaserVelodyne Velodyne]&lt;br /&gt;
&lt;br /&gt;
==== IMU (unidades inerciais, acelerômetro, magnetometro, barômetro e etc ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/IMU IMUs]&lt;br /&gt;
&lt;br /&gt;
==== Câmeras ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Camera_360 Camera 360]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GoPro GoPro]&lt;br /&gt;
* TODO Kinect One (Xbox One)&lt;br /&gt;
* TODO Kinect v2 (Xbox 360)&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ZED StereoLabs ZED(RGBD)]&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RealSense Intel Real Sense (RGBD)]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Asus_Xtion_PRO Asus Xtion PRO]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/WebCams WebCams]&lt;br /&gt;
&lt;br /&gt;
==== Realidade Virtual e Aumentada ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hololens HoloLens]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Oculus_Rift Oculus Rift]&lt;br /&gt;
&lt;br /&gt;
== Atuadores ==&lt;br /&gt;
* Dynamixel AX-12&lt;br /&gt;
* Dynamixel MX-64AT&lt;br /&gt;
* TODO Motor Servo&lt;br /&gt;
* TODO Interface Haptica&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Placas Controladoras e Sensor Nodes ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Arduino Arduino]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP32 ESP32]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP8266 ESP8266]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RaspberryPi Raspberry Pi]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jetson_Nano Jetson nano - Nvidia]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/mote Sensor Nodes]&lt;br /&gt;
&lt;br /&gt;
== Softwares ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity Singularity]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Docker Docker]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ROS ROS - Robot Operacional System]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GAZEBO Gazebo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Virtualenv Python Virtual Enviroment]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GitHub_do_Verlab GitHub do Verlab]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Windows S.O. Windows]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Linux S.O. Linux]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Pesquisa ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Impressora3D Impressora 3D]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Informática ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Cabo_de_Rede Montagem de Cabos de Rede]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Impressoras Impressoras]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/NoBreak No Break]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/HD Teste HD - smartctl]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/RotuladorPT80 Rotuladora PT80]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/PastaTermica Aplicação e Escolha de Pasta Térmica]&lt;br /&gt;
&lt;br /&gt;
== Ferramentas ==&lt;br /&gt;
* TODO&lt;br /&gt;
* [http://www.crvindustrial.com/blog/como-medir-parafusos-corretamente como medir parafusos]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] &lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
links&lt;br /&gt;
https://askubuntu.com/questions/15520/how-can-i-tell-ubuntu-to-do-nothing-when-i-close-my-laptop-lid&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Camilachagascarv</name></author>	</entry>

	</feed>