当前位置:   article > 正文

【Docker】学习笔记_docker pull设置一直重连

docker pull设置一直重连

docker安装

修改镜像源

/etc/apt/sources.list

#kali系统apt镜像源,可以自行查找自己需要的
 
#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
 
#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
 
#清华大学
#deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
 
#浙大
#deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
#deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
 
#东软大学
#deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contribp.kali.org/kali kali-rolling main non-free contrib
 
#重庆大学
#deb http://http.kali.org/kali kali-rolling main non-free contrib
#deb-src http://http.kali.org/kali kali-rolling main non-free contrib
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
#阿里云ubuntu镜像源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

安装gcc

sudo apt install gcc
sudo apt install g++ -y
  • 1
  • 2

更新并安装

sudo apt-get update && sudo apt-get upgrade && sudo  apt-get dist-upgrade
sudo apt-get clean
sudo apt-get install docker docker-compose
  • 1
  • 2
  • 3

启动

systemctl start docker
ps -ef|grep docker #查看进程
  • 1
  • 2

查看版本

docker version
  • 1

离线安装

解压

tar -zxvf docker-19.03.9.tgz
  • 1

将docker下所有文件移动到/usr/bin目录下

cp docker/* /usr/bin
  • 1

将docker注册为服务
编辑文件

vim /etc/systemd/system/docker.service
  • 1

将下面内容写入文件当中

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

添加启动权限

chmod +x /etc/systemd/system/docker.service
  • 1

启动docker

systemctl start docker
  • 1

启动类命令

systemctl start docker # 启动
systemctl stop docker # 停止
systemctl restart docker # 重启
systemctl status docker # 查看状态
systemctl enable docker # 开机启动
  • 1
  • 2
  • 3
  • 4
  • 5
docker info #查看概要信息
docker --help # 查看帮助文档
docker 具体命令 --help #查看命令帮助文档
  • 1
  • 2
  • 3

镜像命令

images

查看本地镜像

docker images [OPTIONS]
  • 1

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1ec996c686eb 9 months ago 4.85kB

各项说明:

REPOSITORY:镜像的仓库源

TAG:镜像的标签版本号

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:大小

OPTIONS:

-a:列出本地所有镜像,包括历史镜像

-q:只显示镜像ID

-qa:列出所有镜像ID

search

搜索镜像

docker search [OPTIONS] 镜像名称
  • 1

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12815 [OK]

各项说明:

NAME:镜像名

DESCRIPTION:镜像说明

STARTS:点赞数

OFFICIAL:是否是官方镜像

AUTOMATED:是否是自动构建的

OPTIONS:

–limit:只列出n个镜像。–limit 5

pull

下载镜像

docker pull 镜像名称[:TAG]
  • 1

没有TAG就是最新版

system df 查看镜像存储情况

docker system df
  • 1

rmi

删除镜像

docker rmi [OPTIONS] [NAME:TAG ...]
  • 1

OPTIONS:

-f:强制删除

删除全部

docker rmi -f $(docker images -qa)
  • 1

commit

提交容器,使其成为一个新的镜像

docker commit -m="描述信息" -a="作者" 容器ID 要创建的目标镜像名:标签名
  • 1

例如:

docker commit -m="add vim" -a="wss" 30432d89ed45 wss/myubuntu:1.0
  • 1

提交以后再查看镜像列表

docker images
#REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
#wss/myubuntu   1.0       3b0cc2979ce9   15 seconds ago   138MB
  • 1
  • 2
  • 3

容器命令

run

docker run [OPTION] image [command] [ARG...]
  • 1

OPTIONS:

–name=“容器名字”

-d:后台运行容器并返回ID,也即启动守护式容器

-i:以交互式运行容器,通常与-t同时使用

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-P:随机端口映射

-p:指定端口映射

–net:指定容器ip和端口。使用host可以直接使用宿主机ip;–net host

–privileged=true 获取宿主机root权限

-v:数据卷映射

交互模式运行ubuntu

sudo docker run -it ubuntu /bin/bash
sudo docker run -it --name=myubuntu ubuntu bash
  • 1
  • 2

ps

列出正在运行的容器

docker ps [OPTIONS]
  • 1

OPTIONS:

-a: 列出所有包括历史的容器

-l:显示最近创建的容器

-n:显示最近n个创建的容器

-q:静默模式,只显示id

退出容器

exit

退出容器,停止容器

ctrl+p+q

退出容器,容器不停止

start重新启动容器

docker start 容器id或名 #启动已经停止的容器
docker restart 容器id或名 #重新启动正在运行的容器
  • 1
  • 2

停止容器

docker stop 容器id或名 
  • 1

强制停止容器

docker kill 容器id或名
  • 1

删除已停止的容器

docker rm 容器id -f
  • 1

logs查看日志

查看日志

docker logs 容器id
  • 1

查看容器内运行的进程

docker top 容器id
  • 1

查看容器内部细节

docker inspect 容器id
  • 1

进入正在运行的容器并以命令行交互

docker exec -it 容器id bashShell
docker attach -it 容器id bashShell
  • 1
  • 2

attach直接进去容器启动命令的终端,不会启动新的进程,yongexit退出,会导致容器的停止

exec实在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

CP拷贝

docker cp 容器id:容器内路径 目的主机路径  #容器文件拷贝到主机
docker cp 目的主机路径 容器id:容器内路径  #主机文件拷贝到容器
  • 1
  • 2

export导入import导出

docker export -o a.tar 容器id   #将容器导出
cat a.tar | docker import - 包名/name:tag  #容器导入成镜像
  • 1
  • 2

镜像导出与恢复

docker save -o mysql5.7.tar mysql:5.7
docker load -i mysql5.7.tar
  • 1
  • 2

发布

首先使用commit打包镜像

docker commit -m="add vim" -a="wss" 30432d89ed45 wss/myubuntu:1.0
  • 1

发布到阿里云

登录阿里云,找到容器镜像服务/实例服务,点入个人实力,创建命名空间,上传命令会自动生成。

私有仓库

docker安装registry。

sudo docker pull registry
  • 1

配置

sudo vim /etc/docker/daemon.json
  • 1

添加"insecure-registries":[“仓库地址:端口”]

{
  "registry-mirrors": ["https://mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.7:5000"]	
}

  • 1
  • 2
  • 3
  • 4
  • 5

重启daocker

systemctl restart docker
  • 1

运行

 docker run -d -p 5000:5000 -v /docker/myregistry/:/tmp/registry --privileged=true registry
  • 1

发布

sudo docker tag wss/myubuntu:1.0 192.168.0.7:5000/myubuntu:1.0
sudo docker push 192.168.0.7:5000/myubuntu:1.0
  • 1
  • 2

可以使用这个地址查看镜像是否上传成功

http://192.168.0.7:5000/v2/_catalog
  • 1

拉取

sudo docker pull 192.168.0.7:5000/myubuntu:1.0
  • 1

容器数据卷

容器数据卷就相当于给一台电脑外置了一块硬盘,可以将容器路径映射到宿主机,将重要数据保存到本地。

使用-v参数将物理路径挂载到容器路径上,当出现Permission denied错误时,加上 --privileged=true 即可,加上这个就会有root权限

-v 宿主机路径:容器路径

容器读写权限

rw:读写权限,默认。

ro:只读权限

使用实例:

-v 宿主机路径:虚拟机路径:ro
  • 1

容器数据卷的共享

--volumes-form 容器name
  • 1

tomcat

运行

docker run -d -p 8080:8080 --name t1 tomcat
  • 1

进入tomcat

docker exec -it tomcat bash
  • 1

mysql

单机使用

在宿主机修改配置文件\wss\mysql\conf\my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
  • 1
  • 2
  • 3
  • 4
  • 5

运行

docker run -p  3306:3306 --name mysqlname -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -v /wss/mysql/log:/var/log/mysql -v /wss/mysql/data:/var/lib/mysql -v /wss/mysql/conf:/etc/mysql/conf.d -d mysql:[TAG]
  • 1

进入mysql

docker exec -it ac5cf9f3ba63 bash
mysql -uroot -p #登录密码就是上面设的123456
  • 1
  • 2

mysql主从复制

创建主服务容器

sudo docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

进入/mydata/mysql-master/conf目录下新建my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

重启

docker restart mysql-master
  • 1

进入容器mysql

docker exec -it mysql-master bash
mysql -uroot -proot
  • 1
  • 2

创建用户用于同步

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  • 1
  • 2

创建从机

sudo docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

进入/mydata/mysql-slave/conf目录下新建my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

重启

docker restart mysql-slave
  • 1

主服务查看主从状态

show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 |      712 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

进入从机容器

docker exec -it mysql-slave bash
mysql -uroot -proot
  • 1
  • 2

在从数据库关联主数据库

change master to master_host='192.168.0.7', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000003', master_log_pos=712, master_connect_retry=30;
  • 1

master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

在从数据库中查看主从同步状态

show slave status\G;
  • 1

在从数据库中开启主从同步

start slave;
  • 1

Slave_IO_Running: Connecting问题

Last_IO_Error: error connecting to master ‘slave@192.168.0.7:3307’ - retry-time: 30 retries: 1 message: Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.

主机执行

SELECT plugin FROM `user` where user = 'slave';
+-----------------------+
| plugin                |
+-----------------------+
| caching_sha2_password |
+-----------------------+
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
SELECT plugin FROM `user` where user = 'slave';
+-----------------------+
| plugin                |
+-----------------------+
| mysql_native_password |
+-----------------------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

从机执行

stop slave;
start slave;
  • 1
  • 2

redis

首先准备好redis.conf文件

# bind 127.0.0.1 -::1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
# 持久化
appendonly no 
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

运行

docker run -p  6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:[TAG] redis-server /etc/redis/redis.conf
  • 1

进入

docker exec -it myredis bash
  • 1

测试

redis-cli
set k1 v1
get k1
  • 1
  • 2
  • 3

集群

配置六个redis服务

sudo docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6381
sudo docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6382
sudo docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6383
sudo docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6384
sudo docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6385
sudo docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6386
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数解释

–cluster-enabled yes 开启集群

–appendonly yes 开启持久化

–port 6386 redis端口号

进入容器

docker exec -it redis-node-1 /bin/bash
  • 1

分配主从关系

redis-cli --cluster create 192.168.0.7:6381 192.168.0.7:6382 192.168.0.7:6383 192.168.0.7:6384 192.168.0.7:6385 192.168.0.7:6386 --cluster-replicas 1
##########################################分配结果:3主3从#####################################################################
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460   # 槽位一
Master[1] -> Slots 5461 - 10922 # 槽位二
Master[2] -> Slots 10923 - 16383 # 槽位三
Adding replica 192.168.0.7:6385 to 192.168.0.7:6381
Adding replica 192.168.0.7:6386 to 192.168.0.7:6382
Adding replica 192.168.0.7:6384 to 192.168.0.7:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a03495bf0ce637ed1d4385e5136e6418da3aac0d 192.168.0.7:6381
   slots:[0-5460] (5461 slots) master
M: b13ba62a2185297ea5b6dd6446a8379add8d0c0c 192.168.0.7:6382
   slots:[5461-10922] (5462 slots) master
M: f4c9b2e7769701e7914afc2b731b4e83e4a9b7db 192.168.0.7:6383
   slots:[10923-16383] (5461 slots) master
S: 86e402e8c1b0f335e85a04552fe0c82e6e606cd7 192.168.0.7:6384
   replicates a03495bf0ce637ed1d4385e5136e6418da3aac0d
S: 762fe252f281400210414b13535d1834dd881921 192.168.0.7:6385
   replicates b13ba62a2185297ea5b6dd6446a8379add8d0c0c
S: 1f09d1f5becdc6b31e72ff7f438107102d9a3969 192.168.0.7:6386
   replicates f4c9b2e7769701e7914afc2b731b4e83e4a9b7db
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.0.7:6381)
M: a03495bf0ce637ed1d4385e5136e6418da3aac0d 192.168.0.7:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 86e402e8c1b0f335e85a04552fe0c82e6e606cd7 192.168.0.7:6384
   slots: (0 slots) slave
   replicates a03495bf0ce637ed1d4385e5136e6418da3aac0d
S: 762fe252f281400210414b13535d1834dd881921 192.168.0.7:6385
   slots: (0 slots) slave
   replicates b13ba62a2185297ea5b6dd6446a8379add8d0c0c
S: 1f09d1f5becdc6b31e72ff7f438107102d9a3969 192.168.0.7:6386
   slots: (0 slots) slave
   replicates f4c9b2e7769701e7914afc2b731b4e83e4a9b7db
M: f4c9b2e7769701e7914afc2b731b4e83e4a9b7db 192.168.0.7:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b13ba62a2185297ea5b6dd6446a8379add8d0c0c 192.168.0.7:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
##################################################################################################################
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

查看集群信息

redis-cli -p 6381
cluster info
#########################
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6  #节点数
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:509
cluster_stats_messages_pong_sent:444
cluster_stats_messages_sent:953
cluster_stats_messages_ping_received:439
cluster_stats_messages_pong_received:509
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:953
total_cluster_links_buffer_limit_exceeded:0
############################
cluster nodes
############################
86e402e8c1b0f335e85a04552fe0c82e6e606cd7 192.168.0.7:6384@16384 slave a03495bf0ce637ed1d4385e5136e6418da3aac0d 0 1657352745473 1 connected
a03495bf0ce637ed1d4385e5136e6418da3aac0d 192.168.0.7:6381@16381 myself,master - 0 1657352740000 1 connected 0-5460
762fe252f281400210414b13535d1834dd881921 192.168.0.7:6385@16385 slave b13ba62a2185297ea5b6dd6446a8379add8d0c0c 0 1657352744466 2 connected
1f09d1f5becdc6b31e72ff7f438107102d9a3969 192.168.0.7:6386@16386 slave f4c9b2e7769701e7914afc2b731b4e83e4a9b7db 0 1657352744000 3 connected
f4c9b2e7769701e7914afc2b731b4e83e4a9b7db 192.168.0.7:6383@16383 master - 0 1657352746480 3 connected 10923-16383
b13ba62a2185297ea5b6dd6446a8379add8d0c0c 192.168.0.7:6382@16382 master - 0 1657352745000 2 connected 5461-10922
###########################
redis-cli --cluster check 192.168.0.7:6381
##############################
root@wss-desktop:/data# redis-cli --cluster check 192.168.0.7:6381
192.168.0.7:6381 (a03495bf...) -> 0 keys | 5461 slots | 1 slaves.
192.168.0.7:6383 (f4c9b2e7...) -> 1 keys | 5461 slots | 1 slaves.
192.168.0.7:6382 (b13ba62a...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.0.7:6381)
M: a03495bf0ce637ed1d4385e5136e6418da3aac0d 192.168.0.7:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 86e402e8c1b0f335e85a04552fe0c82e6e606cd7 192.168.0.7:6384
   slots: (0 slots) slave
   replicates a03495bf0ce637ed1d4385e5136e6418da3aac0d
S: 762fe252f281400210414b13535d1834dd881921 192.168.0.7:6385
   slots: (0 slots) slave
   replicates b13ba62a2185297ea5b6dd6446a8379add8d0c0c
S: 1f09d1f5becdc6b31e72ff7f438107102d9a3969 192.168.0.7:6386
   slots: (0 slots) slave
   replicates f4c9b2e7769701e7914afc2b731b4e83e4a9b7db
M: f4c9b2e7769701e7914afc2b731b4e83e4a9b7db 192.168.0.7:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: b13ba62a2185297ea5b6dd6446a8379add8d0c0c 192.168.0.7:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
##################################
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

集群模式下如果普通登录进行存储可能会因为插槽位置导致报错

127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.0.7:6383
  • 1
  • 2

添加参数 -c即可,会自动跳转路由到合适的redis服务

redis-cli -p 6381 -c 
  • 1

容错迁移

当一个主机因出错停止时,从机会自动上位变成主机,之前的主机恢复后也只能充当从机的位置

主从扩容

添加两个容器

sudo docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6387
sudo docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:7.0.2 --cluster-enabled yes --appendonly yes --port 6388
  • 1
  • 2

进入7号容器

docker exec -it redis-node-7 /bin/bash
  • 1

加入集群

 redis-cli --cluster add-node 192.168.0.7:6387 192.168.0.7:6381
  • 1

第二个ip相当于领路人

重新分配

redis-cli --cluster reshard 192.168.0.7:6381
  • 1

检查

redis-cli --cluster check 192.168.0.7:6387
  • 1

为6387分配8388从节点

redis-cli --cluster add-node 192.168.0.7:6388 192.168.0.7:6387 --cluster-slave --cluster-master-id ef4be4ef86978b9092b044a6715e436b4d4eedd5
  • 1

cluster-master-id:主节点id

主从缩容

删除一个从机节点

redis-cli --cluster del-node 从机ip:端口 从机节点id
redis-cli --cluster del-node 192.168.0.7:6388 571ceccec338ea92c608fc58cc0c7eea5ae6e8c2
  • 1
  • 2

检查

redis-cli --cluster check 192.168.0.7:6381
  • 1

重新分配

redis-cli --cluster reshard 192.168.0.7:6381
  • 1

然后依次输入准备

接收的主机id

准备移除的主机id

done

即可

完成以后会变成三主四从,6381将会有6826个槽位,并且6387也成了6381的从机

DockerFile

常用保留字指令

FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from。

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令。RUN是在 docker build时运行

​ shell格式:RUN yum -y install vim

​ exec格式:RUN [‘可执行文件’,参数一,参数二]

EXPOSE

当前容器对外暴露出的端口。

WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。

USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV

用来在构建镜像过程中设置环境变量。

ENV MY_PATH /usr/mytest

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,

比如:WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

COPY src dest

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定容器启动后的要干的事情。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

ENTRYPOINT

也是用来指定一个容器启动时要运行的命令。类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

实例

安装jdk

准备Dockerfile文件

FROM centos:centos7.9.2009
MAINTAINER WSS<2392944043@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java17及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-17.0.3.1_linux-x64_bin.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-17.0.3.1_linux-x64_bin.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk-17.0.3.1
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 暴露80端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

将jdk包放到同级目录后执行下面命令

docker build -t centos72009jdk17:1.0 .
  • 1

打包微服务

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER WSS
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为demo.jar
ADD demo-0.0.1-SNAPSHOT.jar demo.jar
# 运行jar包
RUN bash -c 'touch /demo.jar'
ENTRYPOINT ["java","-jar","/demo.jar"]
#暴露8080端口作为微服务
EXPOSE 8080
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
sudo docker build -t demo:1.0 .
  • 1

Docker网络

docker容器启动以后会产生一个docker0的网桥连接宿主机和docker容器的网络。用于容器之间的通信和端口映射,容器内IP改变也可以通过服务名直接通信。

常用命令

查看网络

docker network ls
  • 1

查看网络详细数据

docker network inspect  XXX网络名字
  • 1

删除网络

docker network rm XXX网络名字
  • 1

创建网络

docker network create 网络名字
  • 1

网络模式

bridge模式:使用–network bridge指定,默认使用docker0

host模式:使用–network host指定

none模式:使用–network none指定

container模式:使用–network container:NAME或者容器ID指定

bridge

1.Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2.docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

3.网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

host

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
  • 1

这种模式就不需要-p来进行端口映射。

none

禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)。

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
  • 1

container

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

docker run -it  --name alpine1  alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2  alpine /bin/sh
  • 1
  • 2

当关闭alpine1,alpine2的网卡就只剩下lo

自定义网络模式

docker network create wss_network
  • 1

新建容器并加入到新建的网络当中

docker run -d -p 8081:8080 --network wss_network  --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network wss_network  --name tomcat82 billygoo/tomcat8-jdk8
  • 1
  • 2

后面容器之前的请求就可以直接使用name来替代ip地址

Docker Compose

Compose常用命令

docker-compose -h                           # 查看帮助
docker-compose up                           # 启动所有docker-compose服务
docker-compose up -d                        # 启动所有docker-compose服务并后台运行
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id          # 进入容器实例内部  
	docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     # 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     # 查看容器输出日志
docker-compose config     # 检查配置
docker-compose config -q  # 检查配置,有问题才有输出
docker-compose restart   # 重启服务
docker-compose start     # 启动服务
docker-compose stop      # 停止服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

docker-compose.yaml文件

version: "3"
services:
  microService:
    image: zzyy_docker:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - atguigu_net 
    depends_on: 
      - redis
      - mysql
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - atguigu_net
    command: redis-server /etc/redis/redis.conf
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: 
   atguigu_net: 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

可视化工具portainer

启动

linux环境

docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data     portainer/portainer
  • 1

windows环境

docker run -d --name portainer -p 8000:8000 -p 9000:9000 --restart=always -v /e/docker/portainer:/var/run/docker.sock portainer/portainer
  • 1

CIG

version: '3.1'
 
volumes:
  grafana_data: {}
 
services:
 influxdb:
  image: tutum/influxdb:0.9
  restart: always
  environment:
    - PRE_CREATE_DB=cadvisor
  ports:
    - "8083:8083"
    - "8086:8086"
  volumes:
    - ./data/influxdb:/data
 
 cadvisor:
  image: google/cadvisor
  links:
    - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
  restart: always
  ports:
    - "8080:8080"
  volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
 
 grafana:
  user: "104"
  image: grafana/grafana
  user: "104"
  restart: always
  links:
    - influxdb:influxsrv
  ports:
    - "3000:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

启动

dockers-compose up
  • 1

cAdvisor收集服务,http://ip:8080/

influxdb存储服务,http://ip:8083/

grafana展现服务,http://ip:3000

​ ip+3000端口的方式访问,默认帐户密码(admin/admin)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号