Как установить и использовать Docker в Ubuntu 16.04

Вступление

Docker - это приложение, которое позволяет легко и просто запускать процессы приложений в контейнере, которые похожи на виртуальные машины, только более переносимы, более дружественны к ресурсам и в большей степени зависят от операционной системы хоста. Чтобы получить подробное представление о различных компонентах контейнера Docker, посмотритеThe Docker Ecosystem: An Introduction to Common Components.

Существует два способа установки Docker в Ubuntu 16.04. Один из способов заключается в установке его в существующей установке операционной системы. Другой включает в себя запуск сервера с помощью инструмента под названиемDocker Machine, который автоматически устанавливает на нем Docker.

В этом руководстве вы узнаете, как установить и использовать его в существующей установке Ubuntu 16.04.

Предпосылки

Чтобы следовать этому уроку, вам понадобится следующее:

  • Один сервер Ubuntu 16.04 настроен с пользователем без полномочий root с привилегиями sudo и базовым брандмауэром, как описано вInitial Setup Guide for Ubuntu 16.04

  • Аккаунт наDocker Hub, если вы хотите создавать свои собственные образы и отправлять их в Docker Hub, как показано в шагах 7 и 8.

[[step-1 -—- install-docker]] == Шаг 1. Установка Docker

Установочный пакет Docker, доступный в официальном репозитории Ubuntu 16.04, может не быть последней версией. Чтобы получить эту последнюю версию, установите Docker из официального репозитория Docker. В этом разделе показано, как это сделать.

Во-первых, чтобы убедиться, что загрузки действительны, добавьте ключ GPG для официального репозитория Docker в вашу систему:

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

Добавьте хранилище Docker к источникам APT:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Затем обновите базу данных пакетов с помощью пакетов Docker из недавно добавленного репозитория:

sudo apt-get update

Убедитесь, что вы собираетесь установить из репозитория Docker вместо репозитория Ubuntu 16.04 по умолчанию:

apt-cache policy docker-ce

Вы должны увидеть вывод, похожий на следующий:

Вывод политики apt-cache docker-ce

docker-ce:
  Installed: (none)
  Candidate: 18.06.1~ce~3-0~ubuntu
  Version table:
     18.06.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

Обратите внимание, чтоdocker-ce не установлен, но кандидат на установку находится из репозитория Docker для Ubuntu 16.04 (xenial).

Наконец, установите Docker:

sudo apt-get install -y docker-ce

Теперь нужно установить Docker, запустить демон и запустить процесс при загрузке. Убедитесь, что он работает:

sudo systemctl status docker

Вывод должен быть похож на следующий, показывая, что служба активна и работает:

Output● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-10-18 20:28:23 UTC; 35s ago
     Docs: https://docs.docker.com
 Main PID: 13412 (dockerd)
   CGroup: /system.slice/docker.service
           ├─13412 /usr/bin/dockerd -H fd://
           └─13421 docker-containerd --config /var/run/docker/containerd/containerd.toml

Теперь при установке Docker вы получаете не только службу Docker (демон), но и утилиту командной строкиdocker или клиент Docker. Позже в этом руководстве мы рассмотрим, как использовать командуdocker.

[[step-2 -—- execute-the-docker-command-without-sudo-optional]] == Шаг 2 - Выполнение команды Docker без Sudo (необязательно)

По умолчанию для выполнения командыdocker требуются привилегии суперпользователя, то есть вы должны добавить к команде префиксsudo. Он также может быть запущен пользователем из группыdocker, которая автоматически создается во время установки Docker. Если вы попытаетесь запустить командуdocker без префиксаsudo или не входя в группу докеров, вы получите следующий результат:

Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Если вы не хотите вводитьsudo при каждом запуске командыdocker, добавьте свое имя пользователя в группуdocker:

sudo usermod -aG docker ${USER}

Чтобы применить новое членство в группе, вы можете выйти из системы и снова войти в систему или ввести следующее:

su - ${USER}

Вам будет предложено ввести пароль вашего пользователя, чтобы продолжить. После этого вы можете подтвердить, что ваш пользователь теперь добавлен в группуdocker, набрав:

id -nG
Outputsammy sudo docker

Если вам нужно добавить в группуdocker пользователя, под которым вы не вошли в систему, явно объявите это имя пользователя, используя:

sudo usermod -aG docker username

В остальной части статьи предполагается, что вы запускаете командуdocker как пользователь в группе пользователей docker. Если вы решите не делать этого, добавьте к командамsudo.

[[step-3 -—- using-the-docker-command]] == Шаг 3. Использование команды Docker

С установленным и работающим Docker теперь самое время ознакомиться с утилитой командной строки. Использованиеdocker заключается в передаче ему цепочки опций и команд, за которыми следуют аргументы. Синтаксис принимает эту форму:

docker [option] [command] [arguments]

Чтобы просмотреть все доступные подкоманды, введите:

docker

Начиная с Docker 18.06.1, полный список доступных подкоманд включает в себя:

Output
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Чтобы просмотреть параметры, доступные для определенной команды, введите:

docker docker-subcommand --help

Чтобы просмотреть общесистемную информацию о Docker, используйте:

docker info

[[step-4 -—- working-with-docker-images]] == Шаг 4. Работа с образами Docker

Контейнеры Docker запускаются из образов Docker. По умолчанию он извлекает эти образы из Docker Hub, реестра Docker, управляемого Docker, компанией, которая занимается проектом Docker. Любой может создавать и размещать свои образы Docker в Docker Hub, поэтому для большинства приложений и дистрибутивов Linux вам потребуется запускать Docker-контейнеры с изображениями, которые размещены в Docker Hub.

Чтобы проверить, можете ли вы получать доступ к изображениям и загружать их из Docker Hub, введите:

docker run hello-world

В выводе вы должны увидеть следующее сообщение, которое указывает, что Docker работает правильно:

Output...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Вы можете искать образы, доступные в Docker Hub, используя командуdocker с подкомандойsearch. Например, чтобы найти образ Ubuntu, введите:

docker search ubuntu

Скрипт сканирует Docker Hub и возвращает список всех изображений, чье имя соответствует поисковой строке. В этом случае вывод будет похож на это:

Output
NAME                                                   DESCRIPTION                                     STARS            OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   8564                [OK]
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            230                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   176                                     [OK]
consol/ubuntu-xfce-vnc                                 Ubuntu container with "headless" VNC session…   129                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   95                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   91                  [OK]
neurodebian                                            NeuroDebian provides neuroscience research s…   54                  [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          48                                      [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   39                  [OK]
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     18
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   14
1and1internet/ubuntu-16-apache-php-7.0                 ubuntu-16-apache-php-7.0                        13                                      [OK]
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating sys…   12
eclipse/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4      ubuntu-16-nginx-php-5.6-wordpress-4             6                                       [OK]
codenvy/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]
darksheer/ubuntu                                       Base Ubuntu Image -- Updated hourly             4                                       [OK]
pivotaldata/ubuntu                                     A quick freshening-up of the base Ubuntu doc…   2
1and1internet/ubuntu-16-sshd                           ubuntu-16-sshd                                  1                                       [OK]
smartentry/ubuntu                                      ubuntu with smartentry                          1                                       [OK]
ossobv/ubuntu                                          Custom ubuntu image from scratch (based on o…   0
paasmule/bosh-tools-ubuntu                             Ubuntu based bosh-cli                           0                                       [OK]
1and1internet/ubuntu-16-healthcheck                    ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                            Ubuntu images for GPDB development              0

В столбцеOFFICIALOK указывает изображение, созданное и поддерживаемое компанией, стоящей за проектом. После того как вы определили изображение, которое хотите использовать, вы можете загрузить его на свой компьютер с помощью подкомандыpull. Попробуйте это с изображениемubuntu, например:

docker pull ubuntu

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

docker run ubuntu

Чтобы увидеть изображения, которые были загружены на ваш компьютер, введите:

docker images

Вывод должен выглядеть примерно так:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ea4c82dcd15a        16 hours ago        85.8MB
hello-world         latest              4ab4c602aa5e        5 weeks ago         1.84kB

Как вы увидите далее в этом руководстве, образы, которые вы используете для запуска контейнеров, можно изменять и использовать для создания новых образов, которые затем могут быть загружены (pushed - технический термин) в Docker Hub или другие реестры Docker. .

[[step-5 -—- running-a-docker-container]] == Шаг 5. Запуск контейнера Docker

Контейнерhello-world, который вы запустили на предыдущем шаге, является примером контейнера, который запускается и завершается после отправки тестового сообщения. Контейнеры могут быть гораздо полезнее, и они могут быть интерактивными. В конце концов, они похожи на виртуальные машины, только более дружественные к ресурсам.

В качестве примера, давайте запустим контейнер, используя последний образ Ubuntu. Комбинация переключателей-i и-t дает вам интерактивный доступ оболочки к контейнеру:

docker run -it ubuntu

[.note] #Note: По умолчанию командаrun запускает новый контейнер. После выполнения предыдущей команды вы откроете интерфейс оболочки второго контейнераubuntu.
#

Ваша командная строка должна измениться, чтобы отразить тот факт, что вы сейчас работаете внутри контейнера, и должна принять следующую форму:

Outputroot@9b0db8a30ad1:/#

[.note] #Note: Запомните идентификатор контейнера в командной строке. В предыдущем примере это9b0db8a30ad1. Этот идентификатор понадобится вам позже, чтобы идентифицировать контейнер, когда вы захотите его удалить.
#

Теперь вы можете запустить любую команду внутри контейнера. Например, давайте обновим базу данных пакета внутри контейнера. Вам не нужно добавлять к какой-либо команде префиксsudo, потому что вы работаете внутри контейнера как пользовательroot:

apt-get update

Затем установите любое приложение в нем. Давайте установим Node.js:

apt-get install -y nodejs

Это устанавливает Node.js в контейнер из официального репозитория Ubuntu. Когда установка завершится, убедитесь, что установлен Node.js:

node -v

Вы увидите номер версии, отображаемый в вашем терминале:

Outputv8.10.0

Любые изменения, которые вы делаете внутри контейнера, применяются только к этому контейнеру.

Чтобы выйти из контейнера, введите в командной строкеexit.

Давайте посмотрим на управление контейнерами в нашей системе дальше.

[[step-6 -—- manage-docker-container]] == Шаг 6. Управление контейнерами Docker

После некоторого использования Docker на вашем компьютере будет много активных (работающих) и неактивных контейнеров. Чтобы просмотретьactive ones, используйте:

docker ps

Вы увидите вывод, похожий на следующий:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED

В этом руководстве вы запустили три контейнера; один из изображенияhello-world и два из изображенияubuntu. Эти контейнеры больше не работают, но они все еще существуют в вашей системе.

Чтобы просмотреть все контейнеры - активные и неактивные - запуститеdocker ps с переключателем-a:

docker ps -a

Вы увидите вывод, похожий на этот:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         21 minutes ago      Exited (0) About a minute ago                       xenodochial_neumann
d7851eb12e23        ubuntu              "/bin/bash"         24 minutes ago      Exited (0) 24 minutes ago                           boring_chebyshev
d54945b6510b        hello-world         "/hello"            32 minutes ago      Exited (0) 32 minutes ago                           youthful_roentgen

Чтобы просмотреть последний созданный вами контейнер, передайте ему переключатель-l:

docker ps -l
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         22 minutes ago      Exited (127) About a minute ago                       xenodochial_neumann

Чтобы запустить остановленный контейнер, используйтеdocker start, за которым следует идентификатор контейнера или имя контейнера. Давайте запустим контейнер на основе Ubuntu с идентификатором9b0db8a30ad1:

docker start 9b0db8a30ad1

Контейнер запустится, и вы можете использоватьdocker ps, чтобы увидеть его статус:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         23 minutes ago      Up 11 seconds                           xenodochial_neumann

Чтобы остановить работающий контейнер, используйтеdocker stop, за которым следует идентификатор или имя контейнера. На этот раз мы будем использовать имя, которое Docker присвоил контейнеру, то естьxenodochial_neumann:

docker stop xenodochial_neumann

Если вы решили, что контейнер вам больше не нужен, удалите его с помощью командыdocker rm, снова используя либо идентификатор контейнера, либо имя. Используйте командуdocker ps -a, чтобы найти идентификатор или имя контейнера, связанного с изображениемhello-world, и удалить его.

docker rm youthful_roentgen

Вы можете запустить новый контейнер и дать ему имя с помощью переключателя--name. Вы также можете использовать переключатель--rm для создания контейнера, который удаляется при остановке. См. Командуdocker run help для получения дополнительной информации об этих и других параметрах.

Контейнеры можно превратить в изображения, которые вы можете использовать для создания новых контейнеров. Давайте посмотрим, как это работает.

[[step-7 -—- committing-changes-in-a-container-to-a-docker-image]] == Шаг 7. Фиксация изменений в контейнере в образе Docker

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

В этом разделе показано, как сохранить состояние контейнера в качестве нового образа Docker.

После установки Node.js внутри контейнера Ubuntu у вас теперь есть контейнер, работающий без образа, но этот контейнер отличается от образа, который вы использовали для его создания. Но вы можете захотеть повторно использовать этот контейнер Node.js в качестве основы для новых изображений позже.

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

docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name

Переключатель-m предназначен для сообщения фиксации, которое помогает вам и другим пользователям узнать, какие изменения вы внесли, а-a используется для указания автора. container ID - это тот, который вы отметили ранее в руководстве, когда запускали интерактивный сеанс Docker. Если вы не создали дополнительные репозитории в Docker Hub, в репозитории обычно используется имя пользователя Docker Hub.

Например, для пользователяsammy с идентификатором контейнераd9b100f2f636 команда будет выглядеть так:

docker commit -m "added node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

[.note] #Note: Когда выcommit изображение, новое изображение сохраняется локально, то есть на вашем компьютере. Позже в этом руководстве вы узнаете, как отправить образ в реестр Docker, например в Docker Hub, чтобы его можно было оценить и использовать для вас и других.
#

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

docker images

Вывод должен быть похож на это:

OutputREPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs       latest              6a1784a63edf        2 minutes ago       170MB
ubuntu                    latest              ea4c82dcd15a        17 hours ago        85.8MB
hello-world               latest              4ab4c602aa5e        5 weeks ago         1.84kB

В приведенном выше примереubuntu-nodejs - это новый образ, полученный из существующего образа ubuntu из Docker Hub. Разница в размере отражает изменения, которые были сделаны. В этом примере изменение состояло в том, что Node.js был установлен. В следующий раз, когда вам нужно будет запустить контейнер с помощью Ubuntu с предустановленным Node.js, вы можете просто использовать новый образ.

Вы также можете создавать образы изDockerfile, что позволяет автоматизировать установку программного обеспечения в новый образ. Тем не менее, это выходит за рамки этого учебника.

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

[[step-8 -—- pushing-docker-images-to-a-docker-repository]] == Шаг 8. Отправка образов Docker в репозиторий Docker

Следующий логический шаг после создания нового образа из существующего изображения - поделиться им с несколькими избранными друзьями, со всем миром в Docker Hub или с другим реестром Docker, к которому у вас есть доступ. Чтобы отправить изображение в Docker Hub или любой другой реестр Docker, у вас должна быть там учетная запись.

В этом разделе показано, как перенести образ Docker в Docker Hub. Чтобы узнать, как создать собственный частный реестр Docker, ознакомьтесь сHow To Set Up a Private Docker Registry on Ubuntu 14.04.

Чтобы отправить изображение, сначала войдите в Docker Hub:

docker login -u docker-registry-username

Вам будет предложено пройти аутентификацию с использованием пароля вашего Docker Hub. Если вы указали правильный пароль, аутентификация должна пройти успешно.

[.Примечание]##

Note: Если ваше имя пользователя в реестре Docker отличается от локального имени пользователя, которое вы использовали для создания образа, вам придется пометить образ своим именем пользователя реестра. Для примера, приведенного на последнем шаге, вы должны набрать:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Затем вы можете нажать свое изображение, используя:

docker push docker-registry-username/ubuntu-nodejs

Чтобы отправить изображениеubuntu-nodejs в репозиторийsammy, используйте следующую команду:

docker push sammy/ubuntu-nodejs

Процесс может занять некоторое время, поскольку он загружает изображения, но после завершения вывод будет выглядеть следующим образом:

OutputThe push refers to repository [docker.io/sammy/ubuntu-nodejs]
1aa927602b6a: Pushed
76c033092e10: Pushed
2146d867acf3: Pushed
ae1f631f14b7: Pushed
102645f1cf72: Pushed
latest: digest: sha256:2be90a210910f60f74f433350185feadbbdaca0d050d97181bf593dd85195f06 size: 1362

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

New Docker image listing on Docker Hub

Если попытка толчка приводит к следующей ошибке, скорее всего, вы не вошли в систему:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

Войдите, затем повторите попытку нажатия.

Заключение

Из этого руководства вы узнали основы, с которых вы начали работать с Docker в Ubuntu 16.04. Как и большинство проектов с открытым исходным кодом, Docker основан на быстро развивающейся кодовой базе, поэтому возьмите за привычку посещатьblog page проекта для получения последней информации.

Для дальнейшего изучения ознакомьтесь сother Docker tutorials в сообществе DigitalOcean.

Related