Docker网络和compose容器编排(笔记)
一、Docker网络
[root@centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3c568482160e bridge bridge local
6c1e8534faf0 host host local
ac8d1213bae6 mynet bridge local
acc1b6776ad4 none null local
1. bridge模式:
- 为每一个容器分配、设置IP等,并将容器连接
到一个docker0
- 虚拟网桥,默认为该模式。- 使用 --network bridge 指定,默认使用docker0
1. 先运行一个容器实例:
- docker run -d -P --name tomcat01 tomcat
- ip addr 查看容器内的网络地址:发现[root@centos ~]# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: unable to start container process: exec: "ip": executable file not found in $PATH: unknown
- 原因:原因是很多精简版的 Docker 镜像(尤其是基于 Alpine 或某些极简 Debian 发行版的镜像)为了减小体积,默认没有安装 ip 命令所需的 iproute2 工具包。
- 解决方法:在容器内安装iproute2
- 先进入容器(用sh代替bash,有些镜像可能没有bash)
- docker exec -it tomcat01 /bin/bash
- 然后根据基础镜像类型安装:
- 如果是Debian/Ubuntu系
- apt-get update && apt-get install -y iproute2
- 如果是CentOS/RHEL系
- yum install -y iproute2
2. 查看容器内的网络地址:
- 发现容器启动的时候会得到一个 eth0 IP地址,docker分配的!
- [root@centos ~]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
- 我们每启动一个容器,docker就会为docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0的桥接模式,使用的技术是 evth-pair技术-
- 我们发现这个容器带来网卡,都是一对的
- evth-pair技术 就是一对的虚拟设备接口,是成对出现的,一段连着协议,一段彼此相连。正因为这个特性,可以充当一个桥梁,链接各种虚拟网络设备
2. host模式:
- 使用 --network host 指定
- 容器将不会获得一个独立的network namespace,而是使用宿主机的,共用一个network namespace,容器将不会虚拟出自己的网卡而是使用宿主机的ip和端口
3. none模式:
- 使用 --network none 指定
- 禁用网络功能,只有lo标识(表示本地回环)
- 在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo。需要我们自己为Docker容器添加网卡、配置IP等。
4. container模式:
- 使用 --network container:NAME 或者容器ID指定
- 新建的容器不会虚拟出自己的网卡和配置的ip,而是和一个指定的容器共享ip、端口范围
5. link
- docker run -d -P --name tomcat03 --link tomcat02 tomcat
- docker exec -it tomcat03 ping tomcat02
- 其实 link就是我们在hosts配置中添加了tomcat02的ip和hostname,然后tomcat03就可以通过tomcat02的hostname访问了
6.自定义网络
- net bridge
- 我们直接启动命令 --net bridge 这个就是我们的docker0
- docker run -d -P --name tomcat01 tomcat(默认是--net bridge)
或
- docker run -d -P --name tomcat01 --net bridge tomcat
- docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
- docker network connect mynet tomcat01
# 将1tomcat01与mynet网络连接
二、compose容器编排
1. 是什么
- Compose是docker公司推出的一个工具软件,可以管理多个docker容器组成一个应用。你需要定义一个yaml格式的配置文件,docker-compose.yumal,写好多个容器之间的调用关系,然后,只要一个命令,就能同时启动/关闭这些容器
2.能干什么
- 启动多个容器
3.安装
- 指定版本安装: curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 赋予执行权限: chmod +x /usr/local/bin/docker-compose
- 验证安装: docker-compose --version
4. 核心概念
- 文件:docker-compose.yml
- 两要素
- 服务:一个个应用容器实例
- 工程:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义
5.compose使用的三个步骤
- 编写dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义各个微服务应用之间的调用关系
- 最后,执行docker-compose up命令来启动运行整个应用程序,完成一件部署上线.
6. compose常用命令
- docker-compose -h 查看帮助
- docker-compose up 启动所有docker-compose服务
- docker-compose up -d 启动所有docker-compose服务并后台运行
- docker-compose down 停止并删除容器、网络、卷、镜像。
- docker-compose execyml里面的服务id 进入容器实例内部docker-compose exec docker-compose.yml文件中写的服务id/bin/bash
- docker-compose ps 展示当前docker-compose编排过的运行的所有容器
- docker-compose top 展示当前docker-compose编排过的容器进程
- docker-compose logs yml里面的服务id4 查看容器输出日志
- dokcer-compose config 检查配置
- dokcer-compose config -q 检查配置,有问题才有输出
- docker-compose restart 重启服务
- docker-compose start 启动服务
- docker-compose stop 停止服务
7.例子:
1. 应用app.py
- mkdir composetest
- cd composetest
- vim app.py
- cat app.py
#以下是app.py的内容
import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
2.dockerfile打包镜像
# Dockerfile 内容
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
3.docker-compose.yml文件
``` yml
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
```
4.启动compose
- 启动:docker-compose up -d
更多推荐

所有评论(0)