Docker常用的命令

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

image-20220718161754063

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

image-20220718170639626

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

image-20220718170714775

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

image-20220718170759201

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服务器向客户端返回数据时使用的字符集(发送)

image-20220718172600759

image-20220718172631003

七、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节点

然后系统会自动的分配给你集群主从关系图

image-20220718225151735

问你是否接受他的分配

image-20220718225438086

一切OK的话,3主3从搞定

查看集群状态(6381)

cluster info

image-20220718225640372

查看节点状态(6381)

cluster nodes

image-20220718234923667

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

image-20220718225846758

然后去尝试获取试一试?

image-20220718230255870

查看集群信息

redis-cli --cluster check 192.168.111.147:6381
image-20220718230523967

2)宕机问题

6381宕机了,6385上位成为了新的master。

image-20220718235057024

6381启动

image-20220718235130385

6385宕机,,,,6385启动

image-20220718235152602

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的码头从而找到组织加入集群

image-20220718231847460

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

image-20220718232034645

重新分派槽号

redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.111.147:6381

image-20220718235308782

image-20220718235322485

问你分配分配后空间?4096

问你分配到哪个节点去?节点7

分配规则?

为什么6387是3个新的区间,以前的还是连续?

重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

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

image-20220718232922217

为主节点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次

image-20220718233330118

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

问你需要分配多大啊?

问你分配给哪个节点啊?

问你哪个节点来分配啊?

image-20220718234307404

分配完毕 ,我们检查一下?

4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

image-20220718235517258

将6387删除

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


版权声明:本文为weixin_46350527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。