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命令:查看文件、创建文件、合并、追加文件内容等功能