41

Re: Пару запитань новачка у docker

kisilam написав:

Як звідки взяти?
Це могли бути самопідписний сертфиікат, куплений сертифікат або той же летсенкріпт, але його потрібно попереньо отримати і обновляти вчасно.

Так, це я перескочив на розділ далі, бо в мене ще були нез'ясовані питання щодо подальших кроків з деплоєм в Azure.

Повертаючись до цього вже опублікованого пункту, що тут означає tls_key?

42 Востаннє редагувалося kisilam (08.06.2023 16:13:49)

Re: Пару запитань новачка у docker

tls_key  -  зaкритий ключ пари ключ - сертифікат
tls_crt   -  відкритий сертифікат, який випущений на основі ключа.

Подякували: leofun011

43

Re: Пару запитань новачка у docker

https://replace.org.ua/post/183565/#p183565

44

Re: Пару запитань новачка у docker

А хто пробував ранити той же докер контейнер декілька разів на тому ж хості з різними портами?...

45

Re: Пару запитань новачка у docker

А  ньому щось має ранитись? Я думаю пам'ять швидко закінчиться

46 Востаннє редагувалося frz (10.08.2023 19:46:54)

Re: Пару запитань новачка у docker

Має ранитися процес завантаження даних в API і чомусь не можу поки запустити декілька процесів завантаження в одному контейнері.

З пам'яттю все гаразд, бо поки є місце на диску, я збільшую swap - вже 27 гіг.
Якщо це єдине зауваження, то думаю що можна йти далі.

Тоді залишаться питання до самого сервера API, який може сказати "йдіть всі в баню" і почати тупо повертати 500 Internal Server Error. Але це поки що поза межами моєї таски.

47

Re: Пару запитань новачка у docker

Виявляється, що якщо в docker-compose не вказати IP адрес для кожного контейнера в проекті, то воно "само" згенерує для них айпіхи і налаштує gateway. Щоправда, тоді це займе на декілька секунд більше часу ніж із прописаними вручну айпіхами.

48

Re: Пару запитань новачка у docker

Привіт всім, потребую "допомогу залу", чи принаймні зафіксувати тут свої думки.

$ /usr/bin/docker --version
Docker version 24.0.6, build ed223bc

Dockerfile:

RUN python -m unittest scan_3306_port.py

сам юніт тест:

import unittest
import nmap

class TestPortScan(unittest.TestCase):
    def test_scan(self):
        print("Scanning local network for hosts...")
        nm = nmap.PortScanner()
        nm.scan(hosts='172.20.0.0/16', arguments='-sn -n')
        hosts = [host for host in nm.all_hosts() if nm[host].state() == 'up']
        print(f"Found {len(hosts)} hosts on the local network: {', '.join(hosts)}")
        self.assertGreater(len(hosts), 0, 'No hosts found on the local network')

        print("Scanning each host for open 3306 ports...")
        for host in hosts:
            nm.scan(hosts=host, arguments='-p 3306')
            if 'tcp' in nm[host].all_protocols() and 3306 in nm[host]['tcp']:
                print(f"Host {host} has open 3306 port")
                return  # Return success code immediately after finding one host with open 3306 port
            else:
                print(f"Host {host} does not have open 3306 port")

        print("No hosts with open 3306 port found.")
        self.fail("No hosts with open 3306 port found.")  # Fail the test if no hosts with open 3306 port are found

if __name__ == '__main__':
    print("Running port scan test...")
    unittest.main(exit=False)  # Prevent unittest from exiting after running the test

Тепер ось що виводиться на екран в результаті команди $ /usr/bin/docker compose up --force-recreate

 => [server stage-0 32/36] RUN python -m unittest scan_3306_port.py                                                                         1981.6s

тобто жоден print в юніт тесті не виконується.

Від чого це залежить, які налаштування потрібно перевірити?...

49

Re: Пару запитань новачка у docker

Команда "docker compose up" і не повинна кудись перенаправляти вивід з контейнера. Її завдання полягає лише в тому, щоб запустити його і повідомити про результат. А чим там той контейнер зайнятий, байдуже.
Якщо хочете бачити результати роботи, то пишіть логи, або використовуйте "docker compose exec".

Подякували: leofun011

50

Re: Пару запитань новачка у docker

Ну в мене був інший юніт тест, який чомусь все ж виводив результати на екран в результаті тієї ж команди. Зараз ліниво, потім знайду.

51 Востаннє редагувалося frz (18.10.2023 20:23:51)

Re: Пару запитань новачка у docker

Torbins написав:

Команда "docker compose up" і не повинна кудись перенаправляти вивід з контейнера. Її завдання полягає лише в тому, щоб запустити його і повідомити про результат. А чим там той контейнер зайнятий, байдуже.
Якщо хочете бачити результати роботи, то пишіть логи, або використовуйте "docker compose exec".

А я таки не послухався і з допомогою різних AI-роботів добився свого :) Щоправда, "останній акорд" у вигляді поєднання команд в CMD допоміг не AI, а сам "написав в голові" під час споживання фірмового борщу від дружини.

Прихований текст

"коли весь світ валиться, піди з'їш пиріг" (с) Люди в чорному 3

Річ у тім, що CMD можна використати в Dockerfile лише один раз і лише після нього починають стартувати сервіси які описані в docker-compose.yml

команда для запуску цілої халабуди:

$ /usr/bin/docker compose -f docker-compose-custom1.yml up --build

Dockerfile:

CMD /bin/bash -c 'python3 -m unittest /app/tests/check_mysql_host_availability_ping.py && \ 
    python3 /app/src/manage.py runserver 0.0.0.0:82'

сам юніт тест:

import os
import subprocess
import time

# Get the MySQL host from the environment variable
mysql_host="179.30.0.10"
#mysql_host="172.20.0.5"
#mysql_host = os.getenv("MYSQL_HOST")

if not mysql_host:
    print("\n\n\nError! MYSQL_HOST environment variable is not set.\n\n\n")
    exit(1)

def is_mysql_host_available(host, timeout_seconds=360):
    start_time = time.time()
    
    while time.time() - start_time < timeout_seconds:
        try:
            subprocess.check_call(["ping", "-c", "1", host])
            return True
        except subprocess.CalledProcessError:
            pass  # Ping failed, continue looping
        
        # Sleep for a short duration before the next ping attempt
        time.sleep(1)

    return False

if is_mysql_host_available(mysql_host):
    subprocess.call(["/bin/bash", "-c", "echo 'MySQL host ping success.'"])
    print(f"\n\n\nSuccess! MySQL host '{mysql_host}' is available based on ping result.\n\n\n")
    exit(0)
else:
    print(f"\n\n\nError! MySQL host '{mysql_host}' is not available based on ping result.\n\n\n")
    exit(1)

Результат на екрані:

core-web-1      | PING 179.30.0.10 (179.30.0.10) 56(84) bytes of data.
core-web-1      | 64 bytes from 179.30.0.10: icmp_seq=1 ttl=64 time=0.128 ms
core-web-1      | 
core-web-1      | --- 179.30.0.10 ping statistics ---
core-web-1      | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
core-web-1      | rtt min/avg/max/mdev = 0.128/0.128/0.128/0.000 ms
core-web-1      | MySQL host ping success.
core-web-1      | 
core-web-1      | Success! MySQL host '179.30.0.10' is available based on ping result.
core-web-1      | 
core-web-1      | 

52

Re: Пару запитань новачка у docker

Воно то наче й працює, але у цього способу стільки обмежень...

53

Re: Пару запитань новачка у docker

Torbins написав:

Воно то наче й працює, але у цього способу стільки обмежень...

Мене поки влаштовує. Ну хіба що я б трохи переписав CMD щоб процес не продовжувався у випадку коли фейлиться юніттест (чи хоча б один з юніттестів, бо їх туди можна напхати більше). Решта поки все ок.

54

Re: Пару запитань новачка у docker

Torbins написав:

Воно то наче й працює, але у цього способу стільки обмежень...

Чи маєте чимсь конкретним поділитися?

55 Востаннє редагувалося frz (23.10.2023 00:01:17)

Re: Пару запитань новачка у docker

Може комусь досвідченішому буде кумедно, але тема для новачків, тому поділюся.

1) докер не видаляє автоматично дані з volume, якщо не зробити це примусово - власне для цього volume і створений, щоб зберігати дані )) та все одно це може бути неочевидно для когось, хто вже знищив контейнер, збілдив з нуля, а певні очікувані зміни не застосувалися

2) доступ до mysql в докері від імені root не працюватиме ззовні, якщо не вказати в налаштуваннях docker-compose.yml

    environment:
      MYSQL_ROOT_HOST: "%"

Хоч від цього виду програмістського церебрального сексу я таки в результаті отримав задоволення, однак зекономлений час можна було б використати більш продуктивно, тому ділюся цією для когось тривіальною знахідкою. Може комусь збереже декілька дупо-годин.

56

Re: Пару запитань новачка у docker

В одному контейнері зміни в SRC потребують перезапуску контейнера, в іншому - не потребують. Не розумію від чого залежить ця поведінка.

57 Востаннє редагувалося frz (11.06.2024 19:03:09)

Re: Пару запитань новачка у docker

Всім привіт

Раніше у мене не було специфічної конфігурації мережі, і вона працювала нормально.
Справа в тому, що для налаштування VPN-доступу мені довелося поділитися зовнішньою та внутрішньою IP-адресами сервісу з людиною з якою співпрацюю. Людина встановила зі свого боку всі необхідні політики безпеки, і все працювало супер.

Далі річ у тому, що мені довелося перевстановити сервер, а потім, коли я знову створив свій докер-контейнер, внутрішня IP-адреса стала іншою. Тепер я можу поділитися новою внутрішньою IP-адресою сервісу з контрагентом, але як на мене, це буде не зовсім професійно, створює додаткові дії, що вимагаються від іншої, і може бути зроблено лише в крайньому випадку.

Тому моє питання полягає в тому, як встановити потрібну внутрішню IP мережу вручну?

Вона була 172.18.0.0/16, зараз вона стала чимось на зразок 172.19.0.0/16 або близько того.
Після того, як я встановив 172.18.0.0/16 вручну, служба доступна всередині контейнера докера, коли я входжу в нього і перевіряю всередині за допомогою чогось типу curl, telnet або nmap

docker exec -it abcde /bin/bash

але тоді чомусь сервіс не доступний з хост-машини.

Мій файл docker-compose.yml:

version: '3.9'
services:
  jupyter:
    build: .
    privileged: true
    ports:
      - "8888:8888"
    networks:
      mynetwork:
        ipv4_address: 172.18.0.2

networks:
  mynetwork:
    ipam:
      config:
        - subnet: 172.18.0.0/16

(сервіс jupyter тут для прикладу, але те саме відбувається теж з будь-яким справжнім сервісом)

Хто шарить, підкажіть плз.