多容器运行
- 网络互联(默认容器与容器之间、容器和主机之间不会进行网络互联)
- 容器和主机之间的网络互联(通过-p参数端口映射来实现)
- 容器和容器之间的网络互联(通过多容器运行来实现)
- 容器和容器之间的互联
- 直接创建两个容器,查看是否能够互相访问
- 当两个容器都可以联通网络的时候,可以通过ip地址来互相访问
# 分别在两个终端创建两个容器a1、a2
sudo docker run -it --name a1 alpine ash
sudo docker run -it --name a2 alpine ash
# 再打开一个终端,通过命令查看两个容器的ip地址(默认容器的网络模式是bridge)
docker network inspect bridge # 分别在两个容器中执行 ping ip地址 的命令,能ping通
# 再次分别在两个容器中执行 ping 容器名 的命令,不能ping通
以上实验说明容器之间不能通过name访问对方
- 通过自定义网络的形式创建容器 ,查看是否能够互相访问
#创建自定义的网络模式
docker network create --driver bridge testnet
# 查看网络模式信息(会出现自己创建的testnet)
docker network ls
# 分别在两个终端创建两个容器a3、a4
docker run -it --name a3 --network testnet alpine ash
docker run -it --name a4 --network testnet alpine ash
# 再打开一个终端,通过命令查看两个容器的ip地址(默认容器的网络模式是bridge)
docker network inspect bridge # 分别在两个容器中执行 ping ip地址 的命令,能ping通
# 再次分别在两个容器中执行 ping 容器名 的命令,能ping通
使用名字进行ping
的原因:两个容器通过名字ping通有意义,因为ip会变,ip不好记,但是电脑(容器)的名字比较固定,知道名字后,两个容器就能通信,程序也会比较固定
- 同时启动多个容器,并将他们互联(docker compose)
# 创建docker-compose.yml文件和workspace文件夹
mkdir workspace && nano docker-compose.yml
-
- 在docker-compose.yml中写入以下信息
services: # 容器/服务jupyter:image: jupyter/scipy-notebook:latest # Jupyter Notebookcontainer_name: jupyter_notebookports:- "8888:8888"volumes:- ./workspace:/home/jovyan/work # 共享目录environment:- JUPYTER_ENABLE_LAB=yescommand: start-notebook.sh --NotebookApp.token=''api:image: python:3.9-slim # 轻量级 Pythoncontainer_name: fastapi_serverports:- "8000:8000"volumes:- ./workspace:/app # 共享目录,FastAPI 可以访问 Jupyter 代码working_dir: /appcommand: >sh -c "pip install fastapi uvicorn && uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
-
- 在workspace文件夹下创建main.py文件,并写入以下信息:
# 在 workspace/main.py 里写入以下代码
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def home():return {"message": "FastAPI is running!"}@app.get("/predict/{x}")
def predict(x: float):return {"input": x, "prediction": x + 2}
-
- 在本机目录下输入以下命令创建、运行多个容器
# 同时启动多个容器
docker compose up
# 浏览器输入 http://localhost:8888,查看容器运行信息
# 浏览器输入 http://localhost:8000,查看容器运行信息# 在打开一个终端查看网络模式,发现自动创建一个自定义的网络模式(其中就是启动的多个容器所遵循的网络模式)
docker network ls
-
- 在jupyter notebook中输入以下python代码,查看是否能够请求到另一个容器
import requests# FastAPI 的服务地址(使用容器名 "api")
url_1 = "http://api:8000"# 调用根路径,即在浏览器中请求http://api:8000/
r1 = requests.get(f"{url_1}/")
print("GET /:", r1.json())# 调用 /predict 接口
# 相当于在浏览器内请求http://api:8000/predict/{x}
x = 10
r2 = requests.get(f"{url_1}/predict/{x}")
print(f"GET /predict/{x}:", r2.json())
-
- 将同时启动的所有容器停掉
# 发现容器记录和临时创建的自定义的网络模式全部被删除
docker compose down