em Geral

Acessando container Docker via SSH

Há diversas maneiras de resolver este problema. Eu resolvi criar este tutorial com a técnica que eu utilizo para disponibilizar o acesso remoto dentro de um ambiente dockerizado via SSH.

Para uma manutenção rápida ou até mesma para liberar o acesso para um cliente dentro do seu ambiente o OpenSSH é a melhor opção.
Estou considerando que você já tenha o Docker instalado e configurado em seu ambiente. Vou exemplificar o cenário que eu tive que resolver por aqui e acredito que isto irá ajudar outros devs com a mesma dúvida.

Cenário
– Vamos imaginar que temos um ambiente WordPress e o cliente precisa do acesso shell na máquina para fazer as devidas manutenções e até mesmo configurar um cronjob na máquina.

Instalação

Primeiramente você deve baixar a imagem do Docker com o OpenSSH. Eu deixei uma imagem pronta para você utilizar é só fazer o pull

docker pull jaccon/openssh:latest

Com o comando acima você irá baixar a imagem Docker do OpenSSH para seu ambiente, vamos partir para configurar o nosso Docker Compose.

Perceba que no exemplo abaixo nós já temos um ambiente com um WordPress/PHP, MySQL, phpMyAdmin e agora vamos iniciar o OpenSSH dentro do container.

version: '2'

services:
  app_db:
    image: mysql:5.7
    container_name: app_db
    ports:
      - "8010:3306"
    volumes:
      - ./database/data:/var/lib/mysql
      - ./database/initdb.d:/docker-entrypoint-initdb.d
      - ./etc/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: [email protected]@12345678 # any random string will do
      MYSQL_DATABASE: wordpress # the name of your mysql database
      MYSQL_USER: wordpress # the name of the database user
      MYSQL_PASSWORD: tvFJHsQ2yhQDyrTp # the password of the mysql user

  app_website:
    depends_on:
      - app_db
    image:  wordpress:latest # we're using the image with php7.1 
    container_name: app_website
    ports:
      - "8011:80"
    restart: always
    links:
      - app_db:mysql
    volumes:
      - ./src:/var/www/html
      - ./logs:/var/log/apache2/
      - ./scripts/:/scripts/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini

  app_ssh:
    image: jaccon/openssh  
    container_name: app_ssh
    ports:
      - "8012:22"
    restart: always
    links:
      - app_db:mysql
    volumes:
      - ./src:/var/www/html
      - ./logs:/var/log/apache2/
      - ./scripts/:/scripts/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini
      - ./etc/passwd:/etc/passwd
      - ./etc/ssh:/etc/ssh
 
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: app_phpmyadmin
    volumes:
      - ./phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
    links:
      - app_db
    ports:
      - "8013:80"
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=app_db

Veja que nós temos uma entrada app_ssh. É ai que iremos configurar dentro do ambiente op OpenSSH que dará acesso ao conteúdo Dockerizado do servidor Apache onde está rodando o WordPress.

Em resumo nós teremos a entrada no nosso docker-compose.yml que seria:

 app_ssh:
    image: jaccon/openssh  
    container_name: app_ssh
    ports:
      - "8012:22"
    restart: always
       volumes:
      - ./src:/var/www/html
      - ./logs:/var/log/apache2/
      - ./scripts/:/scripts/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini
      - ./etc/passwd:/etc/passwd
      - ./etc/ssh:/etc/ssh

Depois de iniciar o container pode ser que você tenha que iniciar o openssh e setar a senha do seu usuário. Isto é simples basta executar os comandos abaixo

docker exec -it app_ssh /bin/bash
echo root:[email protected] |chpasswd
/etc/init.d/ssh start

Feito isto o seu servidor SSH já estará configurado. Para acessar basta digitar o endereço ip do seu ambiente e depois adicionar a porta 8012 que foi a porta que foi mapeada para o OpenSSH

ssh [email protected] -p 8012

O comando acima é um exemplo de conexão no qual no exemplo o endereço do ambiente é 192.168.0.1

Se você tiver alguma dúvida utilize os comentários para entrar em contato

Obrigado!