二、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 实现对内的访问
所有从容器内部发出来的包,都要做地址伪装,将容器内私有 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解压,完成后重启容器
浙公网安备 33010602011771号