docker compose构建学习过程

基本语法结构

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

以 Python Flask + Redis练习:为例子,改造成一个docker-compose文件

新建一个flask-redis文件夹,有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. 拉取redis镜像

docker image pull redis

 2. 拉取python镜像

docker pull python:3.9.5-slim

3.进入flask-redis当前文件夹, 执行

docker image build -t flask-redis .

4. 输入docker image ls, 有了3个镜像

 5.创建网络

docker network create -d bridge demo-network

 6.创建容器

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

 这章学习熟悉后,是先让你构建flask-redis 和 redis 两个镜像,再去运行两个容器。但没有使用docker-compose.yml文件的内容。

新建 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:

然后在执行docker-compose up -d命令,同时运行了两个容器,就是直接通过docker-compose命令完成镜像构建 和 容器运行,一步到位了。

 6. 把之前创建的两个容器使用 docker container rm xxx xxx命令删除,保留之前的镜像文件

7. 执行docker-compose

docker-compose up

 这个命令是在你有了flask-redis镜像后 创建了两个容器并且正常启动了

 按键盘ctrl+c会退出停止了。

输入查看容器, 能看到自动给你创建了两个状态是exited的容器。

docker container ls -a

改用命令 -d 后台运行

docker-compose up -d

但是我买了这个阿里服务器,通过ip地址+端口号 ,却不能正常打开。

后来发现是我购买的阿里云服务器,没有开端口导致的。

获取运行docker-compose ps命令也能看到

docker-compose ps

 需要主要的是docker-compose ps命令一定要在当前目录下运行才行。

执行 docker-compose stop停止运行

docker-compose stop

 能够查看到已经停止的 容器

 执行删除,会被全部删除

docker-compose rm

还要刚才创建的网络,docker-compose是不会帮你删除的,要自己手动删除。 

仅供学习参考。 

上面都是在提前构建了一个flask-redis镜像前提下,来docker-compose的

假如我们没有这个镜像呢?下面通过修改docker-compose.yml文件,自动构建flask-redis镜像,和创建两个容器并正常启动运行。

比如我有个flask-py文件夹,有flask文件夹,和docker-compose.yml。这两个是同级的啊。

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:

 然后删除之前创建的flask-redis镜像,docker image rm xxx(id)

然后上传flask-py文件夹,后 cd进入

执行命令

docker-compose build

 但他这里只给我构建了一个镜像而已,没有自动创建的两个容器和网络。

 那意思就是docker-compose build失败了?

然后呢 直接build是不行的。

先删了构建的镜像。执行命令pull拉取了flask-redis这个镜像,它会自动构建镜像。

docker-compose pull

 再然后up -d后台启动,

docker-compose up -d

最后 docker-compose ps

       docker image ls

      docker container ls -a

     docker network ls

都能看到数据了。

 

 最后 执行 删除所有 刚才创建的

docker system prune -f

 

参考

compose 文件的结构和版本 - Docker Tips

猜你喜欢

转载自blog.csdn.net/deng_zhihao692817/article/details/129539424