docker compose construir processo de aprendizado

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

Estrutura e versão do arquivo do Compose - Dicas do Docker

Acho que você gosta

Origin blog.csdn.net/deng_zhihao692817/article/details/129539424
Recomendado
Clasificación