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
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
五、DockerFile
- FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建的时候需要运行的命令 eg:RUN yum -y install vim OR RUN[“./test.php”,“dev”,“offline”] == RUN ./test.php dev offline(RUN实在docker builder时候运行的)
- EXPOSE:当前对外暴露的端口
- WORKDIR:指定在创建容器后,终端默认登录进来的落脚点工作目录
- USER:指定该镜像以什么样的用户去执行,如果不指定,默认是ROOT
- ENV:用来构建镜像过程所设置的环境变量
- ADD:将宿主的主机目录下文件拷贝入镜像且会自动的处理URL和解压压缩包
- COPY:类似ADD
- VOLUME:容器数据卷,用于数据的保存和持久化工作
- CMD:指定容器启动后要干的事情 和RUN类似有两种数据格式
- ENTRYPOINT:指定容器启动后要干的事情,类似CMD ,ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
案例:
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
实战Dockerfile
FROM java:8
VOLUME /tmp
ADD blog-springboot-0.0.1.jar blog.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/blog.jar"]
.sh脚本
#源jar路径
SOURCE_PATH=/usr/local/docker
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=blog-springboot-0.0.1.jar
TAG=latest
SERVER_PORT=8080
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME:$TAG" | awk '{print $3}')
if [ -n "$CID" ]; then
echo "存在容器$SERVER_NAME, CID-$CID"
docker stop $CID
docker rm $CID
fi
# 构建docker镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME:$TAG镜像,IID=$IID"
docker rmi $IID
else
echo "不存在$SERVER_NAME:$TAG镜像,开始构建镜像"
cd $SOURCE_PATH
docker build -t $SERVER_NAME:$TAG .
fi
# 运行docker容器
docker run --name $SERVER_NAME -v /mydata/nginx/html/upload:/usr/local/upload -d -p $SERVER_PORT:$SERVER_PORT $SERVER_NAME:$TAG
echo "$SERVER_NAME容器创建完成"
六、Docker网络
- docker network ls 查看网络
- docker network inspect XXX 网络名字 查看网络源数据
- docker network rm XX 网络名字
网络模式:
· bridge模式:使用–network bridge指定,默认使用docker0
· host模式:使用–network host指定
· none模式:使用–network none指定
· container模式:使用–network container:NAME或者容器ID指定
- 待续……
五、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
八、主从配置
info replication
打印主从复制的相关信息
slaveof
成为某个实例的从服务器
在主机上写,在从机上可以读取数据
从机是不允许写的操作
3、主机挂掉,重启就行,一切如初
配置主从复制
replicaof 192.168.0.60 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读
反客为主
用 slaveof no one 将从机变为主机。
4、从机重启需重设:slaveof 127.0.0.1 6379(Redis 5.0之前使用slaveof
)
可以将配置增加到文件中。永久生效。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiagege
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22