You are here

Docker: установка, настройка, image, container, docker-compose

Linux: 

Docker: установка, настройка, image, container, docker-compose

Docker - это профессиональный инструмент позволяющий делать виртуализацию на уровне операционной системы Linux. Главной особенностью является то, что при использовании Docker вы не используете многочисленные ресурсы вашего сервера(компьютера), как при использовании классических виртуальных машин.

Docker базируется на ядре Linux, и использует ресурсы по необходимости. Если вспомнить VirtualBox, вам надо точно выделить процессор, память, место и т.д., тем самым отрезать от вашей машины ресурсы строго под виртуалку. Каждая виртуальная машина в VirtualBox это отдельный компьютер. В Docker все проще.

Из чего состоит Docker:

  • Docker Engine - это сам Docker стоящий на вашей машине
  • Docker Container - это запущенная виртуальная машина запущенная в данный момент
  • Docker Image - это образ виртуальной машины (не запущенная машина)
  • Dockerfile - описание своего Image и дальнейшее его создание

1. Установка Docker Engine

Установка Docker на Debian 10:
* Для установки всегда советуем пользоваться первоисточником, в нашем случае официальный сайт Docker

Сначала настраиваем REPOSITORY, делаем апдейт:

  1. sudo apt-get update

Далее ставим пакеты:

  1. sudo apt-get install \
  2. apt-transport-https \
  3. ca-certificates \
  4. curl \
  5. gnupg2 \
  6. software-properties-common

Ставим официальный GPG key:

  1. curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Проверяем по отпечатку, что у нас есть ключ:

  1. sudo apt-key fingerprint 0EBFCD88

Добавляем репозиторий:

  1. sudo add-apt-repository \
  2. "deb [arch=amd64] https://download.docker.com/linux/debian \
  3. $(lsb_release -cs) \
  4. stable"

После настройки репозитория, переходим к установке.

Производим установку Docker:

  1. sudo apt-get update
  2. sudo apt-get install docker-ce docker-ce-cli containerd.io

проверяем работу:

  1. sudo docker run hello-world
  2. Unable to find image 'hello-world:latest' locally
  3. latest: Pulling from library/hello-world
  4. 1b930d010525: Pull complete
  5. Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
  6. Status: Downloaded newer image for hello-world:latest
  7.  
  8. Hello from Docker!
  9. This message shows that your installation appears to be working correctly.
  10. ...

Последняя команда показывает мини пример работы Docker: сначала идет поиск image с именем "hello-world", дальше он его скачивает автоматический "1b930d010525: Pull complete", после чего запускает Container.

Как проверить список Docker Image:

  1. sudo docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. hello-world latest fce289e99eb9 9 months ago 1.84kB

2. Установка Docker-compose
* Для установки Docker-compose обращаемся к официальному сайту Docker

Docker Compose — это инструментальное средство, входящее в состав Docker. Пакетный менеджер, позволяющий описывать необходимую структуру в одном файле (конфиге). С его помощью очень удобно разворачивать сервисы из нескольких связанных контейнеров.

Для запуска стабильной версии выполняем следующую команду:

  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

* На момент написания была версия "1.24.1". Актуальную версию вы можете посмотреть на github, и поставить в ссылку именно её.

Применим исполняемые права доступа к двоичному файлу:

  1. sudo chmod +x /usr/local/bin/docker-compose

Проверяем работу Docker-compose:

  1. docker-compose --version
  2. docker-compose version 1.24.1, build 1110ad01

3. Основные команды Docker

  • sudo docker -v - версия Docker
  • sudo usermod -aG docker [user] - запуск Docker без sudo под вашим [user]
  • sudo docker -v - версия Docker
  • sudo docker pull [name_images] - скачать Images
  • sudo docker images - просмотр скаченных Images
  • sudo docker ps - просмотр запущенных в данный момент Container
  • sudo docker ps -a - просмотр ранее запущенных Container
  • sudo docker search [name] - поиск Images, на докер хаб. К примеру для поиска программы tomcat будем использовать следующее "sudo docker search tomcat"
  • sudo docker stop [id_container] - остановить Container по его "Container ID" из команды "docker ps"
  • sudo docker rm [id_container] - стереть Container, предварительно его надо остановить
  • sudo docker rmi [names_images или id_container] - удалить Images

По командам запуска, более подробнее. Образ Images содержит минимальный Linux, настройки, конфиги и саму программу. При запуске из Images стартует Container, который частично закрыт от нас. Чтобы с ним взаимодействовать, зачастую надо:

  • Пробросить порты из Container в нашу среду
  • Попасть в запущенный контейнер, внутрь
  • Пробросить файлы конфигурации от нас в сам Container, или обратно
  • Запустить контейнер в фоне
  • и т.д.

4. Пример работы с Docker: на примере tomcat
Рассмотрим полный цикл на примере установки программы tomcat при работе с Docker.

Ищем наш tomcat:

  1. sudo docker search tomcat
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. tomcat Apache Tomcat is an open source implementati… 2540 [OK]
  4. tomee Apache TomEE is an all-Apache Java EE certif… 69 [OK]
  5. dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 53 [OK]
  6. [... пропуск вывода]

Из примера выше, мы видим, что сборки Images бывают официальные и сборки от пользователей. По умолчанию обычно используют OFFICIAL [OK]. Намного удобнее искать сборки сразу на Docker Hub.

Выбрали "tomcat" и ставим его:

  1. sudo docker pull tomcat
  2. Using default tag: latest
  3. latest: Pulling from library/tomcat
  4. 9a0b0ce99936: Downloading [=========================================> ] 37.24MB/45.38MB
  5. db3b6004c61a: Download complete
  6. f8f075920295: Download complete
  7. 6ef14aff1139: Downloading [===========================================> ] 43.26MB/50.07MB
  8. 962785d3b7f9: Download complete
  9. 631589572f9b: Download complete
  10. c55a0c6f4c7b: Downloading [==> ] 4.291MB/104.2MB
  11. [... пропуск вывода]
  12. Status: Downloaded newer image for tomcat:latest
  13. docker.io/library/tomcat:latest

Проверяем наши images:

  1. docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. tomcat latest 882487b8be1d 2 days ago 507MB
  4. hello-world latest fce289e99eb9 9 months ago 1.84kB

Мы скачали Images с tomcat и запустили с ним Container. Внутри Container сам tomcat будет висеть по умолчанию на порту 8080. Но надо понимать, что это внутри контейнера. А у вас порт 8080 занят какой-то программой, что делать? Нужно запустить контейнер с пробросим портов:

Запускаем скаченный images "tomcat":

  1. sudo docker run -it -p 1122:8080 tomcat
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/local/openjdk-8
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  7. 21-Oct-2019 08:32:17.135 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/8.5.47
  8. 21-Oct-2019 08:32:17.197 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Oct 7 2019 13:30:46 UTC
  9. 21-Oct-2019 08:32:17.198 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.47.0
  10. [... пропуск вывода]

Что мы указали:

  • "-it" - запуск интерактивно, прямо в нашей командной строке. Она будет отдана процессу с tomcat
  • "- p" - перенаправление портов: 1122 - на каком порту хотим получить доступ, 8080 - порт который внутри контейнера.

Как проверить работу?

Проверяем свой IP:

  1. ip a

В нашем случае это 192.168.0.155. Открываем браузер и вводим следующее: 192.168.0.155:1122

Итог:

Docker: установка, настройка, image, container, docker-compose

Вот так просто мы поставили и запустили tomcat. Минус примера выше, мы запустили интерактивно. При этом, если мы захотим забрать консоль "Ctrl+C", у нас произойдет падение tomcat. Это неудобно, лучше запускать как независимый процесс от нашей консоли:

  1. sudo docker run -d -p 1122:8080 tomcat
  2. 628d32200c0c3f14423df1eb6915b58e9bf8d3748cfa38827ba36ca95b847b43

Если нам надо запустить еще один tomcat, мы запускаем еще раз с другим портом:

  1. sudo docker run -d -p 1133:8080 tomcat
  2. aabf43fc4529e3c771c13c4f064c0d8766fd6f63aa6d6b5d291ecd4eae83bbeb

Проверить работает ли Container, используем:

  1. sudo docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. aabf43fc4529 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:1133->8080/tcp youthful_fermat
  4. 628d32200c0c tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:1122->8080/tcp eloquent_darwin

* Пояснение: на примере выше, мы видим, что из одного IMAGE можно запустить несколько контейнеров, которые будут работать независимо друг от друга.

Чтобы удалить контейнер, сначала его остановим, и только потом удалим. Удаление контейнера не приводит к удалению IMAGE:

  1. # уникальный ID из команды выше
  2. sudo docker stop aabf43fc4529

Просмотрим контейнера с их состоянием:

  1. sudo docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. aabf43fc4529 tomcat "catalina.sh run" 9 minutes ago Exited (143) 50 seconds ago youthful_fermat
  4. 628d32200c0c tomcat "catalina.sh run" 10 minutes ago Up 10 minutes 0.0.0.0:1122->8080/tcp eloquent_darwin

* один контейнер остановлен, второй до сих пор работает.

Теперь удалим контейнер:

  1. sudo docker rm aabf43fc4529

В итоге один контейнер удален, один работает. Что еще можно сделать?

Можно зайти в bash контейнера:

  1. sudo docker exec -it 628d32200c0c /bin/bash
  2. # или sudo docker exec -it 628d32200c0c sh
  3. # Просмотрим содержание
  4. root@628d32200c0c:/usr/local/tomcat# ls -la
  5. total 168
  6. drwxr-sr-x 1 root staff 4096 Oct 19 02:25 .
  7. drwxrwsr-x 1 root staff 4096 Oct 19 02:18 ..
  8. -rw-r--r-- 1 root root 19318 Oct 7 13:33 BUILDING.txt
  9. -rw-r--r-- 1 root root 5407 Oct 7 13:33 CONTRIBUTING.md
  10. -rw-r--r-- 1 root root 57011 Oct 7 13:33 LICENSE
  11. -rw-r--r-- 1 root root 1726 Oct 7 13:33 NOTICE
  12. -rw-r--r-- 1 root root 3255 Oct 7 13:33 README.md
  13. -rw-r--r-- 1 root root 7136 Oct 7 13:33 RELEASE-NOTES
  14. -rw-r--r-- 1 root root 16262 Oct 7 13:33 RUNNING.txt
  15. drwxr-xr-x 2 root root 4096 Oct 19 02:26 bin
  16. drwxr-sr-x 1 root root 4096 Oct 21 09:08 conf
  17. drwxr-sr-x 2 root staff 4096 Oct 19 02:25 include
  18. drwxr-xr-x 2 root root 4096 Oct 19 02:25 lib
  19. drwxrwxrwx 1 root root 4096 Oct 21 09:08 logs
  20. drwxr-sr-x 3 root staff 4096 Oct 19 02:25 native-jni-lib
  21. drwxrwxrwx 2 root root 4096 Oct 19 02:25 temp
  22. drwxr-xr-x 7 root root 4096 Oct 7 13:31 webapps
  23. drwxrwxrwx 1 root root 4096 Oct 21 09:08 work
  24. # Выйти из контейнера:
  25. exit

* Обычно в контейнере нет привычных для вас программ, так как там голый Linux, который достаточно в нашем случае для работы tomcat.

Надеюсь все понятно! В статьях дальше будем создавать docker-compose файлы.

Источник: http://linuxsql.ru