Docker常用命令
一、帮助和启动命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
二、镜像命令
1)查看本地有哪些docker镜像: docker images
- OPTIONS说明:
· -a :列出本地所有的镜像(含历史映像层)
· -q :只显示镜像ID
2)拉取某个镜像:
· docker pull 镜像名字[:TAG]
3)删除镜像:
· docker rmi -f 镜像ID
删除多个: docker rmi -f 镜像名1:TAG 镜像名2:TAG
· 删除全部
· docker rmi -f $(docker images -qa)
三、容器命令
1)新建+启动容器
· docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
· OPTIONS说明
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字” 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
docker run -it centos /bin/bash
2)列出当前所有正在运行的容器
· docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
3)退出容器
· exit 容器停止
· ctrl+p+q退出,容器不停止
4) 启动已停止运行的容器
· docker start 容器ID或者容器名
5)重启容器
· docker restart 容器ID或者容器名
6)停止容器
· docker stop 容器ID或者容器名
7)强制停止容器
· docker kill 容器ID或容器名
8) 删除已停止的容器
· docker rm 容器ID
· 一次性删除多个容器实例
· docker rm -f $(docker ps -a -q)
· docker ps -a -q | xargs docker rm
Docker容器后台运行,就必须有一个前台进程
· 前台交互式启动
· docker run -it redis:6.0.8
· 后台守护式启动
· docker run -d redis:6.0.8
· 进入redis服务
· docker exec -it 容器ID /bin/bash
· docker exec -it 容器ID redis-cli
· 查看容器日志
· docker logs 容器ID
· 查看容器内运行的进程
· docker top 容器ID
· 查看容器内部细节
· docker inspect 容器ID
9) 进入正在运行的容器并以命令行交互
· docker exec -it 容器ID bashShell
docker attach 容器ID
attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
10)容器→主机
· docker cp 容器ID:容器内路径 目的主机路径
docker cp f51234fds1233:/usr/local/mycptest/container.txt /tmp/c.txt
四、docker容器数据卷
docker run -d -p 5000:5000 -v /zzyy/mydata/:/tmp/regeiter --privileged=true registry
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
1) 查看数据卷是否挂载成功
docker inspect 容器ID

2)卷的继承和共享
· 容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
· 容器2继承容器1的卷规则
· docker run -it --privileged=true --volumes-from 父类(u1) --name u2 ubuntu
五、docker安装redis案例
1)简单版本
docker pull redis:6.0.8
docker run -d -p 6379:6379 redis:6.0.8
docker exec -it f123123 /bin/bash
redis-cli
2)加入数据卷技术
mkdir -p /app/redis/
cp /myredis/redis.conf /app/redis/
# 修改配置
daemonize yes #后台启动 记得注释掉或者改成no 因为这个会与docker的后台启动起冲突
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户
端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
docker exec -it mvr3 /bin/bash
redis-cli
六、docker安装MySQL
1)简单版本
docker pull mysql:5.7
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

2)外部Win10也来连接运行在dokcer上的mysql容器实例服务

SHOW VARIABLES LIKE 'character%' (docker上默认字符集编码隐患)

3)实战版
docker run -d -p 3306:3306 --privileged=true
-v /zzyyuse/mysql/log:/var/log/mysql #日志
-v /zzyyuse/mysql/data:/var/lib/mysql # 数据
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d # 配置
-e MYSQL_ROOT_PASSWORD=123456 #
--name mysql mysql:5.7 #
修改配置文件
[client]
default_character_set=utf8 #客户端默认字符集 character_set_client
[mysqld]
collation_server = utf8_general_ci # 对应的默认的比较规则
character_set_server = utf8 #服务器级别的字符集
4)MySQL字符集编码详解
| 系统变量 | 描述 |
|---|---|
character_set_client | 服务器解码请求时使用的字符集(接受1) |
character_set_connection | 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection (接受2) |
character_set_results | 服务器向客户端返回数据时使用的字符集(发送) |


七、redis集群
1)搭建集群
# 利用docker去开启redis
docker run -d --name redis-node-1
--net host # · 使用宿主机的IP和端口
--privileged=true #· 获取宿主机root用户权限
-v /data/redis/share/redis-node-1:/data
redis:6.0.8 #· 开启redis集群
--cluster-enabled yes --appendonly yes
--port 6381
docker run -d --name redis-node-2
--net host
--privileged=true
-v /data/redis/share/redis-node-2:/data
redis:6.0.8
--cluster-enabled yes --appendonly yes
--port 6382
# 6台redis全部启动,就创建集群
redis-cli
--cluster create
192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386
--cluster-replicas 1 #表示为每个master创建一个slave节点
然后系统会自动的分配给你集群主从关系图

问你是否接受他的分配

一切OK的话,3主3从搞定
查看集群状态(6381)
cluster info

查看节点状态(6381)
cluster nodes

对6381新增两个key(6381)( 防止路由失效加参数-c并新增两个key)

然后去尝试获取试一试?

查看集群信息
redis-cli --cluster check 192.168.111.147:6381

2)宕机问题:
6381宕机了,6385上位成为了新的master。

6381启动

6385宕机,,,,6385启动

3)主从扩容案例
新建第七个第八个节点
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
进入第七个节点
docker exec -it redis-node-7 /bin/bash
#这个是创建集群
redis-cli
--cluster create
192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386
--cluster-replicas 1
#这个是增加集群
redis-cli
--cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
#6387 就是将要作为master新增节点
#6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

检查集群情况第1次:发现没有插槽

重新分派槽号
redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.111.147:6381


问你分配分配后空间?4096
问你分配到哪个节点去?节点7
分配规则?
为什么6387是3个新的区间,以前的还是连续?
重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
检查集群情况第2次:发现没有插槽

为主节点6387分配从节点6388
命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli
--cluster add-node 192.168.111.147:6388 192.168.111.147:6387
--cluster-slave
--cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451
#-------这个是6387的编号,按照自己实际情况
检查集群情况第3次

4)主从缩容案例:6387和6388下线
#命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli
--cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8
redis-cli --cluster check 192.168.111.147:6382
#检查一下发现,6388被删除了,只剩下7台机器了。
将6387的槽号清空,重新分配,本例将清出来的槽号都给6381
redis-cli --cluster reshard 192.168.111.147:6381

问你需要分配多大啊?
问你分配给哪个节点啊?
问你哪个节点来分配啊?

分配完毕 ,我们检查一下?
4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

将6387删除
命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451