Что такое Докер?
Docker — это контейнер, основанный на облегченной технологии виртуализации, весь проект разработан на основе языка Go и использует протокол Apache 2.0. Docker может упаковать наше приложение в контейнер, который содержит код приложения, рабочую среду, зависимые библиотеки, файлы конфигурации и другие необходимые ресурсы.Благодаря контейнеру может быть достигнута удобная, быстрая и независимая автоматизация от платформы Как вы развертываете, независимо от среда, в которой вы развертываете, приложения в контейнере будут работать в той же среде.
Например, Сяомин написал систему CMS, которая имеет очень широкий набор технологий и должна полагаться на различные библиотеки с открытым исходным кодом и промежуточное программное обеспечение. Если вы следуете исключительно ручному методу развертывания, Xiaoming необходимо установить различное программное обеспечение с открытым исходным кодом, а также написать файлы конфигурации каждого программного обеспечения с открытым исходным кодом. Если он развертывается только один раз, на этот раз накладные расходы приемлемы, но если Сяо Мину нужно менять сервер для развертывания своей программы каждые несколько дней, то эти утомительные повторяющиеся задачи, несомненно, будут раздражать. В это время в игру вступает полезность Docker.Сяо Мину нужно только написать файл Dockerfile в соответствии с шагами развертывания приложения (установка, настройка и другие операции автоматически выполняются Docker), а затем собрать и опубликовать его. образ, так что неважно какой На любой машине Сяо Мину нужно только вытащить нужный ему образ, а потом уже можно развернуть и запустить напрямую, в чем прелесть Docker.
Так что же такое зеркальное отображение? Изображения являются важной концепцией в Docker:
-
Изображение (image): оно похоже на изображение, используемое в виртуальной машине.Поскольку любое приложение должно иметь свою собственную операционную среду, изображение представляет собой шаблон, используемый для обеспечения необходимой операционной среды.
-
Контейнер (контейнер): Контейнер — это уровень абстракции, предоставляемый Docker, который похож на облегченную песочницу, содержащую минималистическую системную среду Linux и работающие в ней приложения. Контейнер — это работающий экземпляр образа (сам образ доступен только для чтения, при запуске контейнера Docker создаст доступный для записи слой поверх образа, любые изменения в контейнере не повлияют на образ, если вы хотите сохранить контейнер в образе, Docker примет стратегия создания нового уровня изображения на основе контейнера), а механизм Docker использует контейнер для работы и изоляции каждого приложения (то есть приложения в каждом контейнере независимы друг от друга).
На самом деле идею Docker можно понять из первоначального значения английских слов Docker и Container. Контейнер можно интерпретировать как контейнер.Контейнер является общей стандартной спецификацией для упакованных товаров, которые могут быть легко загружены и выгружены с помощью механического оборудования.Его изобретение упрощает процесс механизации логистических перевозок и устанавливает стандартизированную систему логистических перевозок. Docker означает докер.Можно считать, что Docker подобен рабочему, усердно работающему в доке, упаковывающему приложения в «контейнеры» с определенными стандартизированными спецификациями (на самом деле указанные здесь контейнеры соответствуют Image, в Container in Docker больше похоже на работающая песочница), когда товар транспортируется к месту назначения, докеры (Докер) могут разобрать контейнер и вывезти товар (создать и запустить Контейнер на основе Образа). Эту стандартизацию и изоляцию можно легко комбинировать, чтобы использовать несколько образов для создания среды вашего приложения (Docker также выступает за то, чтобы каждый образ следовал принципу единой ответственности, то есть делать только одну вещь хорошо), или делиться своим приложением с другими.
Автор этой статьиSylvanasSun(sylvanas.sun@gmail.com), впервые опубликовано вБлог SylvanasSun.
Оригинальная ссылка:sylva, то есть sun.GitHub.IO/2017/11/19/…
(Для перепечатки просьба сохранить заявление в этом абзаце и сохранить гиперссылку.)
Докер против виртуальной машины
Выше мы упоминали, что Docker основан на облегченной технологии виртуализации, поэтому он отличается от виртуальных машин, которые мы обычно используем. Технологии виртуальных машин можно разделить на следующие две категории:
-
Системная виртуальная машина: обеспечивает замену реального компьютера посредством имитации компьютерной системы программным обеспечением. Это абстракция физического оборудования, обеспечивающая функциональность, необходимую для работы полноценной операционной системы. Виртуальные машины управляют аппаратным обеспечением и совместно используют его через физические машины, поэтому среды нескольких виртуальных машин изолированы друг от друга.На одной машине может работать несколько виртуальных машин, и каждая виртуальная машина включает полную копию операционной системы. В системной виртуальной машине любое выполняемое программное обеспечение или операции влияют только на среду этой виртуальной машины. VMWare, которую мы часто используем, является реализацией системной виртуальной машины.
-
Программная виртуальная машина: позволяет программам работать независимо от платформы. Типичным примером является JVM, Java отделяет Java-программу от операционной системы и аппаратной платформы через уровень абстракции JVM (поскольку каждая Java-программа выполняется в JVM), поэтому он реализует так называемую компиляцию один раз, запуск везде.
Технология, используемая Docker, отличается от двух предыдущих.Он использует более легкую технологию виртуализации.Несколько контейнеров используют одно и то же ядро операционной системы и работают так, как если бы они были локальными. По сравнению с виртуальными машинами технология контейнеров является просто абстракцией прикладного уровня, который упаковывает код и зависимости вместе, и несколько контейнеров могут работать на одной машине (это означает, что одна виртуальная машина также может запускать несколько контейнеров) и совместно использовать ядра операционной системы с другими контейнерами. Каждый контейнер работает как независимый процесс в пользовательском пространстве. Эти особенности доказывают, что контейнеры более гибкие и легкие, чем виртуальные машины (обычно в сочетании с виртуальными машинами и Docker).
Контейнерная технология на самом деле не нова. Ее можно проследить до chroot в UNIX (представленной в V7 Unix в 1979 г.), которая может изменять корневой каталог текущего процесса и его подкаталоги. Программы, работающие в среде, не могут получить доступ к файлам. вне указанного дерева каталогов, тем самым ограничивая область действий пользователя и предоставляя изолированное пространство для процессов.
После этого в различных версиях Unix появилось множество контейнерных технологий. В 2006 году Google предложил «Контейнеры процессов» для достижения соответствующих характеристик изоляции ресурсов процесса в ядре Linux. Поскольку определение контейнера в ядре Linux было слишком широким и запутанным, позже проект был переименован в CGroups (группы управления), чтобы реализовать ограничения ресурсов для процессов.
В 2008 году был выпущен LXC (контейнеры Linux), который представляет собой метод виртуализации на уровне операционной системы для запуска нескольких изолированных программ (контейнеров) в системе Linux путем совместного использования ядра. LXC объединяет CGroups в ядре Linux с поддержкой отдельных пространств имен, чтобы обеспечить изолированную среду для приложений. И Docker также основан на LXC (предшественник Docker был внутренним проектом dotClound, компании, предоставляющей услуги PaaS), и в него было внесено множество улучшений.
Используйте Докер
Прежде чем использовать Docker, вам необходимо установить Docker (это кажется ерундой...), метод установки отличается в зависимости от разных платформ, вы можете обратиться кInstall Docker | Docker DocumentationИли сами погуглите.
После установки введитеdocker --version
чтобы убедиться, что установка прошла успешно.
$ docker --version
Docker version 17.05.0-ce-rc1, build 2878a85
отDocker HubВы можете извлекать изображения, опубликованные другими, и мы также можем зарегистрировать учетную запись, чтобы публиковать собственные изображения и делиться ими с другими.
[root@Jack ~]# docker search redis # 查看redis镜像是否存在
[root@Jack ~]# docker pull redis # 拉取redis镜像到本机
Using default tag: latest
Trying to pull repository docker.io/library/redis ...
latest: Pulling from docker.io/library/redis
Digest: sha256:cd277716dbff2c0211c8366687d275d2b53112fecbf9d6c86e9853edb0900956
[root@Jack ~]# docker images # 查看镜像信息
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MB
docker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MB
docker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB
С помощью Image вы можете запустить Container поверх него, команда выглядит следующим образом.
[root@Jack ~]# docker run -d -p 6379:6379 redis # 运行redis,-p代表将本机上6379端口映射到Container的6379端口 -d代表在后台启动
[root@Jack ~]# docker ps -a # 查看容器信息,如果不加-a只会显示当前运行中的容器
# 如果想要进入容器中,那么需要执行以下命令
[root@Jack ~]# docker ps # 先获得容器的id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f928073b7eb redis "docker-entrypoint.sh" 45 seconds ago Up 44 seconds 0.0.0.0:6379->6379/tcp desperate_khorana
[root@Jack ~]# docker exec -it 1f928073b7eb /bin/bash # 然后再执行该命令进入到容器中
root@1f928073b7eb:/data# touch hello_docker.txt # 在容器中创建一个文件
root@1f928073b7eb:/data# exit # 退出
exit
[root@Jack ~]#
# 也可以在启动时直接进入 命令如下
[root@Jack ~]# docker run -d -it -p 6379:6379 redis /bin/bash
Мы внесли изменения в контейнер. Если вы хотите сохранить это изменение, вы можете создать новый образ с помощью команды фиксации.
# -m为描述信息 -a为作者 1f9是你要保存的容器id 取前3个字符 docker可以自行识别
# sylvanassun/redis为镜像名 :test 为一个tag 一般用于标识版本
[root@Jack ~]# docker commit -m "test" -a "SylvanasSun" 1f9 sylvanassun/redis:test
sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd
[root@Jack ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sylvanassun/redis test e7073e8e5bd7 2 seconds ago 106.6 MB
docker.io/python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MB
docker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MB
docker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB
Также легко удалить контейнер или образ, но перед удалением образа необходимо удалить контейнер, который от него зависит.
[root@Jack ~]# docker stop 1f9 # 关闭运行中的容器,相应的也有docker start id命令来启动一个容器
1f9
[root@Jack ~]# docker rm 1f9 # 删除容器
1f9
[root@Jack ~]# docker rmi e70 # 删除上面保存的镜像
Untagged: sylvanassun/redis:test
Deleted: sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd
Deleted: sha256:751db4a870e5f703082b31c1614a19c86e0c967334a61f5d22b2511072aef56d
Если вы хотите создать образ самостоятельно, вам нужно написать Dockerfile, в котором описаны зависимости образа и способы настройки среды вашего приложения.
# 使用python:2.7-slim 作为父镜像
FROM python:2.7-slim
# 跳转到/app 其实就是cd命令
WORKDIR /app
# 将当前目录的内容(.)复制到镜像的/app目录下
ADD . /app
# RUN代表运行的shell命令,下面这条命令是根据requirements.txt安装python应用的依赖包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 暴露80端口让外界访问
EXPOSE 80
# 定义环境变量
ENV NAME World
# 当容器启动时执行的命令,它与RUN不同,只在容器启动时执行一次
CMD ["python", "app.py"]
Тогда вы можете пройтиdocker build -t xxx/xxxx .
команда для создания образа,-t
Обратите внимание на название изображения, тег и другую информацию..
Указывает на поиск файла Dockerfile в текущем каталоге.
Узнав, как создать собственное изображение, хотите ли вы опубликовать его наDocker Hubподелиться с другими? Для этого необходимо зарегистрироватьDocker Hubаккаунт, затем пройтиdocker login
команду для входа в систему, а затемdocker push image name
, так же просто, как использовать Git.
Дополнительные команды и использование Docker см.Docker Documentation | Docker Documentation, и я также рекомендую использоватьDocker ComposeЧтобы создать образ, он может легко комбинировать несколько изображений и управлять ими.
Эпилог
Docker обеспечивает очень мощный автоматизированный метод развертывания и гибкость, разделяет несколько приложений и обеспечивает гибкость разработки, управляемость и переносимость. В то же время Docker также помогает все большему количеству предприятий реализовать практику миграции в облако, перехода на микросервисы и перехода на модель DevOps.
Теперь, когда микросервисы и DevOps становятся все более популярными, почему вы решили отказаться от Docker? Давайте решим принять Docker и вместе принять будущее!