Docker Quick Learning (3) Сеть, пользователи и процессы

машинное обучение

В предыдущей статье мы представили основные методы и принципы обучения Docker, а также три основных элемента: образы, контейнеры и хранилища. Также есть Dockerfiles и тома данных.

обзор:

Советы по началу работы с Docker Xiaobai и основные принципы Введение

Быстрое обучение Docker (1) Образы и контейнеры

Быстрое обучение Docker (2) Dockerfile и объем данных

Сегодня Xiaojiu познакомит вас с пользователями, сетями и процессами. Во время обучения очень важно иметь глубокое понимание концепций и принципов работы в сети Docker. Далее, давайте учиться вместе~

Интернет

Поскольку контейнер используется для развертывания приложений, другие службы должны часто обращаться к нему, и крайне важно иметь глубокое понимание концепций и принципов работы сети Docker.

сеть

Для системы Docker по умолчанию существует функция маршрутизации контейнеров, Проще говоря, Docker генерирует IP-адрес интрасети для каждого развернутого контейнера. Например, когда контейнер запускается под Docker, Docker автоматически назначает 3 адреса интрасети:

容器1 172.18.0.1
容器2 172.18.0.2
容器3 172.18.0.23

Для любого из Контейнеров IP-адрес может использоваться как канал доступа.

порт

Каждый Контейнер можно сопоставить с портом на сервере, чтобы облегчить внешний доступ к Контейнеру. Например: MySQL работает на 172.18.0.1, и сам MySQL имеет внешний доступ. В это время, как получить доступ к этому MySQL через IP-адрес сервера?

  1. Сначала выполните сопоставление портов контейнера 1 и добавьте его к порту 3306, сопоставленному с сервером.
  2. Затем к MySQL можно получить доступ через IP-адрес сервера: 3306.

Вопрос: Почему приложение в Контейнере имеет номер порта? Контейнер имеет самую простую операционную систему, если есть операционная система, то доступ к программе будет через порт.

Пользователь

Вообще говоря, Docker не рекомендует запускать процесс контейнера от имени пользователя root, поэтому создатель Dockerfile создаст в коде обычного пользователя, а затем запустит процесс от имени обычного пользователя.

Если обычный пользователь не создан, контейнер по умолчанию будет работать с привилегиями root.

Корень контейнера и корень хоста - это один и тот же пользователь, но права доступа корня контейнера ограничены.Если добавляется --привилегированный=true, то это эквивалентно корню хоста.

img

UID

Хотя существует концепция имени пользователя, поскольку объект пользователя, управляемый ядром Linux, идентифицируется по uid, в этом разделе вместо имени пользователя используется uid.

Поскольку контейнер — это независимый процесс, основанный на технологии виртуальной изоляции и разделяющий ядро ​​операционной системы, а ядро ​​управляет только одним набором uid и gid, uid и gid в контейнере фактически представляют собой набор системы с ядром хоста.

Поймите природу пользовательских разрешений, uid, gid и т. д. в контейнере, ключ в том, чтобы понять «Linux User Namespace».

Когда процесс-контейнер пытается записать файл, ядро ​​проверяет uid и gid контейнера, чтобы убедиться, что у него достаточно привилегий для изменения файла.

повышение прав

Мы найдем в Dockerfile, что когда нам нужно повысить права пользователя, мы используем не su, а комбинацию следующих двух команд

  • gosu
  • exec

процесс

Некоторые люди говорят, что сущностью контейнера является процесс. Независимо от того, является ли это предложение абсолютным или нет, важность видимых процессов для контейнеров очевидна.

процесс запроса

запустивdocker top containeridпроцесс запроса.

Для простоты понимания давайте сначала запустим приложение Docker:docker-wordpress(opens new window)

Затем запросите процессы каждого контейнера отдельно.

[root@test ~]# docker top wordpress-mysql
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             22107               22080               0                   Aug01               ?                   00:01:52            mysqld

[root@test ~]# docker top wordpress
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
33                  807                 22090               0                   Aug01               ?                   00:00:00            apache2 -DFOREGROUND
33                  1675                22090               0                   Aug01               ?                   00:00:01            apache2 -DFOREGROUND
33                  2935                22090               0                   Aug01               ?                   00:00:00            apache2 -DFOREGROUND
33                  21955               22090               0                   Aug01               ?                   00:00:00            apache2 -DFOREGROUND
root                22090               22054               0                   Aug01               ?                   00:00:06            apache2 -DFOREGROUND
33                  26327               22090               0                   Aug01               ?                   00:00:00            apache2 -DFOREGROUND
33                  28793               22090               0                   Aug01               ?                   00:00:01            apache2 -DFOREGROUND
33                  30253               22090               0                   Aug01               ?                   00:00:00            apache2 -DFOREGROUND
33                  31445               22090               0                   Aug01               ?                   00:00:01            apache2 -DFOREGROUND
33                  31955               22090               0                   Aug01               ?                   00:00:01            apache2 -DFOREGROUND
33                  32734               22090               0                   Aug01               ?                   00:00:01            apache2 -DFOREGROUND

Видно, что некоторые контейнеры запускают только один процесс, в то время как некоторые контейнеры запускают несколько процессов (Apache, как HTTP-сервер, по своей сути является многопроцессорным).

Вы также можете войти в один из контейнеров и запуститьps -efКоманда для просмотра процесса:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug01 ?        00:00:06 apache2 -DFOREGROUND
www-data   153     1  0 Aug01 ?        00:00:01 apache2 -DFOREGROUND
www-data   181     1  0 Aug01 ?        00:00:00 apache2 -DFOREGROUND
www-data   193     1  0 Aug01 ?        00:00:01 apache2 -DFOREGROUND
www-data   209     1  0 Aug01 ?        00:00:01 apache2 -DFOREGROUND
www-data   214     1  0 Aug01 ?        00:00:01 apache2 -DFOREGROUND
www-data   215     1  0 Aug01 ?        00:00:00 apache2 -DFOREGROUND
www-data   218     1  0 Aug01 ?        00:00:01 apache2 -DFOREGROUND
www-data   219     1  0 Aug01 ?        00:00:00 apache2 -DFOREGROUND
www-data   224     1  0 Aug01 ?        00:00:00 apache2 -DFOREGROUND
www-data   225     1  0 Aug01 ?        00:00:00 apache2 -DFOREGROUND
root       253     0  0 06:17 pts/0    00:00:00 bash
root       261   253  0 06:18 pts/0    00:00:00 ps -ef

Видно, что эффект от обоих одинаков.

Откройте новое окно оболочки и запуститеpstree -aкоманду и видим следующее дерево процессов

  ├─containerd-shim -namespace moby -id 8a7712fe435afaa79c08e7281de7e1a658cd00261fecc7ba02da1847d47d1715 -address /run/containerd/containerd.sock
  │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   ├─apache2 -DFOREGROUND
  │   │   └─apache2 -DFOREGROUND
  │   ├─bash
  │   └─12*[{containerd-shim}]
  ├─containerd-shim -namespace moby -id d287c79eaced1fcdde94b2b6d45781937cb17a0ddf4848d26907dee40602e80f -address /run/containerd/containerd.sock
  │   ├─mysqld
  │   │   └─30*[{mysqld}]
  │   └─13*[{containerd-shim}]

Вы обнаружите, что результаты этого запроса в основном одинаковы.

создать процесс

Благодаря приведенному выше описанию у нас уже есть очень конкретное впечатление о процессе, поэтому теперь давайте углубимся: как создается процесс-контейнер?

Сначала рассмотрим CMD и ENTRYPOINT в файле Docker. Второй — время выполнения контейнера. Образ предоставляет пакеты и программную среду, необходимые для запуска контейнера, но если вы не запускаете различные приложения через CMD и ENTRYPOINT, контейнер не будет создан процесс.

необслуживающий процесс

Контейнеры обычно используются для размещения сервисов, но при разработке образы контейнеров также могут использоваться в качестве эфемерных процессов: исполняемых команд в контейнерах, которые выполняются на нашем компьютере. Эти контейнеры выполняют одну задачу, недолговечны и часто могут быть удалены после использования. Мы называем его исполняемым образом, а процесс контейнера, созданный таким образом, можно назватьнеобслуживающий процесс.

основной процесс

В Docker есть особый процесс (процесс с PID=1), который также является основным процессом Docker, указанным в инструкциях ENTRYPOINT и/или CMD в Dockerfile. Когда основной процесс завершается, пространство имен PIG, принадлежащее контейнеру, будет уничтожено, и жизненный цикл контейнера завершится.Рекомендации Docker рекомендуют один контейнер и одну службу и не заставляют вас иметь один контейнер и один поток. Некоторые службы будут порождать больше подпроцессов, например Apache и uwsgi, что совершенно нормально.

Процесс PID1 должен нести ответственность за дочерний процесс, созданный им самим.Когда основной процесс плохо спроектирован и дочерний процесс не может быть корректно завершен, это вызовет много проблем, таких как контейнер базы данных.Если процесс, который обрабатывает data не завершается корректно, данные могут быть потеряны. Если, к сожалению, ваш основной процесс не может управлять дочерними процессами, Docker предоставляет небольшой инструмент, который поможет вам выполнить эту часть. Вам нужно только указать флаг --init при запуске для создания контейнера, и Docker позаботится об этом вручную.

Поскольку основной процесс Docker — это совершенно особое существование, его жизненный цикл — это жизненный цикл контейнера докера, и он должен отвечать за сгенерированные дочерние процессы.При написании Dockerfile обязательно уточните, что такое процесс PID1.

Следующий контент:

Docker Quick Learning (4) Оркестрация, кластеризация и сводка общих команд

Эта статья написанаWebsoft9Оригинал опубликован, просьба указывать источник для перепечатки.