Docker compose pull что делает
Перейти к содержимому

Docker compose pull что делает

  • автор:

docker-compose pull

Pulls an image associated with a service defined in a docker-compose.yml or docker-stack.yml file, but does not start containers based on those images.

For example, suppose you have this docker-compose.yml file from the Quickstart: Compose and Rails sample.

version: '2' services: db: image: postgres web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db 

If you run docker-compose pull ServiceName in the same directory as the docker-compose.yml file that defines the service, Docker pulls the associated image. For example, to call the postgres image configured as the db service in our example, you would run docker-compose pull db .

$ docker-compose pull db Pulling db (postgres:latest). latest: Pulling from library/postgres cd0a524342ef: Pull complete 9c784d04dcb0: Pull complete d99dddf7e662: Pull complete e5bff71e3ce6: Pull complete cb3e0a865488: Pull complete 31295d654cd5: Pull complete fc930a4e09f5: Pull complete 8650cce8ef01: Pull complete 61949acd8e52: Pull complete 527a203588c0: Pull complete 26dec14ac775: Pull complete 0efc0ed5a9e5: Pull complete 40cd26695b38: Pull complete Digest: sha256:fd6c0e2a9d053bebb294bb13765b3e01be7817bf77b01d58c2377ff27a4a46dc Status: Downloaded newer image for postgres:latest 

Руководство по Docker Compose для начинающих

Автор статьи, перевод которой мы сегодня публикуем, говорит, что она предназначена для тех разработчиков, которые хотят изучить Docker Compose и идут к тому, чтобы создать своё первое клиент-серверное приложение с использованием Docker. Предполагается, что читатель этого материала знаком с основами Docker. Если это не так — можете взглянуть на эту серию материалов, на эту публикацию, где основы Docker рассмотрены вместе с основами Kubernetes, и на эту статью для начинающих.

image

Что такое Docker Compose?

Docker Compose — это инструментальное средство, входящее в состав Docker. Оно предназначено для решения задач, связанных с развёртыванием проектов.

Изучая основы Docker, вы могли столкнуться с созданием простейших приложений, работающих автономно, не зависящих, например, от внешних источников данных или от неких сервисов. На практике же подобные приложения — редкость. Реальные проекты обычно включают в себя целый набор совместно работающих приложений.

Как узнать, нужно ли вам, при развёртывании некоего проекта, воспользоваться Docker Compose? На самом деле — очень просто. Если для обеспечения функционирования этого проекта используется несколько сервисов, то Docker Compose может вам пригодиться. Например, в ситуации, когда создают веб-сайт, которому, для выполнения аутентификации пользователей, нужно подключиться к базе данных. Подобный проект может состоять из двух сервисов — того, что обеспечивает работу сайта, и того, который отвечает за поддержку базы данных.

Технология Docker Compose, если описывать её упрощённо, позволяет, с помощью одной команды, запускать множество сервисов.

Разница между Docker и Docker Compose

Docker применяется для управления отдельными контейнерами (сервисами), из которых состоит приложение.

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

Docker (отдельный контейнер) и Docker Compose (несколько контейнеров)

Типичный сценарий использования Docker Compose

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

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

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

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

Если же вы используете Docker Compose, то перенос вашего проекта на новый сервер — это вопрос, который решается выполнением нескольких команд. Для того чтобы завершить перенос проекта на новое место, вам нужно лишь выполнить кое-какие настройки и загрузить на новый сервер резервную копию базы данных.

Разработка клиент-серверного приложения с использованием Docker Compose

Теперь, когда вы знаете о том, для чего мы собираемся использовать Docker Compose, пришло время создать ваше первое клиент-серверное приложение с использованием этого инструмента. А именно, речь идёт о разработке небольшого веб-сайта (сервера) на Python, который умеет выдавать файл с фрагментом текста. Этот файл у сервера запрашивает программа (клиент), тоже написанная на Python. После получения файла с сервера программа выводит текст, хранящийся в нём, на экран.

Обратите внимание на то, что мы рассчитываем на то, что вы владеете основами Docker, и на то, что у вас уже установлена платформа Docker.

Приступим к работе над проектом.

▍1. Создание проекта

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

  • Файл docker-compose.yml . Это файл Docker Compose, который будет содержать инструкции, необходимые для запуска и настройки сервисов.
  • Папка server . Она будет содержать файлы, необходимые для обеспечения работы сервера.
  • Папка client . Здесь будут находиться файлы клиентского приложения.
. ├── client/ ├── docker-compose.yml └── server/ 2 directories, 1 file

▍2. Создание сервера

Тут мы, в процессе создания сервера, затронем некоторые базовые вещи, касающиеся Docker.

2a. Создание файлов

Перейдите в папку server и создайте в ней следующие файлы:

  • Файл server.py . В нём будет находиться код сервера.
  • Файл index.html . В этом файле будет находиться фрагмент текста, который должно вывести клиентское приложение.
  • Файл Dockerfile . Это — файл Docker, который будет содержать инструкции, необходимые для создания окружения сервера.
. ├── Dockerfile ├── index.html └── server.py 0 directories, 3 files
2b. Редактирование Python-файла.

Добавим в файл server.py следующий код:

#!/usr/bin/env python3 # Импорт системных библиотек python. # Эти библиотеки будут использоваться для создания веб-сервера. # Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python. import http.server import socketserver # Эта переменная нужна для обработки запросов клиента к серверу. handler = http.server.SimpleHTTPRequestHandler # Тут мы указываем, что сервер мы хотим запустить на порте 1234. # Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose. with socketserver.TCPServer(("", 1234), handler) as httpd: # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента. httpd.serve_forever()

Этот код позволяет создать простой веб-сервер. Он будет отдавать клиентам файл index.html , содержимое которого позже будет выводиться на веб-странице.

2c. Редактирование HTML-файла

В файл index.html добавим следующий текст:

Docker-Compose is magic!

Этот текст будет передаваться клиенту.

2d. Редактирование файла Dockerfile

Сейчас мы создадим простой файл Dockerfile , который будет отвечать за организацию среды выполнения для Python-сервера. В качестве основы создаваемого образа воспользуемся официальным образом, предназначенным для выполнения программ, написанных на Python. Вот содержимое Dockerfile:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа. # Для этого используется ключевое слово 'FROM'. # Здесь нам нужно импортировать образ python (с DockerHub). # В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'. FROM python:latest # Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'. # Для того чтобы это сделать, мы используем ключевое слово 'ADD'. # Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере. # Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе. # Здесь мы помещаем файл в папку образа '/server/'. ADD server.py /server/ ADD index.html /server/ # Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас. # Она позволяет изменить рабочую директорию образа. # В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'. WORKDIR /server/

Теперь займёмся работой над клиентом.

▍3. Создание клиента

Создавая клиентскую часть нашего проекта, мы попутно вспомним некоторые основы Docker.

3a. Создание файлов

Перейдите в папку вашего проекта client и создайте в ней следующие файлы:

  • Файл client.py . Тут будет находиться код клиента.
  • Файл Dockerfile . Этот файл играет ту же роль, что и аналогичный файл в папке сервера. А именно, он содержит инструкцию, описывающую создание среды для выполнения клиентского кода.
. ├── client.py └── Dockerfile 0 directories, 2 files
3b. Редактирование Python-файла

Добавим в файл client.py следующий код:

#!/usr/bin/env python3 # Импортируем системную библиотеку Python. # Она используется для загрузки файла 'index.html' с сервера. # Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python. import urllib.request # Эта переменная содержит запрос к 'http://localhost:1234/'. # Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'. # localhost указывает на то, что программа работает с локальным сервером. # 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода. fp = urllib.request.urlopen("http://localhost:1234/") # 'encodedContent' соответствует закодированному ответу сервера ('index.html'). # 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран). encodedContent = fp.read() decodedContent = encodedContent.decode("utf8") # Выводим содержимое файла, полученного с сервера ('index.html'). print(decodedContent) # Закрываем соединение с сервером. fp.close()

Благодаря этому коду клиентское приложение может загрузить данные с сервера и вывести их на экран.

3c. Редактирование файла Dockerfile

Как и в случае с сервером, мы создаём для клиента простой Dockerfile , ответственный за формирование среды, в которой будет работать клиентское Python-приложение. Вот код клиентского Dockerfile :

# То же самое, что и в серверном Dockerfile. FROM python:latest # Импортируем 'client.py' в папку '/client/'. ADD client.py /client/ # Устанавливаем в качестве рабочей директории '/client/'. WORKDIR /client/

▍4. Docker Compose

Как вы могли заметить, мы создали два разных проекта: сервер и клиент. У каждого из них имеется собственный файл Dockerfile . До сих пор всё происходящее не выходит за рамки основ работы с Docker. Теперь же мы приступаем к работе с Docker Compose. Для этого обратимся к файлу docker-compose.yml , расположенному в корневой папке проекта.

Обратите внимание на то, что тут мы не стремимся рассмотреть абсолютно все команды, которые можно использовать в docker-compose.yml . Наша главная цель — разобрать практический пример, дающий вам базовые знания по Docker Compose.

Вот код, который нужно поместить в файл docker-compose.yml :

# Файл docker-compose должен начинаться с тега версии. # Мы используем "3" так как это - самая свежая версия на момент написания этого кода. version: "3" # Следует учитывать, что docker-composes работает с сервисами. # 1 сервис = 1 контейнер. # Сервисом может быть клиент, сервер, сервер баз данных. # Раздел, в котором будут описаны сервисы, начинается с 'services'. services: # Как уже было сказано, мы собираемся создать клиентское и серверное приложения. # Это означает, что нам нужно два сервиса. # Первый сервис (контейнер): сервер. # Назвать его можно так, как нужно разработчику. # Понятное название сервиса помогает определить его роль. # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'. server: # Ключевое слово "build" позволяет задать # путь к файлу Dockerfile, который нужно использовать для создания образа, # который позволит запустить сервис. # Здесь 'server/' соответствует пути к папке сервера, # которая содержит соответствующий Dockerfile. build: server/ # Команда, которую нужно запустить после создания образа. # Следующая команда означает запуск "python ./server.py". command: python ./server.py # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234. # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера), # мы должны организовать перенаправление этого порта на порт компьютера. # Сделать это нам поможет ключевое слово 'ports'. # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера] # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом # 1234 контейнера (так как именно на этот порт сервер # ожидает поступления запросов). ports: - 1234:1234 # Второй сервис (контейнер): клиент. # Этот сервис назван 'client'. client: # Здесь 'client/ соответствует пути к папке, которая содержит # файл Dockerfile для клиентской части системы. build: client/ # Команда, которую нужно запустить после создания образа. # Следующая команда означает запуск "python ./client.py". command: python ./client.py # Ключевое слово 'network_mode' используется для описания типа сети. # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера. network_mode: host # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис, # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы. # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'. depends_on: - server

▍5. Сборка проекта

После того, как в docker-compose.yml внесены все необходимые инструкции, проект нужно собрать. Этот шаг нашей работы напоминает использование команды docker build , но соответствующая команда имеет отношение к нескольким сервисам:

$ docker-compose build

▍6. Запуск проекта

Теперь, когда проект собран, пришло время его запустить. Этот шаг нашей работы соответствует шагу, на котором, при работе с отдельными контейнерами, выполняется команда docker run :

$ docker-compose up

После выполнения этой команды в терминале должен появиться текст, загруженный клиентом с сервера: Docker-Compose is magic! .

Как уже было сказано, сервер использует порт компьютера 1234 для обслуживания запросов клиента. Поэтому, если перейти в браузере по адресу http://localhost:1234/, в нём будет отображена страница с текстом Docker-Compose is magic! .

Полезные команды

Рассмотрим некоторые команды, которые могут вам пригодиться при работе с Docker Compose.

Эта команда позволяет останавливать и удалять контейнеры и другие ресурсы, созданные командой docker-compose up :

$ docker-compose down

Эта команда выводит журналы сервисов:

$ docker-compose logs -f [service name]

Например, в нашем проекте её можно использовать в таком виде: $ docker-compose logs -f [service name] .

С помощью такой команды можно вывести список контейнеров:

$ docker-compose ps

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

$ docker-compose exec [service name] [command]

Например, она может выглядеть так: docker-compose exec server ls .

Такая команда позволяет вывести список образов:

$ docker-compose images

Итоги

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

Уважаемые читатели! Пользуетесь ли вы Docker Compose в своих проектах?

  • Блог компании RUVDS.com
  • Веб-разработка
  • Виртуализация

how to get docker-compose to use the latest image from repository

I don’t know what I’m doing wrong, but I simply cannot get docker-compose up to use the latest image from our registry without first removing the old containers from the system completely. It looks like compose is using the previously started image even though docker-compose pull has fetched a newer image. I looked at How to get docker-compose to always re-create containers from fresh images? which seemed to be similar to my issue, but none of the provided solutions there work for me, since I’m looking for a solution I can use on the production server and there I don’t want to be removing all containers before starting them again (possible data loss?). I would like for compose only to detect the new version of the changed images, pull them and then restart the services with those new images. I created a simple test project for this in which the only goal is to get a version nr to increase on each new build. The version nr is displayed if I browse to the nginx server that is created (this works as expected locally). docker version: 1.11.2 docker-compose version: 1.7.1 OS: tested on both CentOS 7 and OS X 10.10 using docker-toolbox My docker-compose.yml:

version: '2' services: application: image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev volumes: - /var/www/html tty: true nginx: build: nginx ports: - "80:80" volumes_from: - application volumes: - ./logs/nginx/:/var/log/nginx php: container_name: buildchaintest_php_1 build: php-fpm expose: - "9000" volumes_from: - application volumes: - ./logs/php-fpm/:/var/www/logs 

on our jenkins server I run the following to build and tag the image

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev /usr/local/bin/docker-compose rm -f /usr/local/bin/docker-compose build docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest 

this seems to be doing what it’s supposed to be since I get a new version tag in our repository each time the build completes and the version nr has been bumped. If I now run

docker-compose pull && docker-compose -f docker-compose.yml up -d 

in a folder on my computer, where the contents is only the docker-compose.yml and the necessary Dockerfiles to build the nginx and php services, the output I get is not the latest version number as has been tagged in the registry or is shown in the docker-compose.yml (0.1.8), but the version before that, which is 0.1.7. However the output of the pull command would suggest that a new version of the image was fetched:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest). latest: Pulling from ourcompany/buildchaintest Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev 

Only if I run

docker-compose stop && docker-compose rm -f 

and then run the docker-compose up command do I get the new version to show up on screen as expected. Is this intended behaviour of docker-compose? i.e. should I always do a docker-compose rm -f before running up again, even on production servers? Or am I doing something against the grain here, which is why it’s not working? The goal is to have our build process build and create tagged versions of the images needed in a docker-compose.yml, push those to our private registry and then for the «release to production-step» to simply copy the docker-compose.yml to the production server and run a docker-compose pull && docker-compose -f docker-compose.yml up -d for the new image to start in production. If anyone has tips on this or can point to a best practices tutorial for this kind of setup that would be much appreciated also.

Список важных команд для работы с Docker-compose

Docker-compose является мощным инструментом для создания и управления Docker-контейнерами. Этот инструмент позволяет создавать, запускать и управлять множеством контейнеров, взаимодействуя друг с другом. В этой статье мы рассмотрим несколько команд, которые могут быть полезны при работе с Docker-compose.

Важные команды для работы с Docker-compose

Команды для управления контейнерами Docker Compose :

  • docker-compose up: для запуска всех контейнеров, определенных в файле docker-compose.yml.

Например, команда «docker-compose up» запустит все контейнеры из файла docker-compose.yml в текущей директории.

  • docker-compose down: для остановки и удаления всех контейнеров, определенных в файле docker-compose.yml.

Например, команда «docker-compose down» остановит и удалит все контейнеры, которые были запущены с помощью файла docker-compose.yml.

Команды для управления службами Docker Compose :

  • docker-compose ps: для отображения списка запущенных контейнеров и их статусов.

Например, команда «docker-compose ps» покажет все запущенные контейнеры из файла docker-compose.yml.

  • docker-compose up -d [SERVICE]: для запуска конкретной службы из файла docker-compose.yml.

Например, команда «docker-compose up nextcloud» запустит только контейнер nextcloud из файла docker-compose.yml который был остановлен.

  1. Команды для управления образами:
  • docker-compose pull: для загрузки всех образов, определенных в файле docker-compose.yml. Например, команда «docker-compose pull» загрузит все образы, указанные в файле docker-compose.yml.
  • docker-compose build: для сборки образов, определенных в файле docker-compose.yml. Например, команда «docker-compose build» соберет все образы, указанные в файле docker-compose.yml.
  1. Команды для управления логами:
  • docker-compose logs: для просмотра логов всех контейнеров, определенных в файле docker-compose.yml. Например, команда «docker-compose logs» выведет логи всех контейнеров из файла docker-compose.yml.

  • docker-compose logs [SERVICE]: для просмотра логов конкретной службы из файла docker-compose.yml. Например, команда «docker-compose logs nextcloud_db» выведет логи только контейнера базы данных из файла docker-compose.yml.

  1. Команды для управления контейнерами в работе:
  • docker-compose stop: для остановки всех контейнеров, определенных в файле docker-compose.yml, но без их удаления. Например, команда «docker-compose stop» остановит все контейнеры из файла docker-compose.yml.

  • docker-compose start: для запуска всех остановленных контейнеров, определенных в файле docker-compose.yml. Например, команда «docker-compose start» запустит все остановленные контейнеры из файла docker-compose.yml.

  • docker-compose up —force-recreate заставляет Docker Compose пересоздать контейнеры, даже если их конфигурация или образ не изменился. Это означает, что Compose остановит и удалит существующие контейнеры для указанных в файле docker-compose.yml сервисов, а затем создаст новые контейнеры с нуля, используя последнюю версию образов, определенных в файле. Использование опции —force-recreate полезно в ситуациях, когда вы внесли изменения в файл docker-compose.yml, которые затрагивают конфигурацию контейнера, например, переменные среды или отображение портов.
  • docker-compose networkls: для отображения списка сетей, определенных в файле docker-compose.yml если они есть. Так же можно воспользоваться командой docker networkls.

  • docker-compose network create [NETWORK]: для создания новой сети в файле docker-compose.yml. Например, команда «docker-compose network create frontend» создаст новую сеть с названием frontend в файле docker-compose.yml.
  • docker-compose network rm [NETWORK]: для удаления сети, определенной в файле docker-compose.yml. Например, команда «docker-compose network rm frontend» удалит сеть с названием frontend из файла docker-compose.yml.
  1. Команды для управления переменными окружения:
  • docker-compose config: для проверки корректности файла docker-compose.yml и отображения всех переменных окружения, определенных в нем. Например, команда «docker-compose config» проверит корректность файла docker-compose.yml и покажет все переменные окружения, определенные в нем.

  • docker-compose exec [SERVICE] [COMMAND]: для выполнения команды внутри контейнера, определенного в файле docker-compose.yml. Например, команда «docker-compose exec nextcloud ls» выполнит команду «ls» внутри контейнера nextcloud, который определен в файле docker-compose.yml.

  1. Команды для управления объемами:
  • docker-compose volume ls: для отображения списка всех объемов, определенных в файле docker-compose.yml. Например, команда «docker-compose volume ls» или «docker volume ls» покажет все объемы, которые определены в файле docker-compose.yml.

  • docker-compose volume create [VOLUME]: для создания нового объема, определенного в файле docker-compose.yml. Например, команда «docker-compose volume create db_data» создаст новый объем с названием db_data в файле docker-compose.yml.
  • docker-compose volume rm [VOLUME]: для удаления объема, определенного в файле docker-compose.yml. Например, команда «docker-compose volume rm db_data» удалит объем с названием db_data из файла docker-compose.yml.

В этой статье мы рассмотрели основные команды для работы с Docker Compose, такие, как запуск и остановка контейнеров, создание сетей и томов, а также управление объемами. Знакомство с этими командами поможет более эффективно использовать Docker Compose при разработке и деплое приложений в контейнерах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *