Разверните среду LNMP+Redis с помощью Docker

Docker

Разверните среду LNMP+Redis с помощью Docker

Введение в Докер

Docker — это механизм контейнера приложений с открытым исходным кодом, который позволяет разработчикам упаковывать свои приложения и зависимости в переносимый контейнер, который затем можно распространять на любую популярную машину Linux, а также можно виртуализировать. Контейнеры полностью изолированы и не имеют никакого интерфейса друг с другом. Рекомендуемая версия ядра 3.8 и выше

Зачем использовать Докер

  1. Ускоряет процесс локальной разработки и сборки, контейнеры можно создавать в среде разработки, затем легко отправлять в тестовую среду и, наконец, в производственную среду.
  2. Возможность запускать независимые службы или приложения одинаково в разных средах.
  3. Создайте изолированную среду для тестирования
  4. Высокопроизводительное сверхспланированное развертывание хоста
  5. Создайте собственную среду PaaS, скомпилировав или расширив существующие платформы OpenShift или Cloud Foundry с нуля.

содержание

Адрес исходного кода проекта: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. Тот, который поставляется с этим проектом, пуст и нуждается в замене. самостоятельно. оставьте имя файла прежним)

в контейнер

  1. использовать докер exec
docker exec -it ngixn /bin/sh
  1. Используйте команду 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

  1. Установите расширения в официальном исходном пакете 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, вам необходимо сначала загрузить этот пакет.

  1. Установка расширения PECL
# 安装扩展
RUN pecl install memcached-2.2.0 \
    # 启用扩展
    && docker-php-ext-enable memcached \
  1. Установите, загрузив исходный код расширения, скомпилировав и установив
# 安装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 подключается к Redisredis = new 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