Сборка образа без dockerfile
Будем собирать контейнер с bash и cat внутри
Добавим пользователя в группу docker, что бы не вводить постоянно sudo и не работать под рутом
usermod -aG docker JackieChan
создадим временный коталог
sudo mkdir -p /laba/bashcat
назначим нашего пользователя владельцем директории
sudo chown JackieChan /laba/bascat
перейдем в него и создадим директорию rootfs которая будет импровизированным корнем файловой системы докер контейнера
cd /laba/bashcat
mkdir rootfs
сначала заберем команду bach , с помощью команды whereis bash найдем ее местонахождение
whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
команда внутри контейнера должна находится по такому же пути, соответсnвенно создадим директории /usr/bin/
mkdir -p /laba/bashcat/rootfs/usr/bin/
скопируем команду bash в эту директорию
cp /usr/bin/bash /laba/bashcat/rootfs/usr/bin/
и файлы библиотек, с помощью команды ldd проверим какие библиотеки использует команда bash
ldd /usr/bin/bash
linux-vdso.so.1 (0x00007ffeeaaa1000) <---- Эта библиотека встроенная
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x0000775e15235000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000775e15000000)
/lib64/ld-linux-x86-64.so.2 (0x0000775e153de000)
создадим необходимые каталоги в rootfs
mkdir -p lib/x86_64-linux-gnu
mkdir -p lib64
и скопируем туда эти библиотеки
cp /lib/x86_64-linux-gnu/libtinfo.so.6 /laba/bashcat/rootfs/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 /laba/bashcat/rootfs/lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 /laba/bashcat/rootfs/lib64/
теперь тоже самое для команды cat, проверим где лежит cat и создадим каталог
whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz
cp /usr/bin/cat /laba/bashcat/rootfs/usr/bin/
cat использует те же библиотеки и повторно их копировать ненужно
проверим содержимое через команду tree
tree
.
└── rootfs
├── lib
│ └── x86_64-linux-gnu
│ ├── libc.so.6
│ └── libtinfo.so.6
├── lib64
│ └── ld-linux-x86-64.so.2
└── usr
└── bin
├── bash
│ └── bash
└── cat
Сначала с помощью команды tar создадим архив , отправляем в стандартный вывод и при помощи | пайпа перенаправим в команду docker import
tar -C rootfs -c . | docker import - bashcat
-C меняет рабочий каталог на rootfs
-c означает create
. весь текущий каталог
docker import - минус значит забирать из стандартного ввода
bashcat собрать образ с таким именем
Соберем контейнер с ubuntu внутри и процессом с пинг внутри
создадим директорию mybuild уже в существующей папке /laba
sudo mkdir /laba/mybuild
теперь создадим скрипт, который будет являться процессом запускаемым при старте контейнера
vim docker-enrypoint.sh
#!/bin/bash
#ping 8.8.8.8
добавим права на исполнение
chmod a+x docker-enrypoint.sh
создадим docker файл с большой буквы
Обязательно должен быть любой базовый образ FROM ubuntu
vim Dockerfile
FROM ubuntu
RUN apt update && apt install -y iputils-ping
COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
Построим образ из docker файла
Находясь в той же директории где и скрипт и наш докерфайл, запустим сборку
docker build .
проверим, появился ли образ
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7c58d722ad3c 21 seconds ago 114MB
и развернем из этого образа контейнер с флагом --rm чтобы он удалился, после того как мы его остановим
docker run --rm -it 7c58d722ad3c
docker run -it 7c58d722ad3c /bin/bash
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=16.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=17.0 ms
Каждая инструкция в докерфайл это отдельный слой