Разверните среду 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 подключается к Redisres = $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 rm
ID контейнера Удалить контейнер, примечание, запущенный контейнер удалить нельзя -
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 attach
ID контейнера в контейнер - ############################################################
-
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