Разверните среду LNMP+Redis с помощью Docker
Введение в Докер
Docker — это механизм контейнера приложений с открытым исходным кодом, который позволяет разработчикам упаковывать свои приложения и зависимости в переносимый контейнер, который затем можно распространять на любую популярную машину Linux, а также можно виртуализировать. Контейнеры полностью изолированы и не имеют никакого интерфейса друг с другом. Рекомендуемая версия ядра 3.8 и выше
Зачем использовать Докер
- Ускоряет процесс локальной разработки и сборки, контейнеры можно создавать в среде разработки, затем легко отправлять в тестовую среду и, наконец, в производственную среду.
- Возможность запускать независимые службы или приложения одинаково в разных средах.
- Создайте изолированную среду для тестирования
- Высокопроизводительное сверхспланированное развертывание хоста
- Создайте собственную среду PaaS, скомпилировав или расширив существующие платформы OpenShift или Cloud Foundry с нуля.
содержание
- Установить Докер
- Структура каталогов
- быстрый в использовании
- в контейнер
- Установка расширения PHP
- Установка композитора
- Вопросы-Ответы
- Общие команды
- Синтаксис Dockerfile
- описание синтаксиса docker-compose
Адрес исходного кода проекта:GitHub
Установить Докер
установка окон
mac
справочник по панели инструментов докера
linux
# 下载安装
curl -sSL https://get.docker.com/ | sh
# 设置开机自启
sudo systemctl enable docker.service
sudo service docker start|restart|stop
# 安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Структура каталогов
docker_lnmp
├── v2
├── mysql
│ └── Dockerfile
│ └── my.cnf
├── nginx
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── log
│ │ └── error.log
│ └── www
│ ├── index.html
│ ├── index.php
│ ├── db.php
│ └── redis.php
├── php
│ ├── Dockerfile
│ ├── www.conf
│ ├── php-fpm.conf
│ ├── php.ini
│ └── log
│ └── php-fpm.log
└── redis
└── Dockerfile
└── redis.conf
Создать образ и установить
Используйте docker-compose напрямую, чтобы создавать образы и запускать контейнеры одним щелчком мыши.
версия первая
В этой версии каждая служба устанавливается путем извлечения чистого образа CentOS и компиляции исходного кода с помощью команд, связанных с Dockerfile. Поэтому этот способ очень удобен для настройки нужного вам изображения, но занимает много места и медленно строится.
git clone https://github.com/voocel/docker-lnmp.git
cd docker-lnmp
docker-compose up -d
Версия 2 (рекомендуется)
git clone https://github.com/voocel/docker-lnmp.git
cd docker-lnmp/v2
chmod 777 ./redis/redis.log
chmod -R 777 ./redis/data
docker-compose up -d
Эта версия предназначена для извлечения образов каждой службы, созданной официальным лицом, а затем внесения соответствующих корректировок в соответствии с вашими потребностями с помощью команд, связанных с Dockerfile. Таким образом, этот метод быстр в сборке и прост в использовании, поскольку он основан на Alpine Linux, поэтому занимает мало места.
контрольная работа
Используйте docker ps для просмотра состояния запуска контейнера, если все запускается нормально, то Тестирование можно выполнить, обратившись к 127.0.0.1, 127.0.0.1/index.php, 127.0.0.1/db.php, 127.0.0.1/redis.php. (Если вы хотите использовать https, измените файл dockerfile под nginx и раскомментируйте nginx.conf при появлении запроса. Вам нужно добавить свой собственный файл сертификата в папку ssl. Тот, который поставляется с этим проектом, пуст и нуждается в замене. самостоятельно. оставьте имя файла прежним)
в контейнер
- использовать докер exec
docker exec -it ngixn /bin/sh
- Используйте команду nsenter
# cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
# ./configure --without-ncurses
# make nsenter && sudo cp nsenter /usr/local/bin
Для подключения к контейнеру также необходимо найти PID первого процесса контейнера, который можно получить и выполнить с помощью следующей команды.
PID=$(docker inspect --format "{{ .State.Pid }}" container_id)
# nsenter --target $PID --mount --uts --ipc --net --pid
Установка расширения PHP
- Установите расширения в официальном исходном пакете PHP (например: установите четыре расширения одновременно: pdo_mysql mysqli pcntl gd)
Добавьте следующую команду в Dockerfile php
RUN apk add libpng-dev \
&& docker-php-ext-install pdo_mysql mysqli pcntl gd \
Примечание. Поскольку в образе отсутствует пакет libpng-dev, необходимый для библиотеки gd, вам необходимо сначала загрузить этот пакет.
- Установка расширения PECL
# 安装扩展
RUN pecl install memcached-2.2.0 \
# 启用扩展
&& docker-php-ext-enable memcached \
- Установите, загрузив исходный код расширения, скомпилировав и установив
# 安装Redis和swoole扩展
RUN cd ~ \
&& wget https://github.com/phpredis/phpredis/archive/4.2.0.tar.gz \
&& tar -zxvf 4.2.0.tar.gz \
&& mkdir -p /usr/src/php/ext \
&& mv phpredis-4.2.0 /usr/src/php/ext/redis \
&& docker-php-ext-install redis \
&& apk add libstdc++\
&& cd ~ \
&& wget https://github.com/swoole/swoole-src/archive/v4.2.12.tar.gz \
&& tar -zxvf v4.2.12.tar.gz \
&& mkdir -p /usr/src/php/ext \
&& mv swoole-src-4.2.12 /usr/src/php/ext/swoole \
&& docker-php-ext-install swoole \
Примечание. Поскольку этот образ должен сначала установить libstdc++, от которого зависит swoole, в противном случае расширение swoole не может быть нормально загружено после успешной установки.
Установка композитора
Добавить в Dockerfile
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
Вопросы-Ответы
-
Проблема сбоя запуска Redis В версии v2 стартовым пользователем redis является redis, а не root, поэтому ./redis/redis.log и ./redis/data, смонтированные на хосте, должны иметь права на запись.
chmod 777 ./redis/redis.log chmod 777 ./redis/data -
Проблема сбоя соединения MYSQL В версии v2 это последняя версия MySQL8, и метод аутентификации по паролю этой версии Caching_sha2_password, но младшие версии инструментов визуализации php и mysql могут его не поддерживать.Вы можете проверить, поддерживается ли метод аутентификации через загруженные плагины mysqlnd в phpinfo, в противном случае вам нужно изменить его на исходный метод аутентификации mysql_native_password:
select user,host,plugin,authentication_string from mysql.user; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; -
Обратите внимание на права доступа к каталогу монтирования, иначе контейнер будет закрыт сразу после нескольких секунд успешного запуска, например: только что возникнет ситуация, когда следующий каталог /data/run/mysql не имеет разрешений
docker run --name mysql57 -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -v /data/logs/mysql:/var/log/mysql -v /data/run/mysql:/var/run/mysqld -e MYSQL_ROOT_PASSWORD=123456 -it centos/mysql:v5.7 -
Следует отметить, что каталог в php.ini, соответствующий каталогу конфигурации mysql, должен быть смонтирован для получения содержимого файла, иначе php не сможет подключиться к mysql.
``` # php.ini mysql.default_socket = /data/run/mysql/mysqld.sock mysqli.default_socket = /data/run/mysql/mysqld.sock pdo_mysql.default_socket = /data/run/mysql/mysqld.sock # mysqld.cnf pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock ``` -
Не могу подключиться к Redis с помощью php
# 错误的 $redis = new Redis; $rs = $redis->connect('127.0.0.1', 6379);PHP не может подключиться, проверьте журнал ошибок
PHP Fatal error: Uncaught RedisException: Redis server went away in /www/index.php:7Учитывая, что связь между докерами должна быть недоступна, 127.0.0.1 должен использовать ip в контейнере, поэтому проверьте ip контейнера redis
[root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5f7dcecff4c docker_nginx "/usr/sbin/nginx -..." 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx 60fd2df36d0e docker_php "/usr/local/php/sb..." 7 seconds ago Up 5 seconds 9000/tcp php 7c7df6f8eb91 hub.c.163.com/library/mysql:latest "docker-entrypoint..." 12 seconds ago Up 11 seconds 3306/tcp mysql a0ebd39f0f64 docker_redis "usr/local/redis/s..." 13 seconds ago Up 12 seconds 6379/tcp redisОбратите внимание, что при тестировании для адреса подключения требуется IP-адрес контейнера или имена контейнеров, такие как redis, mysql. Например, php-файл конфигурации nginx анализирует fastcgi_pass php:9000; Например, php подключается к Redis
res = $redis->connect('redis', 6379);
Поскольку IP-адрес контейнера динамический, он изменится после перезапуска, поэтому вы можете создать статический IP-адрес.
Шаг 1. Создайте собственную сеть
#备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段 docker network create --subnet=172.171.0.0/16 docker-at docker run --name redis326 --net docker-at --ip 172.171.0.20 -d -p 6379:6379 -v /data:/data -it centos/redis:v3.2.6После подключения к Redis вы можете настроить соответствующий IP-адрес, и подключение будет успешным.
$redis = new Redis; $rs = $redis->connect('172.171.0.20', 6379);Кроме того, есть еще одна возможность, что phpredis не может подключиться к redis, и конфигурацию redis.conf нужно немного изменить.
bind 127.0.0.1 改为: bind 0.0.0.0 -
При запуске веб-сервиса docker порт виртуальной машины перенаправляется и к нему нельзя получить доступ извне.Как правило, это происходит во время обновления yum (ВНИМАНИЕ: переадресация IPv4 отключена. Сеть не будет работать.) или хост может получить к нему доступ, но извне не может получить к нему доступ.
vi /etc/sysctl.conf
或者
vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
systemctl restart network
查看是否修改成功
sysctl net.ipv4.ip_forward
如果返回为"net.ipv4.ip_forward = 1"则表示成功了
- Если последняя версия MySQL8 не может быть нормально подключена, удаленное подключение невозможно из-за изменения метода шифрования пароля последней версии.
# 修改密码加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Общие команды
-
docker startИмя контейнера (идентификатор контейнера также допустим) -
docker stopИмя контейнера (идентификатор контейнера также допустим) -
docker runДобавьте параметр -d в команду, docker запустит контейнер в фоновом режиме. -
docker psработающий контейнер -
docker logs--tail 10 -tf имя контейнера Просмотр файла журнала контейнера, добавьте -t, чтобы добавить метку времени, f, чтобы отслеживать последний журнал контейнера, не читая весь файл журнала -
docker topИмя контейнера Просмотр процессов, запущенных внутри контейнера -
docker exec -dИмя контейнера touch /etc/new_config_file создает пустой файл с помощью фоновой команды -
docker run --restart=always --nameИмя контейнера -d ubuntu /bin/sh -c "while true;do echo hello world; sleep 1; done" Независимо от кода выхода, docker автоматически перезапустит контейнер, вы можете установить --restart=on-failure :5 для автоматического перезапуска количество раз -
docker inspectИмя контейнера Чтобы подробно проверить контейнер, вы можете добавить --format='{(.State.Running)}' для получения указанной информации -
docker rmID контейнера Удалить контейнер, примечание, запущенный контейнер удалить нельзя -
docker rm $(docker ps -aq)удалить все контейнеры -
docker rmi $(docker images -aq)удалить все зеркала -
docker imagesсписок зеркал -
docker pullИмя зеркала: Зеркало тяги ярлыка -
docker searchНайдите общедоступные образы на Docker Hub -
docker build -t='AT/web_server:v1'После команды вы можете напрямую добавить файл Dockerfile, который существует в нужном каталоге репозитория github. Команда используется после записи Dockerfile. Параметр -t задает репозиторий и имя:тег для нового образа. -
docker loginВойдите в Docker Hub, личная информация для аутентификации будет сохранена в $HOME/.dockercfg, -
docker commit -m="comment " --author="AT"Container ID Имя пользователя/имя репозитория образа: label Этот метод не рекомендуется, рекомендуется dockerfile -
docker historyИдентификатор изображения Более глубокое изучение того, как создаются изображения -
docker portПорт идентификатора зеркала Проверьте идентификатор контейнера и номер порта контейнера ситуации сопоставления, предполагая, что запрашивается сопоставленный порт, соответствующий порту 80. -
runЧтобы запустить контейнер, -p 8080:80 сопоставляет порт 80 в контейнере с определенным портом хоста докера, привязывает порт 80 контейнера к порту 8080 хоста, а 127.0.0.1:80:80 — это порт 80. порт контейнера привязан к порту 80 IP-адреса хоста, -P должен предоставить порт 80 в контейнере для локального хоста - docs.docker.com/reference/no…увидеть больше команд
-
docker pushимя изображения отправить изображение в Docker Hub -
docker rmiимя зеркала удалить зеркало -
docker attachID контейнера в контейнер - ############################################################
-
docker network create --subnet=172.171.0.0/16 docker-atВыберите сегмент сети 172.172.0.0 -
docker buildВы можете добавить -ip, чтобы указать IP-адрес контейнера 172.171.0.10.
Команда для удаления всех контейнеров и образов
docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]` 删除停止的容器
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
Синтаксис Dockerfile
-
MAINTAINERИдентифицирует автора и контактную информацию зеркала -
EXPOSEМожно указать несколько EXPOSE, чтобы открыть несколько портов для внешнего мира, что может помочь нескольким ссылкам на контейнеры. -
FROMДиректива указывает существующий образ -
\#Символ представляет собой примечание -
RUNЧтобы запустить команду, используйте командную оболочку /bin/sh -c в оболочке для ее выполнения. Если вы работаете на платформе, которая не поддерживает оболочку или не хотите работать в оболочке, вы также можете использовать команду RUN в формате exec. -
ENV REFRESHED_ATПеременная среды. Эта среда также используется для указания времени последнего обновления шаблона изображения. -
VOLUMEКонтейнеры добавляют объемы. Том — это определенный каталог, который может существовать в одном или нескольких контейнерах. Изменение тома вступает в силу немедленно, и изменение тома не повлияет на обновление образа продукта, например: VOLUME["/opt/project "," /данные"] -
ADDСкопируйте файлы и каталоги из среды сборки в образ. Например, ADD nginx.conf /conf/nginx.conf также может быть адресным файлом URL-адреса.Если это сжатый пакет, команда ADD автоматически распаковывает, -
USERУказывает ПОЛЬЗОВАТЕЛЯ для запуска образа с -
COPYЭто копирование локальных файлов без извлечения файлов (распакованный пакет не будет распаковываться автоматически). Пример: COPY conf.d/ /etc/apache2/ Скопируйте файлы из локального каталога conf.d в каталог /etc/apache2/
описание синтаксиса docker-compose.yml
-
imageУказывается как имя изображения или идентификатор изображения. Если зеркало не существует, Compose попытается получить зеркало из Интернета. -
buildУкажите путь к папке, в которой находится Dockerfile. Compose будет использовать его для автоматического создания этого образа, а затем использовать этот образ. -
commandПереопределить команду по умолчанию, выполняемую после запуска контейнера. -
linksСвязывайтесь с другими контейнерами службы, используя либо имя службы (также в качестве псевдонима), либо псевдоним службы (SERVICE:ALIAS). -
external_linksСсылки на контейнеры за пределами docker-compose.yml, которые даже не управляются Compose. Формат параметра аналогичен ссылкам -
portsРаскрыть информацию о порте. Порт хост-компьютера: формат порта контейнера (HOST:CONTAINER) или просто укажите порт контейнера (хост-компьютер назначит порт случайным образом) (Примечание. При использовании формата HOST:CONTAINER для сопоставления портов, если вы используете порт контейнера меньше 60. Вы можете получить неправильные результаты, поскольку YAML будет анализировать числа типа xx:yy как шестнадцатеричные. Рекомендуется строковый формат.) -
exposeПредоставление порта. В отличие от сообщений, раскрытие может отображать только порт и не может быть сопоставлено с хостом. Он используется только для внешних сервисных подключений, только внутренний порт может быть указан в качестве параметра. -
volumesУстанавливает путь для монтирования томов. Вы можете установить путь к хосту: путь к контейнеру (хост:контейнер) или добавить режим доступа (хост:контейнер:ро) ro означает только чтение, режим только для чтения -
volunes_fromСмонтировать все тома данных другого сервиса или контейнера -
environmentУстановите переменные среды. Может принадлежать формату массива или словаря. Если указано только имя переменной, ее значение на хосте Compose будет автоматически загружено, что можно использовать для предотвращения ненужной утечки данных. -
env_fileПолучите переменные среды из файла либо в виде отдельных путей к файлам, либо в виде списка. Если файл шаблона указан с помощью docker-compose -f FILE, путь в env_file будет основан на пути к файлу шаблона. Если имя переменной конфликтует с директивой среды, последняя имеет преимущественную силу (каждая строка в файле переменных среды должна быть прокомментирована, и строки комментариев, начинающиеся с #, поддерживаются). -
extendsОн основан на существующей службе расширения услуг. Например, у нас есть сервис webapp, файлы шаблонов common.yml. Development.yml напишите новый файл, используйте сервис webapp common.yml расширения. Последний автоматически наследует common.yml службы веб-приложений и связанных переменных среды. -
netУстановите сетевой режим. Используйте то же значение, что и параметр Docker Client --NET. -
pidРазделите пространство имен процесса с хост-системой.Контейнеры с включенной этой опцией могут получать доступ и управлять друг другом через идентификатор процесса. -
dnsНастройте DNS-сервер. Может быть значением или списком -
cap_add,cap_dropВозможность Linux добавлять или удалять контейнеры -
dns_searchНастройте домены поиска DNS. Может быть значением или списком - Примечание: при использовании compose для оркестрации и управления контейнерами Docker необходимо написать файл docker-compose.yml, поскольку при его написании в первый раз легко столкнуться с относительно низкоуровневыми проблемами, приводящими к ошибке синтаксического анализа. файл yml первым при выполнении docker-compose up. Более распространены строгие требования yml к отступам. Отступ после файла yml в порядке, ключевой символ табуляции не разрешен, можно использовать только пробелы, а также требуется количество пробелов, обычно два пробела.
Адрес исходного кода проекта:GitHub