Docker compose

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过Docker Compose,可以使用YAML文件来定义Docker服务,包括容器、网络、存储卷等,并使用一个命令来启动、停止和管理整个应用程序。

docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)

  • docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
  • 一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
  • 一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。

可通过如下命令指定docker compose的配置文件

docker-compose -f, --file stringArray           Compose configuration files
version: '3'

services:
  node0:
    container_name: node0
    image: "tendermint/localnode"
    ports:
      - "26656-26657:26656-26657"
    environment:
      - ID=0
      - LOG=${LOG:-tendermint.log}
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.2

  node1:
    container_name: node1
    image: "tendermint/localnode"
    ports:
      - "26659-26660:26656-26657"
    environment:
      - ID=1
      - LOG=${LOG:-tendermint.log}
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.3

  node2:
    container_name: node2
    image: "tendermint/localnode"
    environment:
      - ID=2
      - LOG=${LOG:-tendermint.log}
    ports:
      - "26661-26662:26656-26657"
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.4

  node3:
    container_name: node3
    image: "tendermint/localnode"
    environment:
      - ID=3
      - LOG=${LOG:-tendermint.log}
    ports:
      - "26663-26664:26656-26657"
    volumes:
      - ./build:/tendermint:Z
    networks:
      localnet:
        ipv4_address: 192.167.10.5

networks:
  localnet:
    driver: bridge//网络的Dirver
    ipam:
      driver: default//IP地址管理的Driver
      config:
      -
        subnet: 192.167.10.0/16

IPAM (IP Address Management) Driver 是一个插件,用于管理 Docker 容器的 IP 地址分配。与 Docker 默认的 IPAM 驱动程序不同,IPAM Driver 允许您使用自定义的 IP 地址分配策略和算法。如calico-ipam,
如下所示,配置文件中,这句话代表在Docker容器中,将主机的26659端口和26660端口映射到容器的26656和26657端口上。
具体来说,这意味着当Docker容器运行时,可以使用主机的26659和26660端口连接到容器内运行的应用程序,这些连接将被转发到容器内部的26656和26657端口。

ports:
      - "26659-26660:26656-26657"

IP知识

windows中查看IP配置,终端中输入

ipconfig

linux中查看IP配置,终端中输入

ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.28.20.226  netmask 255.255.240.0  broadcast 172.28.31.255
        inet6 fe80::215:5dff:fe17:1211  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:17:12:11  txqueuelen 1000  (Ethernet)
        RX packets 5039  bytes 801028 (801.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 424  bytes 37563 (37.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 170  bytes 19766 (19.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 170  bytes 19766 (19.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

网络接口指的是:eth0、lo 分别表示第一块网卡和回环接口
MTU 表示最大传送单元,不同局域网类型的 MTU值不一定相同,对以太网来说,MTU 的默认设置是 1500 个字节
静态IP和动态IP:
静态IP和动态IP是两种不同的IP地址配置方式,静态IP是一种手动配置的IP地址,由管理员或用户手动设置并保持不变;而动态IP是一种自动分配的IP地址,由网络服务提供商(ISP)或路由器自动分配并更改。

ip link

网关:
在计算机网络中,网关地址是指连接两个或多个网络的设备,通常是路由器或交换机的IP地址。网关地址充当了连接不同网络之间的桥梁,它使得不同网络之间的数据能够相互传输和交换。

子网掩码:

subnet: 192.167.10.0/16
/16 是子网掩码(subnet mask)的一种简写形式,它表示子网掩码的二进制形式中有 16 位是 1。subnet: 192.167.10.0/16 表示一个IPv4子网,其中网络地址为 192.167.0.0,子网掩码为 255.255.0.0,可以包含从 192.167.0.1 到 192.167.255.254 的主机地址,共计 2^16 - 2 = 65,534 个可用地址。

查看指定端口占用情况

netstat -tunlp |grep 端口号

宿主机(host machine)是指运行虚拟化软件的物理计算机或服务器,它是虚拟机的宿主环境,被寄宿的主机。
iptables
iptables是运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的处理和转发。iptables操作需要超级用户权限,其可执行文件通常位于 /sbin/iptables 或 /usr/sbin/iptables 。
nat表如其名,用于地址转换操作。NAT(Network Address Translation),是指网络地址转换,

与iptables和nftables不同,ebtables是专门用于以太网层面的网络过滤

docker0网桥:
问题:使用bridge模式创建docker网络时,没有docker0网桥

docker compose v2:

pseudo-TTY:虚拟终端仿真机
docker部署应用的流程:
1.创建docker网络;

docker network create networkname//例如mytest1

2.创建镜像的两种方式:docker commit 和使用Dockerfile文件

docker commit
docker build  --tag  tendermint/localnode1 localnode

3.创建容器

  • 先创建,后启动:首先会从本地路径查找是否有相应的镜像,若没有,从dokcer hub上搜索。
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
--name  分配一个名字给容器

这个命令创建出来的容器处于停止状态,并没有运行,使用如下命令启动;

docker start [OPTIONS] CONTAINER [CONTAINER...]
  • 创建启动一步到位:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--name  
-d后台运行

4.运行docker容器

docker run --rm --network mytest1   -v /etc/localtime:/etc/localtime -v ~/workspace/tendermint/mytestnet/build:/tendermint:Z tendermint/localnode1

在运行的容器中执行一个命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Execute a command in a running container

Shell脚本

Shell脚本是一种用于自动化执行一系列命令的文本文件,Shell脚本可以在各种操作系统上运行,包括Linux、Unix、macOS等。
Shell脚本通常使用扩展名.sh或.bash表示,可以使用任何文本编辑器创建和编辑。
在执行Shell脚本之前,需要将其赋予可执行权限。例如:

chmod +x myscript.sh

tendermint网络部署时wrapper.sh文件

#!/usr/bin/env sh
//sh脚本
##
## Input parameters
##
BINARY=/tendermint/${BINARY:-tendermint}
//:-替换操作符,如果环境变量BINARY已经定义,则使用其值进行替换,否则使用默认值替换

ID=${ID:-0}
LOG=${LOG:-tendermint.log}

##
## Assert linux binary
##
//检查二进制是否存在 basename获取文件路径的名称
if ! [ -f "${BINARY}" ]; then
	echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'tendermint' E.g.: -e BINARY=tendermint_my_test_version"
	exit 1
fi
//file命令用于判断文件的类型,是否为64位可执行文件   grep命令:grep是一个强大的文本搜索命令,用于在文件或标准输入中查找匹配指定模式的行
BINARY_CHECK="$(file "$BINARY" | grep 'ELF 64-bit LSB executable, x86-64')"
if [ -z "${BINARY_CHECK}" ]; then
	echo "Binary needs to be OS linux, ARCH amd64"
	exit 1
fi

##
## Run binary with all parameters
##
//设置TMHOME的环境变量,指定Tendermint节点的数据目录路径
export TMHOME="/tendermint/node${ID}"
//-d判断目录是否存在  dirname命令获取文件的目录
//"$BINARY"执行二进制文件   "$BINARY" arg1  arg2 
//"$@" 获取执行脚本传入的所有参数
//tee命令:Copy standard input to each FILE, and also to standard output.
if [ -d "`dirname ${TMHOME}/${LOG}`" ]; then
  "$BINARY" "$@" | tee "${TMHOME}/${LOG}"
else
  "$BINARY" "$@"
fi
chmod 777 -R /tendermint

问题:wrapper.sh可能会出现permissin denied的情况,首先需要赋予宿主机的wrapper.sh所有权限,然后再复制到docker容器中。

chmod 777 -R /tendermint    //-R递归的改变文件和目录   777
//chmod(change mode)  文件所有者(owner) 用户组(group) 其他用户组(other users)
chmod +x 增加执行权限  chmod u+x 文件所有者增加执行权限

#

权限

rwx

二进制

7

读+写+执行

rwx

111

6

读+写

rw-

110

5

读 + 执行

r-x

101

4

只读

r–

100

3

写 + 执行

-wx

011

2

只写

-w-

010

1

只执行

–x

001

0



000

查看一个文件的权限

stat file

同步时间:宿主机与docker同步时间有好几种方式
简单的方式:将宿主机与容器的时间进行挂载

docker run -v /etc/localtime:/etc/localtime
docker挂载多个目录的时候可以用多个-v
ntpdate [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] server ...

从宿主机复制文件到docker或从docker复制文件到宿主机

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  -a, --archive       Archive mode (copy all uid/gid information)
  //通过-a参数尽可能保留文件权限

创建和开启containers

docker-compose up

根据docker-compose.yml文件创建和开启网络

通过文件属性查看文件格式

docker-compose.yml不是docker-compose.yaml


cat /proc/sys/net/bridge/bridge-nf-call-iptables
1

cat命令:查看文件、创建文件、合并、追加文件内容等功能