• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Docker常用命令

武飞扬头像
-半度
帮助1

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
系列文章
更多 icon
同类精品
更多 icon
继续加载