GNU/Linux >> Belajar Linux >  >> Linux

Cara SSH ke Wadah Docker

Bagaimana Anda menggunakan SSH untuk memasukkan wadah Docker? Pendekatan tradisional terdiri dari dua langkah:

Langkah 1 :SSH ke server Linux jarak jauh Anda (jika Anda menjalankan container di sistem jarak jauh).‌

ssh [email protected]_ip_address

Langkah 2 :Dan kemudian Anda memasukkan shell wadah Docker Anda yang sedang berjalan dalam mode interaktif seperti ini:

docker exec -it container_ID_or_name /bin/bash

Dengan itu, Anda dapat menjalankan perintah Linux atau melakukan pemeliharaan layanan yang berjalan di dalam wadah.

Tidak ada yang salah dengan cara di atas. Ini adalah cara tradisional dan direkomendasikan untuk memasukkan kontainer dengan mudah.

Namun, dengan beberapa upaya, Anda sebenarnya dapat SSH ke dalam wadah yang berjalan secara langsung, tanpa masuk ke sistem host terlebih dahulu.

SSH ke dalam wadah Docker:Tapi mengapa?

Ini agak aneh, bukan? Masuk ke wadah, melalui SSH. Meskipun kedengarannya tidak tradisional, itu mungkin tetap berguna bagi Anda, sesuai dengan kasus penggunaan Anda.

Berikut adalah beberapa hal yang dapat Anda capai dengan kemampuan SSH ke dalam wadah:

  1. Anda dapat menyiapkan palsu host untuk setiap penyerang potensial. Dengan menggunakan port non-standar untuk daemon SSH host Anda, dan melayani koneksi SSH di port 22 untuk penyerang.
  2. Tingkat otorisasi yang benar-benar terpisah, yaitu login sandi atau kunci ssh yang berbeda, semuanya terserah Anda dan terpisah dari apa pun yang digunakan host Anda saat ini.
  3. Menjalankan proses jarak jauh otomatis apa pun, tanpa menggunakan kunci ssh yang sama yang digunakan untuk masuk oleh individu tim Anda.

Sebelum saya menunjukkan cara melakukan semua hal di atas, saya akan memandu Anda melalui gagasan tentang cara kerjanya.

Menggunakan login ssh untuk wadah yang ada' tidak disarankan. Itu menghilangkan inti dari isolasi host.

Menyiapkan akses SSH untuk container Docker [Intermediate to Expert]

Jika Anda tidak tertarik dengan cara kerja ini, Anda dapat mengabaikan bagian ini dengan aman. Saya akan menunjukkan kepada Anda dengan wadah dummy. Anda dapat mengikuti langkah-langkah untuk berlatih.

Jalankan wadah

Pertama, Anda perlu memulai wadah Docker. Saya akan menggunakan alpine:latest yang sangat kecil gambar untuk saat ini. Mulai wadah dengan perintah ini:

docker run --rm --name ssh-test -it -p 7655:22 alpine:latest ash 

Beberapa poin penting mengenai opsi baris perintah adalah sebagai berikut

  • Dengan --rm pilihan, Anda tidak perlu menghapus penampung secara eksplisit setelahnya.
  • The -it ada opsi sehingga Anda dapat memiliki cangkang penampung yang berfungsi dan interaktif.
  • Terakhir, Anda mengikat port kontainer 22 ke nomor port host 7655 (atau nomor port lain yang belum digunakan oleh daemon SSH di sistem host Anda). Perhatikan port mana yang Anda gunakan.

Siapkan daemon SSH dalam wadah

Sekarang Anda perlu menginstal server ssh di dalam wadah. Di Alpine Linux, Anda dapat menggunakan perintah ini:‌

apk update; apk add openssh-server

Selanjutnya, Anda perlu mengubah parameter konfigurasi dengan cepat untuk memungkinkan login root. Anda dapat melakukannya dengan mengedit file /etc/ssh/sshd_config secara manual atau menggunakan perintah ini:

sed -E 's/^#(PermitRootLogin )no/\1yes/' /etc/ssh/sshd_config -i 

Buat kunci host dengan:

ssh-keygen -A

Terakhir, jalankan server ssh, jalankan /usr/sbin/sshd & . Periksa apakah dijalankan dengan ps aux .

Setel sandi untuk akun root penampung Anda

Secara default, akun root penampung Anda tidak memiliki kata sandi. Jika Anda membuka akses SSH, Anda harus mengatur kata sandi untuk akun root.

Anda dapat menggunakan perintah passwd tanpa opsi apa pun dan ikuti petunjuk di layar:

passwd

Masuk ke wadah melalui SSH

Dari host lain, coba login ke container sekarang.

ssh [email protected]_address_of_host_server -p port_number

Anda tidak memerlukan -p opsi jika Anda terikat ke port 22 sebelumnya. Untuk IP gunakan alamat IP server host (bukan container).

Saat Anda menjalankan perintah, Anda akan melihat output yang mirip dengan ini:

[email protected]:/mnt/data/documents/Linux Handbook/container-ssh$ ssh [email protected]
   [email protected]'s password: 
   Welcome to Alpine!
   
   The Alpine Wiki contains a large amount of how-to guides and general
   information about administrating Alpine systems.
   See <http://wiki.alpinelinux.org/>.
   
   You can setup the system with the command: setup-alpine
   
   You may change this message by editing /etc/motd.
   
   c4585d951883:~#

Bagaimana cara kerjanya?

Ini dapat dipahami lebih baik secara visual. Perhatikan diagram berikut:‌

Pikirkan wadah sebagai mesin virtual yang port 22nya direkatkan dengan port host 7655 (atau yang Anda pilih). Ini memungkinkan Anda untuk menjalankan dua proses ssh yang berbeda pada mesin yang sama yang terikat ke port yang berbeda.

Katakanlah Anda menggunakan beberapa port lain untuk SSH pada sistem host dan merekatkan port 22 dengan port container. Sekarang, jika seseorang mencoba terhubung ke server host menggunakan port default SSH 22, dia akan berada di dalam sistem file root container.

Menyiapkan SSH untuk container menggunakan Docker Compose [Experts]

Tidak adil jika saya meninggalkan Anda di tempat ini tanpa memberikan beberapa opsi yang dapat diandalkan untuk wadah server SSH.

Jika Anda ingin memanfaatkan server ssh yang berbeda dan terisolasi dengan sistem file root terpisah yang berjalan di sistem jarak jauh Anda, itu bisa dilakukan, tetapi tidak dengan mengikuti panduan sebelumnya, yaitu menginstal dan mengonfigurasi sshd pada basis yang sedang berjalan wadah.

Hanya karena tidak mudah direproduksi, setiap perubahan yang Anda buat pada container yang sedang berjalan, tidak persisten, container restart dan semuanya hilang.

Jadi, di sini saya memberi Anda cara yang lebih sederhana, mudah direproduksi, dan dapat dikonfigurasi untuk menerapkan wadah server SSH pada host jarak jauh Anda.

Prasyarat

Anda harus menginstal docker compose dengan jelas. Pengetahuan dasar tentang komposisi buruh pelabuhan adalah suatu keharusan di sini.

Karena Anda akan mengakses server melalui kunci SSH, Anda perlu menambahkan kunci SSH publik dari sistem lokal Anda ke direktori server Linux host Anda di mana file docker-compose berada dan menyimpan nama "id_rsa.pub" hanya untuk memastikan.

Siapkan file penulisan

Saya sarankan menggunakan linuxserver/openssh-server gambar. Ini adalah gambar yang sangat ringan dengan opsi konfigurasi yang cukup baik melalui variabel lingkungan.

Di sini seluruh file penulisan akan ditempelkan. Salin ini ke beberapa lokasi di server Anda dan beri nama file docker-compose.yaml .‌

version: "3.7"

services:
    ssh:
        image: "linuxserver/openssh-server"
        ports:
            - "22:2222"
        volumes:
            - "./id_rsa.pub:/pubkey:ro"
        environment:
            PUID: ${ID}
            PGID: ${ID}
            TZ: ${TZ}
            PUBLIC_KEY_FILE: "/pubkey"
            SUDO_ACCESS: "false"
            PASSWORD_ACCESS: "false"
            USER_NAME: ${USER_NAME}
        restart: "always"

File penulisan yang cukup kecil, bukan? Izinkan saya menjelaskan bagian berbeda dari file penulisan ini.

Volume: Anda hanya memiliki satu ikatan pengikat, yang memasang kunci publik di dalam wadah sebagai pubkey . Ini juga hanya bisa dibaca.

Port: Proses sshd di dalam container berjalan pada port 2222. Itu sebabnya saya telah mengikat port tersebut ke port host saya 22. Ubah 22 sesuai dengan kebutuhan Anda tetapi ingat bahwa Anda akan memerlukannya untuk masuk ke container melalui SSH nanti.

Variabel Lingkungan:

  • USER_NAME :Pengguna dalam wadah, Anda akan masuk sebagai dari mesin lokal Anda.
  • PUID &PGID:UID dan GID USER_NAME. Ini opsional, penampung akan menetapkan sepasang ID non-root secara otomatis jika variabel lingkungan tidak disetel.
  • TZ:Zona waktu Anda saat ini. Anda bisa mendapatkannya dengan cat /etc/timezone .
  • PUBLIC_KEY_FILE:Lokasi file kunci publik
  • SUDO_ACCESS &PASSWORD_ACCESS:Cukup jelas.

Kebijakan mulai ulang: Saya telah menetapkan kebijakan restart "selalu" yang akan memulai ulang wadah bahkan jika daemon dimuat ulang.

Terapkan layanan

Untuk memudahkan Anda, saya telah membuat skrip Bash yang akan menanyakan beberapa pertanyaan, dan berdasarkan jawaban itu akan menyebarkan layanan.

#! /usr/bin/env bash

vars=("ID" "USER_NAME")
defaults=("991" "dummy")
questions=("What'd be your preferred UID & GID for the username of your choice? [default] " "Your preferred username for the container? [dummy] ")

put()
{
    echo "$1" >> .env
}

for i in {1..0}; do
    read -p "${questions[$i]}" ans
    case $ans in
        ""|"default")
            put "${vars[$i]}=${defaults[$i]}" ;;
        *)
            put "${vars[$i]}=$ans" ;;
    esac
done

put "TZ=$(cat /etc/timezone)"

docker-compose up -d

Saya menyimpan skrip bash sebagai deploy.sh di direktori yang sama tempat file docker-compose berada.

Sekarang, jika Anda menjalankan skrip ini, skrip ini akan menanyakan beberapa pertanyaan kepada Anda dan kemudian menjalankan wadah buruh pelabuhan:

bash deploy.sh

Setelah selesai, coba masuk ke server:

ssh [email protected] -p port 

Itu menyimpulkan artikel ini tentang ssh dengan wadah buruh pelabuhan. Jika Anda menyukainya, atau memiliki hal lain untuk disebutkan, jangan ragu untuk berkomentar di bawah atau tweet ke saya @imdebdut.

Jika Anda ingin saya menulis artikel lain, silakan beri tahu saya.


Linux
  1. Bagaimana Cara Ssh Ke Direktori Tertentu?

  2. Cara Memasang Direktori Host Ke Wadah Docker

  3. Cara Menetapkan IP Statis ke Wadah Docker

  1. Bagaimana Cara Masuk Ke Wadah Lxc?

  2. Cara Mendaftar Kontainer Docker

  3. Cara Keluar dari Kontainer Docker

  1. Cara Menjalankan MySQL Dalam Wadah Docker

  2. Cara SSH Ke Wadah Docker

  3. Cara Menginstal Vim di Wadah Docker