Как мы можем защитить наш исходный код
Используйте скомпилированный язык, который тривиально не декомпилируется (C ++, Go).Если вы используете интерпретированный язык, который включает в себя источник в контейнере (Javascript, Python, Ruby), когда у клиента есть копия изображения, для него тривиально запустить его или иным образом открыть его и посмотреть на ваш источник.
и структура БД
Нет конкретного способа сделать это, кроме защиты базы данных и кода приложения.Любой, кто может подключиться к базе данных, может довольно легко запросить схему.
Как мы можем синхронизировать код контейнера Docker с обновленным кодом?
Отправить клиенту новое изображениеи попросите их удалить существующий контейнер и создать новый.
Это важно и требует некоторого предварительного проектирования.Когда вы сделаете это, все, что было в локальной файловой системе контейнера, будет потеряно, а это значит, что вы никогда не сохраните в локальной файловой системе контейнера ничего, что вы не можете просто восстановить.У вас уже есть база данных, поэтому планируйте хранить там большую часть фактических данных.Если вы генерируете журналы, либо сгенерируйте их в stdout вашего процесса (чтобы основная система журналов Docker могла их собирать), либо используйте директорию хоста bind-mount, чтобы поместить их куда-то, их можно легко просмотреть.
Это такжемеханизм, используемый менеджерами кластеров, такими как Kubernetes.Вы можете сообщить контроллеру Kubernetes Deployment, что вам нужно 3 копии образа me / abc: 123.Если впоследствии вы скажете ему, что вместо этого вам нужно 3 реплики me / abc: 246, он запустит новые контейнеры с новым изображением, а затем удалит старые.
Обратно, вам никогда не придется думатьо «синхронизации кода» или иным способом входа в контейнеры вообще, и docker ps
должен быть в состоянии немедленно сообщить вам, какую версию системы использует клиент (по определенным тегам изображения).