Docker: systemd в docker контейнере

В одной из предыдущих статей я показал как собрать образ с нуля для контейнера на основе пакетной базы CentOS7. Однако все эти контейнеры на базе некоторого исполняемого кода, берушего на себя функции начального процесса с PID 1 далеки от какой-либо эмуляции “контейнерной” ОС. Для этого нужен полноценный init процесс, способный работать с сервисами в контейнере docker как в обычной полной виртуализации или на обычном сервере.

В “родных” контейнерах построенных на базе systemd-nspawn все это заложено изначально, и такие контейнеры сразу запуcкают полноценный процесс init – systemd. Но так ли сложно обойти костыли архитектуры docker и запустить systemd под его изрляцией? Давайте разбираться.

Углубившись слегка в понимание процесса загрузки ОС в которой ядро передает управление некоему процессу init, мы можем понять что любой такой процесс будет выполнять ряд логических процессов инициализации сервисов и среда из одной начальной точки до некторого целевого состояния. И совсем не факт что мы не можем пропустить большую часть этих действий по своему усмотрению.

В systemd все это крутится вокруг сущностей целей, сервисов и юнитов. Значит, передавая в докер контейнер systemd как начальную входную точку, мы можем попытаться определить его цель по умолчанию на основе специфики обоих платформ. Хотя по всему видно что они друг другу не друзья. И контейнеры на базе systemd-nspawn обладает не меньшей мощью и гибкостью.

Допустим, что как в предыдущей статье мы уже знаем как создать базовую сущность supermin5 только с одним пакетом – yum. Теперь попробуем создать это с двумя пакетами – systemd и yum:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@vms zero_systemd]# supermin5 --verbose --prepare yum systemd -o centos7.supermin.d                                                            
supermin: version: 5.1.19                                                                                                                            
supermin: rpm: detected RPM version 4.11                                                                                                            
supermin: package handler: fedora/rpm                                                                                                                
supermin: prepare: yum systemd                                                                                                                      
supermin: packages specified on the command line:                                                                                                    
  - yum-3.4.3-163.el7.centos.noarch                                                                                                                  
  - systemd-219-67.el7_7.1.x86_64                                                                                                                    
supermin: writing centos7.supermin.d.3gv6eajl/packages                                                                                              
supermin: after resolving dependencies there are 131 packages:
...
./etc/systemd/bootchart.conf
./etc/systemd/coredump.conf
./etc/systemd/journald.conf
./etc/systemd/logind.conf
./etc/systemd/system.conf
./etc/systemd/user.conf
./etc/udev/udev.conf
./etc/yum/protected.d/systemd.conf
./etc/logrotate.d/yum
./etc/yum.conf
./etc/yum/version-groups.conf
supermin: renaming centos7.supermin.d.3gv6eajl to centos7.supermin.d
[root@vms zero_systemd]#

И уже видим что появились новые пути в дереве каталогов где мы можем размещать файлы конфигурации systemd. Далее создаем реальное дерево файлов на основе конфигурации:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@vms zero_systemd]# supermin5 --verbose --build --include-packagelist --format chroot centos7.supermin.d -o centos7.appliance.d
supermin: version: 5.1.19
supermin: rpm: detected RPM version 4.11
supermin: package handler: fedora/rpm
supermin: build: centos7.supermin.d
supermin: reading the supermin appliance
supermin: build: visiting centos7.supermin.d/base.tar.gz type gzip base image (tar)
supermin: build: visiting centos7.supermin.d/packages type uncompressed packages
supermin: mapping package names to installed packages
BDB2053 Freeing read locks for locker 0x1f985: 1627/140108539664512
BDB2053 Freeing read locks for locker 0x1f987: 1627/140108539664512
BDB2053 Freeing read locks for locker 0x1f988: 1627/140108539664512
BDB2053 Freeing read locks for locker 0x1f989: 1627/140108539664512
supermin: resolving full list of package dependencies
supermin: build: 131 packages, including dependencies
supermin: build: 25028 files
supermin: build: 25028 files, after matching excludefiles
supermin: build: 25028 files, after adding hostfiles
supermin: build: 11866 files, after removing unreadable files
supermin: build: 11898 files, after munging
supermin: chroot: creating /packagelist
supermin: renaming centos7.appliance.d.jrxn34us to centos7.appliance.d
[root@vms zero_systemd]#

Все готово к данному моменту для создания файла целевой загрузки systemd – default.target. Обьект default.target – это все тот же юнит типа target. Если мы определим в качестве зависимостей к таргету другие юниты, вы заставим systemd загружать иные сервисы и т.д. А default.target будет конечной точкой состояния системы. Весь процесс инициализации systemd можно представить в виде дерева, где в корне расположен default.target. Systemd начинает строить дерево зависимостей сверху вниз, начиная с default.target, а вот запускаются сервисы в обратном пордяке, соблюдая зависимости по пути движения к конечному состоянию.

Создаем файл с мименем isolated.target и создадим линк для default.target

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@vms zero_systemd]# ll
total 16
drwxr-xr-x  4 root root 4096 Feb  9 18:49 ./
drwxr-xr-x  4 root root 4096 Feb  9 18:42 ../
drwxr-xr-x 17 root root 4096 Feb  9 18:49 centos7.appliance.d/
drwxr-xr-x  2 root root 4096 Feb  9 18:43 centos7.supermin.d/
[root@vms zero_systemd]# cd centos7.appliance.d/etc/systemd/system
[root@vms system]#
[root@vms system]# cat isolated.target
[Unit]
Description = systemd in docker containers
[root@vms system]#
[root@vms system]# ln -sf isolated.target default.target
[root@vms system]# ls -l
total 4
lrwxrwxrwx 1 root root 15 Feb  9 19:04 default.target -> isolated.target
-rw-r--r-- 1 root root 50 Feb  9 19:03 isolated.target
[root@vms system]#

Из этого состояния мы собираем такой же tar образ:

1
2
3
4
5
6
7
8
9
10
11
[root@vms zero_systemd]# echo 7 > centos7.appliance.d/etc/yum/vars/releasever
[root@vms zero_systemd]# tar --numeric-owner -cpf centos7_zero_systemd.tar -C centos7.appliance.d .
[root@vms zero_systemd]# ls -l
total 269628
drwxr-xr-x 17 root root      4096 Feb  9 18:49 centos7.appliance.d
drwxr-xr-x  2 root root      4096 Feb  9 18:43 centos7.supermin.d
-rw-r--r--  1 root root 276090880 Feb  9 19:17 centos7_zero_systemd.tar
[root@vms zero_systemd]#
[root@vms zero_systemd]# cat centos7_zero_systemd.tar | docker import - local/centos7-zero-systemd
sha256:d28dc637300fe7f759f71a390706f8a1fa8330a0c41fcfa235019838c7788ce4
[root@vms zero_systemd]#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@vms zero_systemd]# docker images -a
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
local/centos7-zero-systemd   latest              d28dc637300f        7 minutes ago       267 MB
local/centos7-minimal        latest              68f6e91282b3        5 hours ago         664 MB
local/centos7-zero           latest              e67e7172d34b        6 hours ago         170 MB
[root@vms zero_systemd]#
[root@vms zero_systemd]# docker run -i -t local/centos7-zero-systemd /bin/bash
bash-4.2# ldconfig
bash-4.2# yum clean all && yum makecache && yum -y install rpm rpm-build-libs rpm-libs rpm-python yum yum-metadata-parser yum-plugin-fastestmirror cracklib cracklib-dicts binutils dbus-libs device-mapper device-mapper-libs file iproute iptables iptables-services iputils groff-base less libcroco libgomp libunistring vim rootfiles openssh-server  
bash-4.2# ssh-keygen -A
ssh-keygen: generating new host keys: RSA1 RSA DSA ECDSA ED25519
bash-4.2# mkdir /var/run/sshd
bash-4.2# echo 'root:12345678' | chpasswd  
bash-4.2# exit
exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@vms zero_systemd]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                      PORTS               NAMES
83e526670f65        local/centos7-zero-systemd   "/bin/bash"         12 minutes ago      Exited (0) 33 seconds ago                       happy_wiles
[root@vms zero_systemd]# docker export 83e526670f65 > centos7_minimal_systemd.tar
[root@vms zero_systemd]#
[root@vms zero_systemd]# cat centos7_minimal_systemd.tar | docker import - local/centos7-minimal-systemd
sha256:e43b75b331f8e97b1da819e3da48f7eac1b0071c2f47d0402d9299e8f9ce266e
[root@vms zero_systemd]# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
local/centos7-minimal-systemd   latest              e43b75b331f8        15 seconds ago      667 MB
local/centos7-zero-systemd      latest              d28dc637300f        22 minutes ago      267 MB
local/centos7-minimal           latest              68f6e91282b3        6 hours ago         664 MB
local/centos7-zero              latest              e67e7172d34b        7 hours ago         170 MB
[root@vms zero_systemd]#

Для дальнейшего создания минимального контейнера запускающего systemd я использую магию dockerfile ))

1
2
3
4
5
6
[root@vms zero_systemd]# cat dockerfile_centos7_zero_systemd
FROM local/centos7-minimal-systemd
ENV container=docker  
ENTRYPOINT ["/sbin/init"]
CMD ["--log-level=info"]
STOPSIGNAL SIGRTMIN+3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@vms zero_systemd]# docker build --force-rm=true --file=dockerfile_centos7_zero_systemd --tag=local/centos7-minimal-systemd-prod .

Sending build context to Docker daemon  1.235GB                                                                                                      
Step 1/5 : FROM local/centos7-minimal-systemd                                                                                                        
 ---> c66daf12f37c                                                                                                                                  
Step 2/5 : ENV container=docker                                                                                                                      
 ---> Running in d7e2f5d563d3                                                                                                                        
Removing intermediate container d7e2f5d563d3                                                                                                        
 ---> dcb2fc59f035                                                                                                                                  
Step 3/5 : ENTRYPOINT ["/sbin/init"]                                                                                                                
 ---> Running in 606366a5264c                                                                                                                        
Removing intermediate container 606366a5264c                                                                                                        
 ---> b9a6cc813b69                                                                                                                                  
Step 4/5 : CMD ["--log-level=info"]                                                                                                                  
 ---> Running in 1cb68d97e79a                                                                                                                        
Removing intermediate container 1cb68d97e79a                                                                                                        
 ---> 0ae99593674a                                                                                                                                  
Step 5/5 : STOPSIGNAL SIGRTMIN+3                                                                                                                    
 ---> Running in c227cf4b927c                                                                                                                        
Removing intermediate container c227cf4b927c                                                                                                        
 ---> 85496fdaa8ac                                                                                                                                  
Successfully built 85496fdaa8ac                                                                                                                      
Successfully tagged local/centos7-minimal-systemd-prod:latest  
[root@vms zero_systemd]#
[root@vms zero_systemd]# docker images                                                                                                              
REPOSITORY                           TAG                 IMAGE ID            CREATED              SIZE                                              
local/centos7-minimal-systemd-prod   latest              85496fdaa8ac        21 seconds ago       667MB                                              
local/centos7-minimal-systemd        latest              c66daf12f37c        About a minute ago   667MB                                              
[root@vms zero_systemd]#

А теперь создаем контейнер монтирую спец директории внутрь контейнера:

1
2
3
4
[root@vms zero_systemd]# docker run -d --name centos7-systemd-empty --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup --mount type=tmpfs,
destination=/run --mount type=tmpfs,destination=/run/lock local/centos7-minimal-systemd-prod
0bcb1f6ff439bd33351ece078cc197113673c96add37820c7cb4766983f6ee48
[root@vms zero_systemd]#
1
2
3
4
5
[root@vms zero_systemd]# docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS               NAMES
0bcb1f6ff439        local/centos7-minimal-systemd-prod   "/sbin/init --log-le…"   11 seconds ago      Up 10 seconds                           centos7
-systemd-empty
[root@vms zero_systemd]#

Ныряем в контейнер и видим резуьтат

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@vms zero_systemd]# docker exec -it 0bcb1f6ff439 /bin/bash
[root@0bcb1f6ff439 /]#
[root@0bcb1f6ff439 /]# top
top - 19:25:37 up 76 days,  4:00,  0 users,  load average: 0.02, 0.09, 0.11                                                                          
Tasks:   7 total,   1 running,   6 sleeping,   0 stopped,   0 zombie      
%Cpu(s):  0.2 us,  0.3 sy,  0.0 ni, 99.3 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st                                                                      
KiB Mem : 65633276 total, 10434748 free,  7242468 used, 47956060 buff/cache                                                                          
KiB Swap: 33521660 total, 33521660 free,        0 used. 57179284 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                          
    1 root      20   0   43152   3288   2304 S   0.0  0.0   0:00.06 systemd                                                                          
   16 root      20   0   39084   5184   4912 S   0.0  0.0   0:00.01 systemd-journal                                                                  
   22 root      20   0   24256   1484   1240 S   0.0  0.0   0:00.00 systemd-logind                                                                  
   23 root      20   0  112920   4304   3280 S   0.0  0.0   0:00.00 sshd  
   24 dbus      20   0   58000   2260   1776 S   0.0  0.0   0:00.00 dbus-daemon                                                                      
   27 root      20   0   11828   1884   1492 S   0.0  0.0   0:00.01 bash  
   43 root      20   0   56204   1972   1436 R   0.0  0.0   0:00.00 top
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@vms zero_systemd]# ssh root@172.17.0.2
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ECDSA key fingerprint is SHA256:n15H3aNFHrPZ8kQYMLVawBkkJS1/Q4ZQelPPhQ4aSGg.
ECDSA key fingerprint is MD5:c1:f8:a1:29:c8:06:a3:d7:15:87:dd:73:d6:29:3f:9b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '
172.17.0.2' (ECDSA) to the list of known hosts.
root@172.17.0.2'
s password:
Last login: Sat Feb  8 17:07:23 2020
[root@0bcb1f6ff439 ~]# ps -eFH
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root         1     0  0 10788  3284   1 19:39 ?        00:00:00 /sbin/init --log-level=info
root        16     1  0  9771  5200   6 19:39 ?        00:00:00   /usr/lib/systemd/systemd-journald
dbus        21     1  0 14500  2084   4 19:39 ?        00:00:00   /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-act
root        23     1  0 28230  4308   2 19:39 ?        00:00:00   /usr/sbin/sshd -D
root        29    23  0 38836  6188   3 19:40 ?        00:00:00     sshd: root@pts/0
root        31    29  0 28862  1972   0 19:40 pts/0    00:00:00       -bash
root        46    31  0 38842  1828   4 19:40 pts/0    00:00:00         ps -eFH
root        24     1  0  6595  1660   3 19:39 ?        00:00:00   /usr/lib/systemd/systemd-logind
[root@0bcb1f6ff439 ~]#

“Загнали” systemd в изоляцию, но он все равно выполнил все установленные сервисы и запустил в этой изоляции sshd! Имею почти ОС))) Однако о безопасности и стабильности не сказано ни слова. Так же ни слова о том что эти процессы могут создать перегрузки без должного контроля лимитов памяти и процессора. Тем не менее делаем как я и наслаждаемся еще однои вариантом изоляции разработчиков – этих парней надо держать на правильном поводке))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

Scroll to top