Вступление
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
После добавления изображения в реестр, оно должно появиться на панели управления вашей учетной записи, как показано на рисунке ниже.
Если попытка толчка приводит к следующей ошибке, скорее всего, вы не вошли в систему:
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.