[PYTHON] J'ai essayé de créer un environnement dans lequel le travail dans le conteneur Docker sur le serveur distant peut être effectué directement à partir du code VS local avec une connexion SSH

Je suis Ishikawa de NTT Docomo. C'est ma deuxième année en tant que membre de la société.

Récemment, pour diverses raisons, le nombre d'entreprises et d'écoles qui recommandent le travail à domicile et la recherche à domicile a augmenté.

Dans de telles circonstances, le nombre de personnes qui travaillent à domicile a considérablement augmenté, et à ce moment-là, si je me concentrais sur la création d'un environnement pour le développement à distance, je pourrais me sentir plutôt bien, alors veuillez vous y référer.

Vous pourrez travailler à l'intérieur du conteneur Docker sur le serveur distant comme si vous travailliez localement.

En tant que prémisse de cette construction d'environnement

ça ira.

Il existe également une méthode utilisant Docker Desktop, mais je l'ai trouvée un peu gênante, donc cette fois je vais vous présenter une méthode qui ne l'utilise pas.

L'environnement achevé

Vous pourrez effectuer les opérations suivantes dans le conteneur Docker configuré sur le serveur distant uniquement sur l'écran VS Code du PC local.

--Maintenance de l'environnement d'exécution --Modifier le fichier programme --Exécuter de programme

En plus de cela, vous pouvez modifier et transférer des fichiers dans le conteneur à l'aide de Cyberduck et calculer à l'aide du GPU.

Créer un conteneur

Ensuite, comment créer un environnement immédiatement.

Commençons par établir une connexion SSH sur le serveur distant.

Ici, nous utiliserons la connexion par authentification par clé RSA. (* La méthode de paramétrage de l'authentification par clé RSA est générale et correcte, elle est donc omise ici)

Après vous être connecté au serveur distant avec une connexion SSH, créez le fichier docker suivant à n'importe quel emplacement sur le serveur distant. Le nom du fichier est "dockerfile".

#Image de la base. Les éléments suivants sont adaptés à mon environnement GPU, veuillez donc choisir celui qui vous convient.
#Pour ceux qui n'utilisent pas de GPU"ubuntu:18.04"Etc. va bien.
FROM nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04

#Le nom de la personne qui l'a fait.
LABEL maintainer "dcm_ishikawa"

#Importez les éléments minimum requis et les éléments requis pour la connexion SSH.
RUN apt-get update --fix-missing && \
    apt-get install -y apt-utils && \
    apt-get install -y software-properties-common vim curl unzip htop openssh-server wget procps

#Paramètres de connexion SSH.
# "password"Veuillez remplacer le lieu par un mot de passe.
#Ubuntu 18 est défini de différentes manières.C'est un travail de faire une connexion SSH en tant qu'utilisateur root en 04.
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN echo '\nPermitRootLogin yes' >> /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

#Paramètres GPU. Non requis si vous n'utilisez pas de GPU.
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES utility,compute

#Paramètres de connexion SSH.
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

#Vous permet de démarrer une connexion SSH lorsque vous exécutez.
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Après avoir créé le dockerfile, exécutez la commande suivante dans le même emplacement où vous avez enregistré le dockerfile.

docker image build . -t [imagename]
docker run --name [containername] -d -p 10000:22 -p 18888:8888 [imagename]

«[imagename]» est n'importe quel nom d'image et «[containername]» est n'importe quel nom de conteneur.

Pour -p 10000: 22, 10000 est un numéro de port arbitraire lors du passage du port au serveur distant.

Pour -p 18888: 8888, 18888 est le numéro de port lors de l'accès avec Jupyter Notebook sur le navigateur. Non requis lorsque vous n'utilisez pas Jupyter Notebook ou lorsque vous utilisez Juoyter Notebook sur VS Code.

Si vous tapez la commande suivante sur le serveur distant et la placez dans le conteneur, la création du conteneur est réussie.

ssh [email protected] -p 10000

Un mot de passe vous sera demandé lors de la connexion, mais le mot de passe sera celui décrit dans le dockerfile.

Une fois connecté, créez ~ / .ssh / allowed_keys dans le conteneur et entrez la clé publique créée sur votre PC local.

Une fois que cela est fait, utilisez ʻexit` pour déconnecter la connexion SSH au conteneur.

De plus, créez ~ / .ssh / authorized_keys sur le serveur distant et entrez la clé publique créée sur le PC local.

Ceci termine le travail sur le serveur distant. Déconnectons également la connexion SSH au serveur distant.

Paramètres du code VS

Ensuite, c'est le réglage du PC local.

Ajoutez la description suivante sur le serveur distant et SSH au conteneur sur le serveur distant dans ~ / .ssh / config sur le PC local. (Créez ce fichier s'il n'existe pas en premier lieu)

~/.ssh/config


Host Server01                       #Tout nom de connexion
  HostName xxx.xxx.xxx.xxx          #Adresse du serveur distant
  User username                     #Nom d'utilisateur sur le serveur distant
  IdentityFile ~/.ssh/id_rsa        #Le chemin de la clé privée créée

Host Server01:Container             #Tout nom de connexion
  HostName 127.0.0.1
  User root
  IdentityFile ~/.ssh/id_rsa        #Comme ci-dessus
  Port 10000                        #Numéro de port transmis lors de l'exécution du conteneur
  ProxyCommand ssh -W %h:%p Server01 #Server01 est le même que celui de la première ligne

Ensuite, installez l'extension pour la connexion SSH de VS Code à partir de l'URL suivante.

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-explorer

Démarrez VSCode et appuyez sur le bouton de connexion à distance sur la gauche.

画像1.png

Le nom de connexion du conteneur spécifié dans ~ / .ssh / config apparaîtra dans la liste. (Ici Server01: Container)

Cliquez sur la marque de dossier à droite du nom de la connexion pour terminer la connexion VS Code au conteneur.

画像2.png

Sur l'écran qui apparaît, il y a un bouton qui dit "Ouvrir le dossier". En appuyant dessus, vous pouvez sélectionner n'importe quel emplacement dans le conteneur, donc sélectionnez l'emplacement que vous souhaitez ajouter à l'espace de travail.

Je vous remercie pour votre travail acharné. Ceci termine la construction de l'environnement. Voici comment l'utiliser. Se il vous plaît se référer.

Exécution de la commande

Vous pouvez ouvrir la ligne de commande sur le conteneur en cliquant sur les boutons dans l'ordre des images.

画像3.png

Installation de Python

Utilisez wget depuis la ligne de commande du conteneur pour télécharger et installer des programmes d'installation tels que Anaconda et Miniconda.

(Exemple)


wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
rm Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc

Lancez Jupyter Notebook

Tout d'abord, installez l'extension Python dans l'espace de travail du conteneur. ** (* Dans certains cas, il n'est pas installé par défaut!) ** Installation: https://marketplace.visualstudio.com/items?itemName=ms-python.python

Ensuite, installez Jupyter à partir de la ligne de commande à l'intérieur du conteneur.

pip install jupyter

Tapez la commande pour démarrer Jupyter.

Lors de l'utilisation sur VS Code

Ouvrez la palette de commandes avec command + shift + P et Entrez > Create New Blank Jupyter Notebook et appuyez sur ʻEnter`. Avec une mise à jour récente, c'est tout ce dont vous avez besoin pour commencer. C'est incroyable.

Lors de l'utilisation sur un navigateur

Exécutez la commande suivante sur la ligne de commande dans le conteneur.

jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root

** Notez qu'il y a certaines choses qui ne peuvent pas être faites avec la commande jupyter notebook seule. ** ** Je pense qu'il est pratique de le définir avec un alias.

Ce qui suit sera renvoyé à la ligne de commande, donc copiez la partie xxxxxxxxxxxxxxx.

http://127.0.0.1:8000/?token=xxxxxxxxxxxxxxx

Ouvrez votre navigateur local et accédez à la barre d'adresse Entrez «[Adresse IP du serveur distant]: 18888» et appuyez sur «Entrée». («18888» est le numéro de port spécifié lors de l'exécution du docker.) Après cela, il vous sera demandé un mot de passe ou un jeton, alors entrez le xxxxxxxxxxxxxxx que vous avez copié précédemment et vous pourrez utiliser Jupyter Notebook dans votre navigateur.

Connexion avec Cyberduck

Vous pourrez vous connecter à partir de «Nouvelle connexion» avec les paramètres suivants.

--Sélectionnez SFTP --Server: adresse du serveur distant --Port: Le numéro de port spécifié pendant l'exécution (10000 ici) --Nom d'utilisateur: root

Lorsque la connexion ne fonctionne pas

Si votre connexion SSH de code VS ou de ligne de commande ne fonctionne pas, il est probable que vous ayez reconstruit le conteneur plusieurs fois et que vous ayez un conflit avec known_hosts.

Il peut être résolu en supprimant la description appropriée dans ~ / .ssh / known_hosts sur le PC local, ou en la renommant en ~ / .ssh / known_hosts.old.

À la fin

Qu'as-tu pensé. J'espère que cet article vous aidera dans votre travail à domicile et dans vos recherches. Continuons à travailler ensemble et faisons de notre mieux!

Recommended Posts

J'ai essayé de créer un environnement dans lequel le travail dans le conteneur Docker sur le serveur distant peut être effectué directement à partir du code VS local avec une connexion SSH
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
Modifiez le fichier du serveur de destination de la connexion SSH sur le serveur avec VS Code
Connectez-vous à un serveur distant avec SSH
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) à l'aide de VS Code + Remote Containers
Comment créer facilement un environnement où le code Python peut s'exécuter sur Jupyter sans polluer l'environnement local
J'ai essayé d'envoyer du courrier depuis le serveur Sakura avec flask-mail
Puisqu'il n'y a pas de description sur la façon de créer un environnement pour nnabla avec Docker, y compris le GPU, je l'ai essayé moi-même Partie 1
Comment déboguer un programme Python en se connectant à distance à un conteneur Docker dans un environnement WSL2 avec VS Code
J'ai essayé de créer un environnement capable d'acquérir, de stocker et d'analyser les données de tweet en WSL (bash)
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
Modifiez et déboguez le code dans Raspberry Pi avec la fonction de connexion SSH de VSCode
Procédure d'attachement et de débogage de VS Code vers Jupyter Lab sur un serveur distant
mong - J'ai essayé de porter le code qui génère de manière aléatoire le nom du conteneur Docker vers Python -
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
[Go + Gin] J'ai essayé de créer un environnement Docker
[Deep Learning from scratch] J'ai essayé d'expliquer la confirmation du gradient d'une manière facile à comprendre.
L'image est affichée dans l'environnement de développement local, mais l'image n'est pas affichée sur le serveur distant de VPS.
J'ai essayé d'exécuter le système de reconnaissance vocale hors ligne Julius avec python dans l'environnement virtuel Docker
Mettez Ubuntu dans Raspi, mettez Docker dessus et contrôlez GPIO avec python à partir du conteneur
J'ai essayé de créer un environnement où vous pouvez avoir une réunion Zoom amusante avec Linux (Ubuntu) + Zoom + OBS Studio + effets sonores