estructura gramatical basica
version: "3.8"
services: # 容器
servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
image: # 镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
environment: # 可选,相当于 docker run里的 --env
volumes: # 可选,相当于docker run里的 -v
networks: # 可选,相当于 docker run里的 --network
ports: # 可选,相当于 docker run里的 -p
servicename2:
volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create
Tome el ejercicio Python Flask + Redis: como ejemplo, transfórmelo en un archivo docker-compose
Cree una nueva carpeta de matraz-redis con app.py, Dockerfile
#app.py文件
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
#Dockerfile文件
FROM python:3.9.5-slim
RUN pip install flask redis && \
groupadd -r flask && useradd -r -g flask flask && \
mkdir /src && \
chown -R flask:flask /src
USER flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK_APP=app.py REDIS_HOST=redis
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
1. Tire de la imagen redis
docker image pull redis
2. Tire de la imagen de Python
docker pull python:3.9.5-slim
3. Ingrese a la carpeta actual de matraz-redis y ejecute
docker image build -t flask-redis .
4. Ingrese la imagen acoplable ls, hay 3 imágenes
5. Crea una red
docker network create -d bridge demo-network
6. Crea el contenedor
docker container run -d --name redis-server --network demo-network redis
docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo
Una vez que se haya familiarizado con este capítulo, primero creará dos imágenes de Flass-Redis y Redis, y luego ejecutará dos contenedores. Pero el contenido del archivo docker-compose.yml no se usa.
Cree un nuevo archivo docker-compose.yml
#docker-compose.yml文件
version: "3.8"
services:
flask-redis:
container_name: flask-redis
image: flask-redis:latest
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
container_name: redis-latest
image: redis:latest
networks:
- demo-network
networks:
demo-network:
Luego, ejecute el comando docker-compose up -d para ejecutar dos contenedores al mismo tiempo, es decir, para completar la creación de imágenes y la operación del contenedor directamente a través del comando docker-compose, que se implementa en un solo paso.
6. Utilice el comando docker container rm xxx xxx para eliminar los dos contenedores creados anteriormente y conservar el archivo de imagen anterior.
7. Ejecute docker-compose
docker-compose up
Este comando es para crear dos contenedores e iniciarlos normalmente después de tener la imagen del matraz-redis
Presione ctrl+c para salir y detenerse.
Ingrese para ver el contenedor, y puede ver que se crean automáticamente dos contenedores cuyo estado es salir.
docker container ls -a
Use el comando -d para ejecutar en segundo plano en su lugar
docker-compose up -d
Pero compré este servidor Ali, pero no se puede abrir normalmente a través de la dirección IP + número de puerto.
Más tarde, descubrí que el servidor de Alibaba Cloud que compré se debió a que el puerto no se abrió.
También puede verlo ejecutando el comando docker-compose ps
docker-compose ps
Lo principal es que el comando docker-compose ps debe ejecutarse en el directorio actual.
Ejecute docker-compose stop para detener la ejecución
docker-compose stop
Capacidad para ver contenedores detenidos
Ejecutar eliminar, todo será eliminado
docker-compose rm
También necesita crear la red en este momento, docker-compose no la eliminará por usted, debe eliminarla manualmente usted mismo.
Solo para referencia de aprendizaje.
Lo anterior se basa en la premisa de construir una imagen de matraz-redis por adelantado, para docker-compose
¿Qué pasa si no tenemos esta imagen especular? A continuación, al modificar el archivo docker-compose.yml, la imagen del matraz-redis se crea automáticamente y se crean y ejecutan normalmente dos contenedores.
Por ejemplo, tengo una carpeta de matraz-py, una carpeta de matraz y docker-compose.yml. Estos dos están al mismo nivel.
version: "3.8"
services:
#flask是容器名称
flask:
#通过build构建镜像
build:
context: ./flask #构建的文件夹./flask context意思是要的build的目录
dockerfile: Dockerfile # Dockerfile的名字
image: flask:latest #镜像的名称
environment:
- REDIS_HOST=redis-server
networks:
- demo-network
ports:
- 8080:5000
redis-server:
container_name: redis-latest
image: redis:latest
networks:
- demo-network
networks:
demo-network:
Luego, elimine la imagen del matraz-redis creada antes, la imagen acoplable rm xxx (id)
Luego cargue la carpeta del matraz-py, y luego cd en ella
Ejecutar una orden
docker-compose build
Pero aquí solo construyó un espejo para mí, sin los dos contenedores y redes que se crearon automáticamente.
¿Eso significa que la compilación de docker-compose falló?
Entonces es imposible construir directamente.
Elimine la imagen construida primero. Ejecute el comando pull para extraer la imagen de matraz-redis, que creará automáticamente la imagen.
docker-compose pull
Entonces up -d comienza en segundo plano,
docker-compose up -d
Finalmente docker-compose ps
imagen acoplable ls
contenedor acoplable ls -a
red acoplable ls
puede ver los datos.
Finalmente ejecutar eliminar todo lo recién creado
docker system prune -f
referencia
Componer la estructura y la versión del archivo - Docker Tips