赞
踩
修改镜像源
/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
#阿里云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
sudo apt install gcc
sudo apt install g++ -y
更新并安装
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
sudo apt-get clean
sudo apt-get install docker docker-compose
启动
systemctl start docker
ps -ef|grep docker #查看进程
查看版本
docker version
解压
tar -zxvf docker-19.03.9.tgz
将docker下所有文件移动到/usr/bin目录下
cp docker/* /usr/bin
将docker注册为服务
编辑文件
vim /etc/systemd/system/docker.service
将下面内容写入文件当中
[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
添加启动权限
chmod +x /etc/systemd/system/docker.service
systemctl start docker
systemctl start docker # 启动
systemctl stop docker # 停止
systemctl restart docker # 重启
systemctl status docker # 查看状态
systemctl enable docker # 开机启动
docker info #查看概要信息
docker --help # 查看帮助文档
docker 具体命令 --help #查看命令帮助文档
查看本地镜像
docker images [OPTIONS]
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
搜索镜像
docker search [OPTIONS] 镜像名称
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
下载镜像
docker pull 镜像名称[:TAG]
没有TAG就是最新版
docker system df
删除镜像
docker rmi [OPTIONS] [NAME:TAG ...]
OPTIONS:
-f:强制删除
删除全部
docker rmi -f $(docker images -qa)
提交容器,使其成为一个新的镜像
docker commit -m="描述信息" -a="作者" 容器ID 要创建的目标镜像名:标签名
例如:
docker commit -m="add vim" -a="wss" 30432d89ed45 wss/myubuntu:1.0
提交以后再查看镜像列表
docker images
#REPOSITORY TAG IMAGE ID CREATED SIZE
#wss/myubuntu 1.0 3b0cc2979ce9 15 seconds ago 138MB
docker run [OPTION] image [command] [ARG...]
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
列出正在运行的容器
docker ps [OPTIONS]
OPTIONS:
-a: 列出所有包括历史的容器
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示id
exit
退出容器,停止容器
ctrl+p+q
退出容器,容器不停止
docker start 容器id或名 #启动已经停止的容器
docker restart 容器id或名 #重新启动正在运行的容器
docker stop 容器id或名
docker kill 容器id或名
docker rm 容器id -f
查看日志
docker logs 容器id
docker top 容器id
docker inspect 容器id
docker exec -it 容器id bashShell
docker attach -it 容器id bashShell
attach直接进去容器启动命令的终端,不会启动新的进程,yongexit退出,会导致容器的停止
exec实在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
docker cp 容器id:容器内路径 目的主机路径 #容器文件拷贝到主机
docker cp 目的主机路径 容器id:容器内路径 #主机文件拷贝到容器
docker export -o a.tar 容器id #将容器导出
cat a.tar | docker import - 包名/name:tag #容器导入成镜像
镜像导出与恢复
docker save -o mysql5.7.tar mysql:5.7
docker load -i mysql5.7.tar
首先使用commit打包镜像
docker commit -m="add vim" -a="wss" 30432d89ed45 wss/myubuntu:1.0
登录阿里云,找到容器镜像服务/实例服务,点入个人实力,创建命名空间,上传命令会自动生成。
docker安装registry。
sudo docker pull registry
配置
sudo vim /etc/docker/daemon.json
添加"insecure-registries":[“仓库地址:端口”]
{
"registry-mirrors": ["https://mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.7:5000"]
}
重启daocker
systemctl restart docker
运行
docker run -d -p 5000:5000 -v /docker/myregistry/:/tmp/registry --privileged=true registry
发布
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
可以使用这个地址查看镜像是否上传成功
http://192.168.0.7:5000/v2/_catalog
拉取
sudo docker pull 192.168.0.7:5000/myubuntu:1.0
容器数据卷就相当于给一台电脑外置了一块硬盘,可以将容器路径映射到宿主机,将重要数据保存到本地。
使用-v参数将物理路径挂载到容器路径上,当出现Permission denied错误时,加上 --privileged=true 即可,加上这个就会有root权限
-v 宿主机路径:容器路径
rw:读写权限,默认。
ro:只读权限
使用实例:
-v 宿主机路径:虚拟机路径:ro
--volumes-form 容器name
运行
docker run -d -p 8080:8080 --name t1 tomcat
进入tomcat
docker exec -it tomcat bash
在宿主机修改配置文件\wss\mysql\conf\my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
运行
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]
进入mysql
docker exec -it ac5cf9f3ba63 bash
mysql -uroot -p #登录密码就是上面设的123456
创建主服务容器
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
进入/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
重启
docker restart mysql-master
进入容器mysql
docker exec -it mysql-master bash
mysql -uroot -proot
创建用户用于同步
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
创建从机
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
进入/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
重启
docker restart mysql-slave
主服务查看主从状态
show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 | 712 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
进入从机容器
docker exec -it mysql-slave bash
mysql -uroot -proot
在从数据库关联主数据库
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;
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
在从数据库中查看主从同步状态
show slave status\G;
在从数据库中开启主从同步
start slave;
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 |
+-----------------------+
从机执行
stop slave;
start slave;
首先准备好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
运行
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
进入
docker exec -it myredis bash
测试
redis-cli
set k1 v1
get k1
配置六个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
参数解释
–cluster-enabled yes 开启集群
–appendonly yes 开启持久化
–port 6386 redis端口号
进入容器
docker exec -it redis-node-1 /bin/bash
分配主从关系
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. ##################################################################################################################
查看集群信息
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. ##################################
集群模式下如果普通登录进行存储可能会因为插槽位置导致报错
127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.0.7:6383
添加参数 -c
即可,会自动跳转路由到合适的redis服务
redis-cli -p 6381 -c
当一个主机因出错停止时,从机会自动上位变成主机,之前的主机恢复后也只能充当从机的位置
添加两个容器
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
进入7号容器
docker exec -it redis-node-7 /bin/bash
加入集群
redis-cli --cluster add-node 192.168.0.7:6387 192.168.0.7:6381
第二个ip相当于领路人
重新分配
redis-cli --cluster reshard 192.168.0.7:6381
检查
redis-cli --cluster check 192.168.0.7:6387
为6387分配8388从节点
redis-cli --cluster add-node 192.168.0.7:6388 192.168.0.7:6387 --cluster-slave --cluster-master-id ef4be4ef86978b9092b044a6715e436b4d4eedd5
cluster-master-id:主节点id
删除一个从机节点
redis-cli --cluster del-node 从机ip:端口 从机节点id
redis-cli --cluster del-node 192.168.0.7:6388 571ceccec338ea92c608fc58cc0c7eea5ae6e8c2
检查
redis-cli --cluster check 192.168.0.7:6381
重新分配
redis-cli --cluster reshard 192.168.0.7:6381
然后依次输入准备
接收的主机id
准备移除的主机id
done
即可
完成以后会变成三主四从,6381将会有6826个槽位,并且6387也成了6381的从机
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 指令指定的程序
准备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
将jdk包放到同级目录后执行下面命令
docker build -t centos72009jdk17:1.0 .
# 基础镜像使用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
sudo docker build -t demo:1.0 .
docker容器启动以后会产生一个docker0的网桥连接宿主机和docker容器的网络。用于容器之间的通信和端口映射,容器内IP改变也可以通过服务名直接通信。
查看网络
docker network ls
查看网络详细数据
docker network inspect XXX网络名字
删除网络
docker network rm XXX网络名字
创建网络
docker network create 网络名字
bridge模式:使用–network bridge指定,默认使用docker0
host模式:使用–network host指定
none模式:使用–network none指定
container模式:使用–network container:NAME或者容器ID指定
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,此时两个容器的网络是互通的。
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
这种模式就不需要-p来进行端口映射。
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)。
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
当关闭alpine1,alpine2的网卡就只剩下lo
docker network create wss_network
新建容器并加入到新建的网络当中
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
后面容器之前的请求就可以直接使用name来替代ip地址
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 # 停止服务
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:
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
windows环境
docker run -d --name portainer -p 8000:8000 -p 9000:9000 --restart=always -v /e/docker/portainer:/var/run/docker.sock portainer/portainer
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
启动
dockers-compose up
cAdvisor收集服务,http://ip:8080/
influxdb存储服务,http://ip:8083/
grafana展现服务,http://ip:3000
ip+3000端口的方式访问,默认帐户密码(admin/admin)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。