Docker(九)Docker-compose

1. Descripción general de Docker-compose

Dockerfile permite a los usuarios administrar un solo contenedor de aplicaciones; compose permite a los usuarios definir un conjunto de contenedores de aplicaciones asociados (llamados proyectos) en una plantilla (formato YAML), como un contenedor de servicios web más el contenedor de servicios de base de datos en el back-end, etc.

El proyecto Docker-Compose es un proyecto oficial de código abierto de Docker, responsable de la orquestación rápida de los clústeres de contenedores de Docker.

Docker-Compose divide los contenedores administrados en tres capas, a saber, proyecto, servicio y contenedor. Todos los archivos en el directorio de ejecución de Docker-Compose (docker-compose.yml, archivo de extensión o archivo de variable de entorno, etc.) forman un proyecto. Si no hay un nombre de proyecto específico específico, es el nombre del directorio actual. Un proyecto: puede contener varios servicios, y cada servicio define la imagen, los parámetros y las dependencias del contenedor en ejecución. Un servicio puede incluir varias instancias de contenedor, Docker-Compose no resuelve el problema del equilibrio de carga, por lo que es necesario utilizar otras herramientas para realizar el descubrimiento del servicio y el equilibrio de carga, como Consul.

El archivo de configuración del proyecto de Docker-Compose es docker-compose.yml de forma predeterminada. Puede personalizar el archivo de configuración a través de la variable de entorno COMPOSE_FTILE o el parámetro -f, que define varios servicios dependientes y los contenedores que ejecuta cada servicio.

El uso de un archivo de plantilla de Dockerfile permite a los usuarios definir fácilmente un único contenedor de aplicaciones. En el trabajo, a menudo hay situaciones en las que se requiere que varios contenedores cooperen entre sí para completar una determinada tarea. Por ejemplo, para implementar un proyecto web, además del propio contenedor de servicios web, a menudo es necesario agregar un contenedor de servicios de base de datos back-end e incluso un contenedor de equilibrio de carga.

Compose permite a los usuarios definir un conjunto de contenedores de aplicaciones asociados como un proyecto a través de un único archivo de plantilla .yml de docker-compose (formato YAML).

El proyecto Docker-Compose está escrito en Python y llama a la API proporcionada por el servicio Docker para administrar contenedores. Por lo tanto, siempre que la plataforma operativa admita la API de Docker, puede usar Compose en ella para la administración de la orquestación.

2. Formato de archivo YAML y consideraciones de preparación

YAML es un lenguaje de marcado que puede mostrar el formato de serialización de datos de forma intuitiva y es muy legible. Similar al lenguaje de descripción de datos XML, la sintaxis es mucho más simple que XML. Las estructuras de datos YAML están representadas por sangría, los elementos consecutivos están representados por signos menos, los pares clave-valor están separados por dos puntos, las matrices están entre corchetes [] y los hashes están entre corchetes {}

Tres, campos comunes de configuración de Docker Compose

campo ilustrar
construir Especifique el nombre del archivo Dockerfile Para especificar el archivo Dockerfile, debe usar la etiqueta dockerfile para especificar la etiqueta secundaria de la etiqueta de compilación.
archivo acoplable Crear ruta de contexto de imagen
contexto Puede ser la ruta del dockerfile o la dirección URL que apunta al repositorio de git
imagen espejo especificado
dominio Ejecute el comando, anulando el comando predeterminado
nombre del contenedor Especifique el nombre del contenedor, porque el nombre del contenedor es único, si especifica un nombre personalizado, no puede escalar
desplegar Especifique la configuración relacionada con la implementación y ejecución del servicio, que solo se puede usar en modo Swarm
medioambiente añadir variable de entorno
redes Únete a la red
puertos Exponga el puerto del contenedor, igual que -p, pero el puerto no puede ser inferior a 60
volúmenes Monte la ruta del host o el volumen de comando
nombre de host nombre de host del contenedor
reiniciar Estrategia de reinicio, predeterminado no, siempre, sin fallas, a menos que se detenga

1.no, la política predeterminada, el contenedor no se reinicia cuando el contenedor sale 2.en caso de falla, el contenedor se reiniciará solo cuando el contenedor sale anormalmente
(el estado de salida no es 0) 4. Siempre reinicie el contenedor cuando el contenedor salidas
5. a menos que se detenga, siempre reinicie el contenedor cuando el contenedor salga, pero no considere los contenedores que se detuvieron cuando se inició el demonio Docker

Cuarto, Comandos comunes de Docker Compose

build:重新构建服务
ps:列出容器
up:创建和启动容器	
exec:在容器里面执行命令
scale:指定一个服务容器启动数量
top:显示容器进程
logs:查看容器输出
down:删除容器、网络、数据卷和镜像
stop/start/restart:停止/启动/重启服务

Cinco, redactar implementación lnmp

(1) Paquetes de software requeridos

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y cargarla directamente (img-OPxpndiV-1647750083060) (C:\Users\zhuquanhao\Desktop\Screenshot command collection\linux \Docker\Docker-compose\1.1.bmp)]

(2) Configurar nginx

vim Dockerfile

FROM centos:7
MAINTAINER this is nginx image <jzm 2022-03-10>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
#ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html/
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
EXPOSE 443
CMD [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

(3) Configurar mysql

vim Dockerfile


FROM centos:7
MAINTAINER this is mysql image <jzm 2022-03-10>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
RUN useradd -M -s /sbin/nologin  mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j4 && make install
RUN chown -R mysql:mysql /usr/local/mysql/
ADD my.cnf /etc/my.cnf
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
#RUN systemctl enable mysqld
#VOLUME [ "/usr/local/mysql" ]
CMD  /usr/local/mysql/bin/mysqld
~                                  

vim my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

configurar php

vim Dockerfile

FROM centos:7
MAINTAINER this is php image <zww>
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel
RUN useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
ADD php.ini /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

Configurar el archivo Docker-compose.yml

version: '2'
services:
   nginx:
     build:
       context: ./nginx
       dockerfile: Dockerfile
     container_name: nginx
     ports:
       - 1314:80
       - 1315:443
     networks:
       lnmp:
         ipv4_address: 172.20.0.10
     volumes:
       - ./nginx/html/:/usr/local/nginx/html
   mysql:
     build:
       context: ./mysql
       dockerfile: Dockerfile
     container_name: mysql
     ports:
        - 3306:3306
     networks:
       lnmp:
         ipv4_address: 172.20.0.20
     volumes:
        - /usr/local/mysql
   php:
     build:
       context: ./php
       dockerfile: Dockerfile
     container_name: php
     ports:
       - 9000:9000
     networks:
       lnmp:
         ipv4_address: 172.20.0.30
     volumes_from:
       - nginx
       - mysql
     depends_on:
       - nginx
       - mysql
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

ejecutar docker-compose

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

Vaya al contenedor de MySQL y otorgue permisos

docker exec -it mysql bash

 mysql
 
mysql> create database wordpress;

mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123';

mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';

mysql> flush privileges;

prueba de acceso al navegador

http://192.168.100.135/wordpress/index.php

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leech, se recomienda guardar la imagen y cargarla directamente (img-bejaxjuh-1647750083061) (C:\Users\zhuquanhao\Desktop\Screenshot command collection\linux \Docker\Caso de Docker\16.bmp)]

Supongo que te gusta

Origin blog.csdn.net/weixin_54059979/article/details/123610679
Recomendado
Clasificación