В наших предыдущих статьях этой серии мы рассмотрели, что такое Docker , и как вручную создавать контейнеры Docker для WordPress .
В этой статье я покажу вам, как настроить Docker гораздо проще. У Docker есть официальный образ для WordPress, который облегчает начало работы. Мы также проверим Docker Compose для конфигурации, подобной Heroku. В конце концов, создание и управление контейнерами вручную может занять много времени.
Официальное изображение WordPress Docker
Прежде чем мы начнем, убедитесь, что вы создали новую папку и перемещаетесь внутри этой папки.
В моей предыдущей статье мы создали контейнер MySQL . Официальный образ WordPress (от команды Docker) требует, чтобы у вас был запущенный контейнер MySQL.
docker run --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -d mysql: 5.7
Затем найдите «WordPress» в Docker Hub и вытяните это изображение.
docker pull wordpress
Затем создайте контейнер из него.
docker run -e WORDPRESS_DB_PASSWORD = password -d -- name wordpress -- link wordpressdb:mysql wordpress
Мы видим две переменные среды. WORDPRESS_DB_PASSWORD
— это пароль базы данных для нашего пользователя. Но мы еще не уточнили это. Не беспокойтесь, это изображение будет использовать значения по умолчанию для переменных среды, которые мы не указали (при первом создании контейнера). Например, WORDPRESS_DB_USER
будет root
если мы его не определим. То же самое относится к имени базы данных с wordpress
по умолчанию. Ознакомьтесь с официальной документацией для дополнительных переменных среды. -d
заставляет контейнер работать в фоновом режиме. Мы не можем видеть IP-адрес контейнера, чтобы заставить этот исполняющий docker inspect wordpress
чтобы получить его IP и порт. У 172.17.0.10
а порт 80. С помощью docker inspect
вы можете найти много полезной информации о контейнере.
Посетите IP-адрес вашего контейнера WordPress в вашем браузере, и вы увидите что-то вроде этого:
Проблема этого примера в том, что мы не можем получить доступ к файлам WordPress, и каждый раз, когда мы запускаем контейнер, он меняет свой IP. Но мы можем легко решить обе эти проблемы.
docker run -e WORDPRESS_DB_PASSWORD =password -d --name wordpress --link wordpressdb: mysql -p 127.0 . 0 . 2 : 8080 : 80 -v "$PWD/" :/var/www/html wordpress
Это очень длинная команда, здесь мы видим два новых аргумента. Аргументы -p
и -v
. Аргумент -p
используется для сопоставления портов . Внутри контейнера Apache работает через порт 80
. Мы сообщаем Docker, что будем использовать порт 8080
для связи с портом 80
внутри контейнера. Кроме того, мы указали 127.0.0.2
в качестве IP- 127.0.0.2
для этого контейнера. -v "$PWD/":/var/www/html
отобразит две папки. По умолчанию контейнер помещает файлы WordPress в каталог /var/www/html
который является файловой системой внутри контейнера (это не имеет ничего общего с нашей локальной файловой системой). Проверьте ваш текущий каталог, и вы увидите, что некоторые дополнительные файлы там.
Используя ваш новый контейнер, вы теперь сможете изменять файлы в нашей файловой системе. В предыдущем примере было гораздо больше работы, чтобы иметь возможность писать в нашу файловую систему. Этот метод намного проще. Но может ли это быть проще? Конечно, это возможно!
Docker Compose
До сих пор мы видели, как создавать наши контейнеры с помощью команд на терминале. Столько, сколько я люблю Linux и терминал, я действительно не хочу создавать контейнеры, используя командную строку и постоянно помня различные аргументы. Вот почему Docker Compose существует.
Этот инструмент был запущен под названием Fig (не командой Docker) как Open Source, более простое решение для управления несколькими контейнерами. Теперь инструмент официально поддерживается Docker (под названием Docker Compose). Прежде чем перейти в Compose, обязательно сначала установите его . Все, что вам нужно, это файл docker-compose.yml
и новая папка проекта. В этом файле мы напишем всю конфигурацию, необходимую для сборки контейнера WordPress и MySQL . Docker Compose, как и Docker CLI, использует демон Docker для создания контейнеров, поэтому в основном вы можете делать практически все, что вы делали с CLI.
Давайте посмотрим на пример:
web: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD =password ports: - "127.0.0.3:8080:80" mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD =password - MYSQL_DATABASE =wordpress
-web: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD =password ports: - "127.0.0.3:8080:80" mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD =password - MYSQL_DATABASE =wordpress
по темеweb: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD =password ports: - "127.0.0.3:8080:80" mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD =password - MYSQL_DATABASE =wordpress
Это должно быть знакомо большинству читателей. web
и mysql
— это имена контейнеров. Когда эти контейнеры создаются из Compose, фактические имена отличаются. Контейнер, созданный из Compose, имеет имя наподобие [foldername]compose_[containername]_[number]
. [foldername]
будет родительской папкой docker-compose.yml
, [containername]
будет web или mysql в этом случае, а [number]
будет номером контейнера. Преимущество Compose состоит в том, что вы можете иметь более одного контейнера одного типа. У нас может быть два веб-контейнера. Их имена в этом случае будут [foldername]compose_web_1
и [foldername]compose_web_2
. Это также относится к другим контейнерам, которые определены в docker-compose.yml
(например, контейнер mysql ).
При использовании контейнеров одного типа вам необходимо указать отдельные IP-адреса.
environment: - WORDPRESS_DB_PASSWORD = password
Это работает как -e WORDPRESS_DB_PASSWORD=password
.
links: - mysql
по темеlinks: - mysql
Это работает как --link mysql:mysql
.
ports: - "127.0.0.3:8080:80"
Это работает так же, как -p 127.0.0.3:8080:80
.
Чтобы узнать больше о командах Docker Compose и docker-compose.yml
, вы найдете ссылку на CLI здесь и ссылку на docker-compose.yml здесь .
Теперь, когда у вас есть файл docker-compose.yml
, выполните docker-compose up
и Compose начнет docker-compose.yml
контейнеров для вас. Перейдите к 127.0.0.3:8080
и вы снова увидите страницу приветствия. Теперь все, что нам нужно, это доступ к файлам WordPress.
Как мы уже обсуждали ранее, чтобы получить доступ к файлам WordPress в нашей локальной файловой системе, нам нужно сделать что-то вроде -v "$PWD/":/var/www/html
. Вы должны добавить рабочий каталог и отобразить две папки (одну в вашем контейнере и одну в локальной файловой системе). Для этого мы просто добавляем следующие две строки:
working_dir: /var/www/html volumes: - wordpress/wp-content/ :/var/www/html/wp-content
working_dir
указывает образу WordPress установить WordPress в этот каталог. volumes:
ведет себя как -v "$PWD/wordpress":/var/www/html/wp-content
. Файлы WordPress находятся в папке /var/www/html
. Нас действительно интересует только папка wp-content
, поскольку там находятся наши плагины и темы. В конце концов, большинство разработчиков имеют дело только с этой папкой.
Снова выполните docker-compose up
. Если вы работаете в Linux, вы должны изменить права доступа к папке wordpress
(локальной папке) на запись. Это потому, что контейнеры создаются демоном Docker, процессом, который запускается при загрузке системы (пользователем sudo). Чтобы исправить это, выполните:
sudo chmod -R 777 wordpress
Теперь у вас будет доступ на запись в эти папки, и вам будет хорошо!
Вывод
В этой статье мы увидели, как использовать официальный образ WordPress Docker, и познакомимся с Docker Compose. Если вы еще не проверили предыдущие статьи этой серии, вы можете найти их ниже:
Эта серия не будет полной, если вы не покажете, как развернуть проект WordPress. В следующей статье я покажу вам, как развернуть проект WordPress на основе Docker в DigitalOcean. Будьте на связи!
Если вы читали эту серию так далеко, у вас должно быть гораздо лучшее понимание основополагающих концепций работы Docker. Теперь вы должны быть в состоянии работать с абстракциями и инструментами, которые делают вещи еще проще. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий ниже. Я знаю, что спрашиваю уже в третий раз, но мне очень интересно, не могли бы вы подумать об использовании Docker для вашего следующего проекта?