一、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 time

import redis
from flask import Flask

app = 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



 

更多推荐