docker 常用命令

一、帮助命令:

 1. 启动 systemctl start docker

 2. 停止 systemctl stop docker

 3. 重启 systemctl restart docker

4. 开机自启 systemctl enable docker

5. 查询状态: systemctl status docker

6. 查询docker 信息 docker info

7. 查询命令 docker -h

6. 查询指定命令的使用 docker 命令 -h ,如 docker ps -h

二、镜像的相关命令:

  1. 列出所有的镜像 docker images 或者 docker image ls 或者docker image list (注意 images和image的区别)

   2. 搜索仓库有哪些镜像 docker search --limit 5 redis 搜索仓库中前5个redis镜像

  3. 拉取镜像 docker pull msql:5.0 如没指定版本,就拉取最新版本

   4. docker system df 查询docker的磁盘使用情况

   5. docker system prune 清除停止的容器,没有使用的网络,虚悬镜像

   6. 移除镜像 docker rmi 镜像id

  7. 查询虚悬镜像(没有仓库名称和标签名)docker image ls -f dangling=true

 8. 清除虚悬镜像 docker image prune

三容器命令: 

  1. 运行一个容器的命令格式 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  如:docker run -it  -p 6379:6379 --name redis  redis:5.0 /bin/bash 又如 docker run -d --name mysql mysql:5.7

        1.注意: -d代表后台运行,-it代表前台交互模式运行,有些容器使用-d启动后会立刻停止

          然后docker ps -a 进行查看, 会发现容器已经退出    很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.

          容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

         2. 通过run 进入容器,如 docker -it ... /bin/bash 推出容器时,使用 exit命令,容器也会退出,可以使用 ctrl+p+q退出,如果是容器创建完后,使用docker exec -it 容器id /bin/bash 进入容器,再使用exit命令,容器不会关闭

   2. 容器启动 docker start 容器id /容器关闭  docker stop 容器id /容器重启 docker restart 容器id /容器强制关闭 docker kill 容器id  /删除 docker rm 容器id / 一次删除多个  docker rm -f $(docker ps -a -q) 或 docker ps -a -q |xargs docker rm

   3. 查询容器日志docker logs 容器id 

   4. 查询容器内部运行的进程 docker top 容器Id

   5. 查询容器内部的细节: docker inspect 容器Id

   6. 进入容器内部: docker attach 容器Id 、docker exec -it 容器id /bin/bash 第一种方法使用exit退出容器时,容器会停止

   7. 容器中拷贝文件到主机 docker cp 容器id: 文件路径   主机文件路径,如 docker cp docker cp b09ec4f346be:/data/dd.txt /pp.txt

   8. 从主机中拷贝文件到容器: docker cp 主机文件 容器:目的路径  如  docker cp /usr/bb.txt b09ec4f346be:/data/kk

   9. 导出容器作为镜像 docker export 容器Id -o xxx.tar

   10. 导入xxx.tar作为镜像 docker import xxx.tar  redis:5.7

四:容器发布到私服

    1. 将容器打包成镜像 docker commit -a '作者' -m '描述' 容器Id   镜像名称:Tag        如 docker commit -a 'yangxiaohui' -m '这是特殊的带有vim功能的镜像'  xxxx     myubuntu:1.0

    2. 将docker 镜像推送到阿里云服务器,https://promotion.aliyun.com/ntms/act/kubernetes.html 登录阿里云,点击右上角控制台找到镜像服务,然后按说明操作即可

   3. 私服搭建参考 https://blog.csdn.net/weixin_37926734/article/details/123279987

五: 目录文件挂载

     1. docker run -v 宿主机文件:容器文件    镜像Id   有时在操作挂载文件时会报没有权限,此时可以使用 docker run --privileged=true -v 宿主机文件:容器文件 镜像Id

     2. 如果挂载时要求宿主机只有只读权限:docker run --privileged=true -v 宿主机文件:容器文件:ro 镜像Id

    3. 继承:docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu

六: 常用软件安装

    1.docker 安装mysql时,需要修改配置,不然插入中文会报错  docker run --name mysql5.7 -v /mysql/conf:/etc/mysql/conf.d  -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql --privileged=true        -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yangxiaohui -d mysql:5.7

    在主机mysql/conf文件夹下创建my.cnf文件,并且添加上

[client]

default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
2. docker 安装redis: docker run  -p 6379:6379 --name myr3 --privileged=true -v /redis/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -d redis:6.2 redis-server /etc/redis/redis.conf
 
3. mysql主从配置:

docker run -p 3307:3306 --name mysql-master --privileged=true -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:5.7

docker run -p 3308:3306 --name mysql-slave --privileged=true -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:5.7

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

从节点: 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

主节点创建账号:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

从库执行如下命令:

change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, 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 Master status; 可以找到 master_log_file 和 master_log_pos

从库执行 start slave;

 4. redis集群搭建 hash槽分配

  

# 三主三从集群,分配2^14-1个哈希槽 0-16383
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.2 --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.2 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.2 --cluster-enabled yes --appendonly yes --port 6386


进入节点一  --cluster-replicas 1 的意思是每个节点分配一个副本,执行如下命令,创建集群
redis-cli --cluster create 192.168.233.10:6381 192.168.233.10:6382 192.168.233.10:6383 192.168.233.10:6384 192.168.233.10:6385 192.168.233.10:6386 --cluster-replicas 1

进入其中一个节点执行命令:
redis-cli -c -h 192.168.56.233.10 -p 6382

集群监控:
查询集群详情
redis-cli --cluster check 192.168.233.10:6383
查询集群部分信息
cluser info  /cluster status

扩容:新增节点 7和 8

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.2 --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.2 --cluster-enabled yes --appendonly yes --port 6388


进入 6387节点将新增的6387作为master节点加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
redis-cli --cluster add-node 192.168.233.10:6387 192.168.56.233:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
刚加入时分配hash槽位是0 


重新分派槽号
命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.233.10:6381
将 6388作为从节点加入到6387中
命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli --cluster add-node 192.168.233.10:6388 192.168.233.10:6387 --cluster-slave --cluster-master-id 6e535b3211a1d1dbec0272f8e9797f7409641bde -------这个是6387的编号,按照自己实际情况

缩容:
下线6388
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
 
  1.redis-cli --cluster del-node 192.168.233.10:6388 b71f9c0f371e6485ee2b925ccfd47b1e4deef19e
  2. 将6387的槽位清空,多出的槽位给6381 (根据提示操作即可)
     redis-cli --cluster reshard 192.168.233.10:6381
  3. 删除6387节点
  命令:redis-cli --cluster del-node ip:端口 6387节点ID
  redis-cli --cluster del-node 192.168.233.10:6387 6e535b3211a1d1dbec0272f8e9797f7409641bde

 

 七:Dockerfile
    1. 常用指令: FROM  基础镜像: 如 FROM centos  
    2. MAINTAINER 作者 :如MAINTAINER yangxiaohui
    3. ENV 路径:代表环境变量 如  ENV  JAVA_HOME  /usr/java/jdk1.8
    4. RUN :运行shell命令 如 RUN echo '这是shell命令' 或者 RUN ["命令",参数]
    5. ADD :将目标文件拷贝到容器指定目录并且会自动解压tar文件 如  ADD xx.tar /usr/java
   6. COPY :作用和ADD相似,但不会自动解压
   7. CMD:作用和RUN相似,但RUN的执行时机是在build镜像阶段,CMD的在RUN容器阶段,多个CMD只有最后一条语句有效,并且会被docker run ... /bin/bash 命令行替换
   8.WORKDIER  进入容器的落脚点,如 /temp 当你进入容器内部时,当前的路径是就是/temp
   9.ENTRYPOINT 命令类似CMD 但不会被命令行语句替换,当同时有CMD时,CMD作为参数传给ENTRYPOINT
  10. VOLUME 容器数据卷
 

  打包成镜像: docker build -t 镜像:TAG .

 八: springboot项目打包到镜像中,需要注意宿主机和docker容器中的时区问题
 
FROM java:8
# 这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /tmp 中写入的信息都不会记录进容器存储层,当你用docker run 运行容器时,没有用 -v指定挂载目录,这个匿名卷就会挂载在指定目录
VOLUME /tmp
# 指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
WORKDIR /
#将 jar包拷贝到容器并重新命名
COPY target/erp-1.0-SNAPSHOT.jar erp.jar # 指定编码 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en # 下面的命令会修改erp.jar的访问时间和修改时间,此外没多大作用 RUN bash -c "touch /erp.jar"
#下面的命令是让docker 容器运行在东八区,默认是0时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone # 声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务 EXPOSE 8080 #指定容器启动程序及参数 <ENTRYPOINT> "<CMD>"tail CMD java ${JAVA_OPTS} -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -jar erp.jar #ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom","-jar","erp.jar"]

 九.docker 网络,为了解决docker容器ip地址在重启后会变更的问题,有了这个功能后,docker 容器之间可以通过容器名称相互ping通

    1. 查询有哪些可用网络 docker network ls

    2. 查询容器使用哪些网络 docker inspect 容器Id | tail -n 20

    3.删除一个容器网络 docker network rm 网络Id

   4. 删除没有使用的网络 docker network prune

   5. 容器连接某个网络  docker network connect 网络Id 容器Id

   6. 容器关闭某个网络 docker network disconnect 网络Id 容器Id

网络的模式:

    bridge模式:创建时 docker run --network bridge 这个是默认形式,使用网卡docker0

    host模式: 创建时 docker run --network host

    none模式: 创建时 docker run --network none  代表禁用网络功能,只有localhost能访问

   container: 创建时 docker run --network container:容器Id

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。 

 bridge:

 

 host:

 container:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

  

 

posted @ 2023-05-10 15:44  yangxiaohui227  阅读(65)  评论(0编辑  收藏  举报