Самым известным недостатком безопасности в Docker является то, что он требует доступа root для создания ваших изображений докера с демоном Docker.
Мы все прочитали хотя бы раз, когда вы должны быть осторожны с использованием корневого доступа. Этот учебник посмотрите на недостаток использования Unit Docker и Docker-альтернатив для борьбы с теми, а именно:
Чтобы понять, почему демон Docker работает с доступом к корню и как это может стать проблемой, мы сначала должны понимать архитектуру докеров (по крайней мере на высоком уровне). Контейнерные изображения указываются с DockerFile. Dockerfile подробно, как построить изображение, основанное на вашем приложении и ресурсах. Используя Docker, мы можем использовать команду сборки для создания изображения нашего контейнера. Как только у вас есть изображение вашего докерафила, вы можете Беги Это. После запуска изображения создается контейнер.
Ниже приведена упрощенная диаграмма архитектуры Docker, взятая непосредственно из Официальная документация Отказ
Проблема с этим, в том, что вы не можете использовать Docker напрямую на вашей рабочей станции. Докер состоит из различных инструментов. В большинстве случаев вы будете взаимодействовать только с Docker CLI. Однако запуск приложения с Docker означает, что вам нужно запустить Docker Daemon с правами корневых привилегий . Он фактически связывается с сокетом Unix вместо порта TCP. По умолчанию пользователи могут получить доступ только к сокете Unix, используя команду sudo, которая принадлежит пользовательскому корню.
Демон Docker отвечает за состояние ваших контейнеров и изображений и облегчает любое взаимодействие с «внешним миром. «Docker CLI просто используется для перевода команд в вызовы API, которые отправляются на демон Docker. Это позволяет использовать локальный или удаленный документ Docker.
Запуск Docker Daemon на локальном уровне вы рискуете, что любой процесс, который вырывает из контейнера Docker, будет иметь одинаковые права, что и хост-операционная система. Вот почему вы должны доверять только своим собственным изображениям, которые вы написали и понимаете.
Следующий раздел обсудит альтернативы докера. Все альтернативы, обсуждаемые ниже, могут построить OCI совместимые изображения контейнера. OCI стоит за Открытая контейнерная инициатива , который является проектом Фондом Linux с целью определить открытые стандарты для операционной виртуализации уровня системы; более конкретно, контейнеры Linux. Это включает в себя спецификацию времени выполнения и спецификацию изображения контейнеров. Скотт Маккарти обсуждается подробно Как различные стандарты контейнеров подходят вместе; Вот некоторые из преимуществ использования стандартов контейнеров:
- Более высокая гибкость между инструментами. Если вы можете просто заменить демон Docker в кластер Kubernetes, не замечая разницы, не имеет ли значение, какой инструмент вы используете?
- Получите лучшее понимание контейнеров — что на самом деле происходит, когда вы запускаете контейнер?
- Более высокая надежность вашей инфраструктуры. Работа, которую вы поместили в вашу существующую инфраструктуру, не устаревают, когда вы решите переключиться на разные инструменты.
Buildah предоставляет инструмент CLI, который позволяет пользователям строить OCI или традиционные документы докера. Buildah можно использовать для создания и запуска изображений из DockerFile и без. В нашем случае мы собираемся использовать Buildah Чтобы построить изображение и Подман Чтобы запустить изображение.
Отношения между Buildah & Podman
Buildah и Podman являются дополнительными инструментами для создания и управления контейнерами. Основная дифференциация между двумя инструментами является то, что Buildah фокусируется на создании изображений контейнера OCI, в то время как Podman специализируется на управлении всей жизненным циклом контейнера. Команды, используемые в Buildah, очень похожи на команды Docker. Buildah реплицирует те же команды, которые находятся в DockerFile, чтобы позволить пользователям создавать изображения без докерафила.
В сравнении, Подманс ориентирован на весь жизненный цикл контейнера OCI изображения, но также поддерживает другие стандарты контейнеров. Суммируя, он помогает вам поддерживать и изменять изображения OCI, например, вытягивание и метка, и позволяет запустить и поддерживать контейнеры, созданные из этих изображений.
Основным отличием для заметок между обоими инструментами является концепция контейнера. Buildah очень похож на Docker, так как контейнеры построены и управляются. Сравнение этого с Подманом, в контейнерах Подмана предназначены для долгосрочного. Эта разница делает обе инструменты взаимодополняющими; Buildah можно использовать для создания контейнеров и подмана для управления тем.
Кроме того, вы не можете совершить контейнер Buildah из Подмана, ни наоборот. Это отражено в То, как используются команды обоих инструментов Отказ Например, команда Commit работает по-разному в контейнерах Buildah и Podman.
Buildah | Подман | |
Фокус | Создание контейнера | Управление контейнерами; Весь контейнер жизненный цикл |
Управление контейнерами | Похоже на Docker | Контейнеры должны быть долгоживающими |
Команды | Зеркалирование команд Docker в функциональности | Некоторые команды могут быть похожи, но имеют разные функции |
Стандарты изображения | Поддержка изображений OCI | Поддержка изображений OCI |
Начало работы с Beailah и Podman
Buildah имеет различные варианты установки (что вы можете легко заблудиться). Мы бегаем на Ubuntu 20.04 и следили за Эти инструкции по установке :
. /etc/os-release
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update -qq
sudo apt-get -qq -y install buildah
Убедитесь, что вы заменяете идентификатор версии в вашу версию Ubuntu (если вы находитесь на Ubuntu) — в нашем случае это было 20,04.
Чтобы убедиться, что установка была успешной, проверьте наличие изображений Buildah:
buildah images
Далее мы будем Установить Подман :
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/testing/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:testing.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/testing/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt-get update -qq
sudo apt-get -qq -y install podman
После этого мы можем выполнить следующее, чтобы убедиться, что наша установка была успешной:
podman --help
Давайте пойдем вперед и построим изображение с Buildah. Для этого мы используем Следующий репозиторий Отказ У репозитария уже есть DockerFile, которую мы можем использовать. Тем не менее, вы также можете создавать или использовать свои собственные.
# clone the repository git clone git@github.com:anais-codefresh/docker-alternatives
# cd into the cloned repository cd docker-alternatives/buildahandpodman
Далее мы собираемся использовать Buildah, чтобы построить изображение на основе нашего DockerFile.
buildah bud -t buildah-example
Теперь вы должны увидеть разные шаги выполненного DockerFile.
Мы можем увидеть изображения, построенные с Buildah, запустив:
podman images
И запустить контейнер с помощью Podman:
podman run -dt -p 8080:8080/tcp
Теперь мы можем просмотреть нашу заявку на Localhost: 8080. Все команды Podman перечислены в их документация Отказ
Канико был запущен и поддерживается Google. Короче говоря, это инструмент с открытым исходным кодом, который позволяет пользователям создавать изображения даже без предоставления IT Root Access. Эти изображения построены внутри контейнера или кластера Kubernetes. В отличие от демона Docker, Kaniko выполняет все команды внутри пользовательского пространства.
Есть несколько разных способов развертывания и запуска канико:
Для запуска контейнера Kaniko нужно три аргумента:
- Dockerfile
- Контекст сборки: Каталог, содержащий Dockerfile, какой Kaniko можно использовать для создания вашего изображения — E.g. Копия в DockerFile должна обратиться к файлу в контексте сборки
- Название реестра, к которому следует нажать окончательное изображение
Начало работы с Канико
Мы будем использовать Kaniko внутри локальной кластеры Kubernetes, используя Microk8s. Чтобы начать работу с Kaniko и выполнить следующие шаги, мы предполагаем, что у вас есть следующая настройка:
Либо локальный кластер Kubernetes, либо вы можете получить доступ к удаленному кластеру на вашем компьютере.
Мы собираемся протестировать Канико с существующим Dockerfile. Приложение, которое мы собираемся использовать, является основным Go Применение Анкет Вы можете либо клонировать приложение или использовать свое собственное приложение и DockerFile.
# Clone the repository git clone git@github.com:anais-codefresh/docker-alternatives
# cd into the kaniko repository cd docker-alternatives/kaniko
Создайте файл под названием Volume.yaml это уточню наше ПерсистентВолюю Анкет Это используется для управления Канико внутри Kubernetes на местном уровне.
touch volume.yaml
Продолжай и вставьте следующее в свой файл:
apiVersion: v1 kind: PersistentVolume metadata: name: dockerfile labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce storageClassName: local-storage hostPath: path: # replace with local directory, such as "/home//kaniko"
Вам придется заменить путь к вашему каталогу (тот, где файлы находятся в). Самый простой способ сделать это — бежать:
pwd
И скопируйте и вставьте путь к файлу.
Далее нам нужен Второй файл Этот объем установлен на:
touch volume-claim.yaml
Вставьте следующий контент:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: dockerfile-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: local-storage
Наконец, нам нужно дать Kubernetes спецификации на стручке, который он должен работать. Добавьте Pod.yaml файл:
touch pod.yaml
И вставить следующий контент:
apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: ["--dockerfile=Dockerfile", "--context=dir://workspace", "--destination=/"] # replace with your dockerhub account volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker - name: dockerfile-storage mountPath: /workspace restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: regcred items: - key: .dockerconfigjson path: config.json - name: dockerfile-storage persistentVolumeClaim: claimName: dockerfile-claim
Модификации, которые вы должны сделать в файл Pod.yaml:
- Пожалуйста, предоставьте имя учетной записи Docker Hub и хранилище, к которому вы хотите нажать.
- Убедитесь, что вы включите правильное местоположение к вашему DockerFile. В нашем случае DockerFile находится в том же репозитории, что и YAML-файлы.
Теперь, когда у нас есть все это подготовлено, нам нужно создать секретку Kubernetes, чтобы позволить Kaniko подтолкнуть изображение докера до Docker Hub; Обратите внимание, что вы также можете использовать другой реестр.
kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email
- <Ваш реестр-сервер>: ( https://index.docker.io/v1/ for dockerhub)
— это ваше имя пользователя Docker. — ваш пароль докера. — это ваш почтовый адрес докера.
В нашем случае нам пришлось поставить ценности в цитатах E.G. «Anaisurlichs» для вашего имени пользователя.
Далее мы собираемся создать наш настойчивый объем. Обратите внимание, что важно, чтобы вы сначала создали секрет, прежде чем создать тома и POD.
# create persistent volume $ kubectl create -f volume.yaml persistentvolume/dockerfile created
# create persistent volume claim $ kubectl create -f volume-claim.yaml persistentvolumeclaim/dockerfile-claim created
# check whether the volume mounted correctly $ kubectl get pv dockerfile NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE dockerfile 10Gi RWO Retain Bound default/dockerfile-claim local-storage 1m
Наконец, мы создаем стручки:
kubectl create -f pod.yaml
Теперь вы можете просмотреть POD:
kubectl get pods
Нам потребовалось некоторое время, чтобы выяснить, как начать с канико. В нашем случае мы использовали Канико в Куберане. В качестве альтернативы вы также можете использовать демон Docker для запуска ваших изображений контейнера. Однако в этом случае не будет много разницы между использованием Docker напрямую. Если вам все равно хотел бы сделать это, вам не требуют ни одного из файлов, перечисленных выше. Вместо этого вы просто запустите следующую команду с аналогичными параметрами к тому, что мы указали в POD.YAML.
Во-первых, нам нужен файл config.json в нашем текущем каталоге, который содержит наш логин Docker:
{ "auths": { "https://index.docker.io/v1/": { "auth": "xxxxxxxxxxxxxxx" } } }
На Ubuntu вы можете кодировать свои учетные данные с:
echo -n "username:password" | base64
Используйте закодированные учетные данные в вашем файле config.json. Далее мы можем построить и подтолкнуть наш образ докера, используя:
docker run -ti --rm -v `pwd`:/workspace -v `pwd`/config.json:/kaniko/.docker/config.json:ro gcr.io/kaniko-project/executor:latest --dockerfile=Dockerfile --destination=yourimagename
Обратите внимание, что эта команда может занять некоторое время, чтобы закончить. Ниже приведен ожидаемый выход:
Buildah позволяет создавать изображения без Dockerfile. Гибкость изображений здания без DockerFiles позволяет интегрировать другие языки сценариев в процесс сборки. Поскольку Buildah не полагается на демона, а вместо этого на всеобъемлющих API, написанных в Golang, команды могут быть переведены в другие инструменты.
В сравнении, Kaniko можно запустить и без корневого доступа, чтобы построить изображение контейнера и толкать его в реестр. Пока Kaniko поддерживается Google, Подман был разработан Redhat. Оба проекта активно поддерживаются.
Дополнительные различия, которые мы заметили, используя оба инструмента:
- В зависимости от вашей операционной системы, может быть довольно сложно установить любой из упомянутых инструментов.
- Если вы уже используете Kubernetes, Kaniko позволяет вам начать сразу. Однако вам, возможно, придется инвестировать некоторое время на создание файлов YAML.
- Подман и Buildah довольно интуитивно используют и используют аналогичные команды для тех, которые определяются Docker.
- Кроме того, Buildah имеет лучшие учебники и дальнейшая документация доступна, что может стать удобным в долгосрочной перспективе.
- Вы можете запустить как канико, так и Buildah из контейнера. Тем не менее, это не так просто, используя Buildah Отказ
- Мы построили то же изображение, используя Kaniko, а затем используя Buildah, чтобы сравнить размер изображения; Строительство изображения Kaniko, используя Docker, составляет около половины размера, построенного Buildah.
Изображение построено с Beailah и Podman:
Изображение построено с канико:
В целом, это зависит от вашего варианта использования и инструментов, которые вы уже используете для создания и управления вашими контейнерами. Вообще, это не имеет большого смысла использовать канико с докером. Однако, если вы уже в значительной степени используете Kubernetes, то это будет легкая интеграция и отличная альтернатива. Напротив, комбинация Buildah и Podman является лучшей альтернативой, если вы хотите напрямую заменить докер.
В этом руководстве мы сравниваем две разные альтернативы, чтобы использовать Docker напрямую. Также не так легко начать работать с докером. Таким образом, если вы уже используете Kubernetes, Kaniko будет хорошей альтернативой; Если нет, мы бы предпочли Buildah и Podman. Как вы можете сказать, какой инструмент предоставит лучшую альтернативу сильно зависит от случая использования.
Вы используете Docker или любой из альтернатив, подробно описанных в этом руководстве? Дайте нам знать о вашем опыте в комментариях!
Оригинал: «https://dev.to/codefreshio/docker-images-without-docker-a-practical-guide-4087»