二、docker基本命令及原理

镜像常用命令
查看当前所有的镜像:docker images
  参数: -q,查看镜像的id
官方推荐使用docker image ls,这样比较完整
 
删除镜像:
  docker image rm 镜像名称或镜像id 或docker rmi 镜像名或镜像id
  如果镜像正在运行,那么需要加-f参数
  docker image prune -a 删除未使用的镜像,不加-a就删除从未使用过的镜像
 
查看镜像详情:
  docker image inspect 镜像名:版本 或docker inspect 镜像名:版本
 
运行镜像:
  docker run 镜像名
 
查看正在运行的镜像:
  docker ps
    -a:打印所有镜像,包括没有在运行的
 
删除none镜像
  docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
  docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
  docker images|grep none|awk '{print $3 }'|xargs docker rmi
 
容器常用命令
运行python容器
  docker run -it -d python:3.7 /bin/sh
 
开启nginx服务,在后台执行
  docker run --name web_app -v $PWD/inedx.html:/user/share/nginx/html/index.html:ro -p 8222:80 -d nginx:latest
    -d 让容器在后台执行
    -v 文件映射,冒号前面的文件或目录与后面容器当中的做一个映射
    -p 端口映射,冒号前面是宿主机端口,冒号右边是容器中的端口,就是我们访问8222端口就 相当于访问nginx中的80端口,不做映射无法访问容器中的服务
    -P 也是端口映射,但是是随机生成端口,后面就不用跟端口信息
 
运行并进入容器
  docker run -it 镜像名 /bin/bash   
    -i:跟容器进行交互
    -t:生成终端进入到容器
  输exit退出容器
 
删除容器:
  docker rm 容器名或容器id
 
退出容器后自动删除该容器
  docker --rm
 
容器改名称
  docer run --name 容器新名字 容器镜像名称 /bin/bash
 
暂停正在运行的容器,可以一次暂停多个
  docker pause 容器名
 
继续运行容器
  docker unpause 容器名
 
停止容器
  docker stop 容器名
 
重启容器
  docker restart 容器名
 
查看容器的历史记录(日志信息),比较重要,查看容器失败排错之类的
  docker logs 容器名字或ID
    -t 生成时间戳
    -f 动态打印
    --tail 10 打印10行
 
查看容器进程信息
  docker top 容器名字或ID
 
限制容器资源(具体参数说明在最下方)
  docker run -d -m 500m --memory-swap=600m --oom-kill-disable nginx
 
查看容器资源利用率
  docker stats 容器名字/id
 
查看容器详情:
  docker inspect 容器名/id
 
容器网络
进入容器,在容器中运行ping命令
  -c表示执行后面的命令
  docker exec -ti 容器名 sh -c 'ping www.baidu.com'
 
查看docker的网络
  docker network ls
 
查看网络详情
  docker network inspect network容器id(通过docker network ls查看)
 
快速查看容器IP
  docker exec -ti 容器ID ip addr
 
创建网络,有三种网络:host bridge null overlay
  host 就是复制了一份宿主机的网络,与宿主机共享网络,很少用
  null 不配置网络 如果容器创建了,这个容器是无法访问外网的(比如mysql)
  overlay 不同的网络进行通信
  --driver bridge 创建的是桥接类型,默认是桥接,所以可以不加这个
  docker network create --driver bridge
创建指定子网和掩码的网络
  docker network create --subnet 172.16.100.0/24 net1
  如果不加--subnet 172.16.100.0/24,那么会自动指定子网和掩码,net1是网络名称
  docker run --name web_app --network 网络名字 -v
  会把这个容器加入到指定的网络中
  $PWD/inedx.html:/user/share/nginx/html/index.html:ro -p 8222:80 -d nginx:latest
如果把两个容器都放在一个网络中 ,那么他们之间可以互相访问,这里有一个特性,比如ping的时候可以把ip换成容器的名称,如果两个容器在同一网络中,那么就可以ping通,但是默认创建的docker0中的容器不能通过容器名访问,只有自定义的网络才可以
  docker exec -ti 容器名 sh -c 'ping 另一个容器名称'
 
网络连通(docker0的网络想与自定义网络的容器联通)
  docker network connect 网络名 容器名称2
 
 
容器与宿主机是怎么通信的?
  每启动一个容器,可以使用ip addr查看宿主机IP,都会多出一个网桥,就是容器带来的
那么容器与宿主机的通信是通过veth-pair技术,它是充当一个桥梁,连接各种虚拟网络设备
 
容器与容器是怎么通信的?
  容器与容器如果不指定网络,那么就会共用docker0路由,docker会给容器分配一个默认的可用IP
  docker容器内的ip地址与服务器的IP相对应,都是一对儿的,这就是用了veth-pair技术,一端连接协议,一端彼此相连,正因为有这个特性,veth-pair充当一个桥梁,连接虚拟网络设备
假如容器都不指定网络的情况下,都是docker0路由的,docker会给容器分配一个默认的IP,由于容器都可以连接docker0,那么容器互相通信就可以通过docker0来进行,而docker0是连接宿主机的物理网卡
 
 docker容器IP转发实现原理
所有从容器内部发出来的包,都要做地址伪装,将容器内私有 IP 地址,转换为物理网卡的 IP 地址。如果有多个容器,所有的容器共享一个外网的 IP 地址,但是在 conntrack 表中,记录下这个出去的连接。
当服务器返回结果的时候,到达物理机,会根据 conntrack 表中的规则,取出原来的私网 IP,通过 DNAT 方式,将地址转换为这个私网 IP 地址,通过网桥 docker0 实现对内的访问
 
数据卷
数据卷可以用来做数据备份/数据共享,实现数据持久化,做映射之后会把原来容器中的文件复制一份到容器卷中
查看数据卷
  docker volume ls
创建数据卷
  docker volume creat 数据卷名称
启动nginx容器并与数据卷vole(数据卷名称)做映射,
  -v参数如果没有创建数据卷,会自动创建
  docker run --name web_app3 -v vole:/user/share/nginx/html/ -P -d nginx:latest
查看数据卷详情
  docker volume inspect 数据卷名称
使用root可以进入数据卷的目录
  cd 数据卷目录(查看数据卷详情可查询到目录)
清除全部的数据卷
  docker volume prune
  docker volume rm $(docker volume ls -q)
 
挂载数据卷的总结
 
宿主机容器运行结果
文件存在 文件不存在 挂载成功
目录存在 目录不存在 挂载成功
------ ------ ------
文件存在 文件存在 挂载成功,容器内的文件内容被覆盖
目录存在 目录存在 挂载成功,容器内目录内容被覆盖
------ ------ ------
文件存在 目录存在 容器启动失败
目录存在 文件存在 容器启动失败
------ ------ ------
目录不存在 目录不存在 挂载成功,docker会自动在宿主机和容器内新建此目录
目录不存在 文件存在 容器启动失败
目录不存在 目录存在 挂载成功,容器内目录内容被覆盖(空)
 
数据卷备份操作
  1、首先查询到容器数据卷的存放目录,docker volume inspect 名称
  2、进入目录,将该目录以及目录下所有文件都打包,如:tar -zcvf mysql.tar.gz _data/,存放在/root或其他目录下
  3、删除原来的所有容器,重新部署后数据清空了,然后进入新容器的数据卷目录,删除数据卷_data
  4、将刚才/root目录下的tar移动到新容器的数据卷目录,使用tar -zxvf解压,完成后重启容器
 

 
 

posted @ 2020-10-22 20:57  SoleMemory  阅读(144)  评论(0)    收藏  举报