estrutura gramatical básica
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
Pegue o exercício Python Flask + Redis: como exemplo, transforme-o em um arquivo docker-compose
Crie uma nova pasta flask-redis com 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. Puxe a imagem redis
docker image pull redis
2. Puxe a imagem do python
docker pull python:3.9.5-slim
3. Entre na pasta atual do flask-redis e execute
docker image build -t flask-redis .
4. Insira a imagem do docker ls, existem 3 imagens
5. Crie uma rede
docker network create -d bridge demo-network
6. Crie o contêiner
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
Depois de se familiarizar com este capítulo, você primeiro criará duas imagens de flask-redis e redis e, em seguida, executará dois contêineres. Mas o conteúdo do arquivo docker-compose.yml não é usado.
Crie um novo arquivo 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:
Em seguida, execute o comando docker-compose up -d para executar dois contêineres ao mesmo tempo, ou seja, para concluir a construção da imagem e a operação do contêiner diretamente por meio do comando docker-compose, que é ativado em uma etapa.
6. Use o comando docker container rm xxx xxx para excluir os dois contêineres criados anteriormente e manter o arquivo de imagem anterior
7. Execute o docker-compose
docker-compose up
Este comando é para criar dois contêineres e iniciá-los normalmente depois de ter a imagem flask-redis
Pressione ctrl+c para sair e parar.
Entre para visualizar o contêiner e você pode ver que dois contêineres cujo status é encerrado são criados automaticamente para você.
docker container ls -a
Use o comando -d para executar em segundo plano
docker-compose up -d
Mas comprei este servidor Ali, mas não pode ser aberto normalmente através do endereço IP + número da porta.
Mais tarde, descobri que o servidor Alibaba Cloud que comprei foi causado pela porta não aberta.
Você também pode vê-lo executando o comando docker-compose ps
docker-compose ps
O principal é que o comando docker-compose ps deve ser executado no diretório atual.
Execute docker-compose stop para interromper a execução
docker-compose stop
Capacidade de visualizar contêineres parados
Execute delete, todos serão deletados
docker-compose rm
Você também precisa criar a rede agora, o docker-compose não irá excluí-la para você, você mesmo deve excluí-la manualmente.
Apenas para referência de aprendizado.
Os itens acima são baseados na premissa de construir uma imagem flask-redis com antecedência, para compor docker
E se não tivermos essa imagem espelhada? Em seguida, modificando o arquivo docker-compose.yml, a imagem flask-redis é criada automaticamente e dois contêineres são criados e executados normalmente.
Por exemplo, eu tenho uma pasta flask-py, uma pasta flask e docker-compose.yml. Esses dois estão no mesmo nível.
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:
Em seguida, exclua a imagem flask-redis criada antes, docker image rm xxx(id)
Em seguida, carregue a pasta flask-py e, em seguida, cd nela
Executando um pedido
docker-compose build
Mas ele só construiu um espelho para mim aqui, sem os dois containers e as redes que foram criadas automaticamente.
Isso significa que a compilação do docker-compose falhou?
Então é impossível construir diretamente.
Exclua a imagem construída primeiro. Execute o comando pull para puxar a imagem do flask-redis, que irá construir a imagem automaticamente.
docker-compose pull
Em seguida, up -d começa em segundo plano,
docker-compose up -d
Finalmente docker-compose ps
imagem do docker ls
contêiner docker ls -a
rede docker ls
pode ver os dados.
Finalmente execute delete tudo que acabou de criar
docker system prune -f
referência