江苏省建设部官方网站,东莞网站制作南城,建设一个门户网站需要多少钱,惠州市企业网站seo点击软件docker常用命令
1 基础命令
sudo docker version #查看docker的版本信息 sudo docker info #查看docker系统信息#xff0c;包括镜像和容器的数量
2 镜像命令
1#xff0e;sudo docker images #查看本地主机的所有主机镜像 #解释
**REPOSITORY **#镜像的仓库源TAG **** …docker常用命令
1 基础命令
sudo docker version #查看docker的版本信息 sudo docker info #查看docker系统信息包括镜像和容器的数量
2 镜像命令
1sudo docker images #查看本地主机的所有主机镜像 #解释
**REPOSITORY **#镜像的仓库源TAG **** #镜像的标签**IMAGE ID **#镜像的id**CREATED **#镜像的创建时间**SIZE **#镜像的大小
#可选参数
**-a/ --all **列出所有镜像**-q/ --quiet **只显示镜像的id
2 sudo docker search 搜索镜像 可选参数 sudo docker search --help 搜索收藏数大于3000的镜像 sudo docker search mysql --filterSTARS3000
sudo docker pull 镜像名字[:tag] 下载镜像 指定版本下载
sudo docker pull mysql:5.7
3 docker rmi 删除镜像
.sudo docker rmi -f 镜像id #删除指定的镜像id
镜像id可以省略为bbf6
sudo docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像id sudo docker rmi -f $(docker images -aq) 删除全部镜像id
4 容器命令
如拉取一个centos容器 sudo docker pull centos sudo docker run --help
-a stdin: 指定标准输入输出内容类型可选STDIN/STDERR三项-d后台运行的容器并返回容器ID-i: 以交互模式运行容器通常与-t同时使用-P随机端口映射容器内部端口随机映射到主机的端口-p: 指定端口映射格式为主机(宿主)端口:容器端口-t: 为容器重新分配一个伪输入终端通常与-i同时使用–name”nginx-lb”: 为容器指定一个名称–dns 8.8.8.8:指定容器使用的DNS服务器默认和宿主一直**–dns-search example.com**指定容器DNS搜索域名默认和宿主一直-h “mars”:指定容器的hostname**-e username”Ritchie”**设置环境变量–env-file[]:从指定文件夹读入环境变量–cpuset”0-2” or—cpuset”0,1,2“绑定容器到指定CPU运行-m: 设置容器使用内存最大值–net”bridge”:指定容器的网络连接类型支持bridge/host/none/contariner;四种类型–link[]添加链接到另一个容器–expose[]开放一个端口或一组端口–volume,-v绑定一个卷-it 使用交换方式运行进入容器查看内容–privilegedfalse指定容器是否为特权容器特权容器拥有所有的capabilities–privilegedtrue
–privilegedtrue 这个参数是很有用的使用该参数container内的root拥有真正的root权限。container内的root只是外部的一个普通用户权限privileged启动的容器可以看到很多host上的设备并且可以执行mount甚至允许你在docker容器中启动docker容器。 这里举一个例子 启用命令还没加 --privilegedtrue 参数 可以明确看到docker 尝试去运行容器但是马上就关闭了。
sudo docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql sudo docker exec -it 4de3 /bin/bash 尝试使用一些命令提示permission denied,权限禁止 加入参数命令后 sudo docker run -d --name mysql -p 3306:3306 --privilegedtrue -e MYSQL_ROOT_PASSWORDroot mysql 成功运行命令 简单来说这个命令就是就是增加权限的。很有必要添加的一个参数因为在里面跳过很多坑。 下面是我经常用的参数 docker run --name Apache -p 10.7.70.55:80:80 -tid --privilegedtrue centos ** /usr/sbin/init** docker run -dit --name abc -P centos bash sudo docker run --name ubuntu -P -tid --privilegedtrue ubuntu /bin/bash sudo docker run -d -P –name tomcat01 tomcat
5 进入容器
sudo docker exec -it 5ad2 /bin/bash
6 退出容器
**#exit **停止并推出容器后台方式运行则仅推出 **#ctrlPQ **不停止容器推出 exit
7.列出运行过的容器
sudo docker ps **ps ** # 列出当前正在运行的容器 -a #列出所有运行的记录 -n? # 只显示最近创建的n个容器 -q # 只显示容器的编号
8.删除容器
sudo docker rm 容器id #删除指定的容器不能删除正在运行的容器强制删除使用sudo docker rm -f $(docker ps -aq) #删除所有的容器sudo docker ps -a -q|xargs docker rm #删除所有的容器
9.启动和停止容器
sudo docker start 容器id #启动容器sudo docker restart 容器id #重启容器sudo docker stop 容器id #停止当前运行的容器sudo docker kall 容器id 强制停止当前容器
10.拷贝操作
sudo docker cp 容器id容器内路径 目的主机路径 #拷贝容器文件到主机中 docker cp 目的主机路径 容器id:容器内路径 #拷贝宿主机的文件到容器中 11. 镜像及的导入和导出
用docker搭建靶场环境是很方便的因为容器内存是比较小的 就像下面这个容器我已经搭建好的靶场但是如何导出来呢。并且可以在另一台主机上再次利用。
导出和导入镜像
镜像的保存
docker imagesdocker save -o tomcat.tar #-o指定保存的镜像的名字 tomcat.tar保存到本地的镜像名称 tomcat镜像名字通过docker images查看docker load -I tomcat.tar 镜像的导入
docker load -i tomcat.tardocker images 容器的导入和导出
导出镜像 docker export 5a85 tomcat.tar 导入容器快照
12. docker Portaniner图形管理界面
Portaniner是docker的图形化管理工具类似的工具还有rancher 下载运行portaniner镜像并运行设置本机映射端口为808 docker run -d -p 8088:9000 --restartalways -v /var/run/docker.sock:/var/run/docker.sock --privilegedtrue portainer/portainer 但是好像没启动 访问http://IP:端口 密码一定要符合复杂度
13.自定义Docker网络
学习网络之前需要把环境清空一下 docker rmi -f $(docker images -q)
想把给docker容器ip地址需要把docker网络理解了网络方面就是Docker比较薄弱的部分。
安装Docker时它会自动创建三个网络bridge创建容器默认连接到此网络、 none 、host
认识docker网络几种类型
网络模式简介Host容器将不会虚拟出自己的网卡配置自己的IP等而是使用宿主机的IP和端口。Bridge此模式会为每一个容器分配、设置IP等并将容器连接到一个docker0虚拟网桥通过docker0网桥以及Iptables nat表配置与宿主机通信。None该模式关闭了容器的网络功能。Container创建的容器不会创建自己的网卡配置自己的IP而是和一个指定的容器共享IP、端口范围。自定义网络
简单介绍 bridge 桥接 docker 相当于一个大桥 0.2 0.1 0.3 01就是咱们的桥就可以转发访问了docker默认的网络 none就是不配置网络 host和宿主机共享的网络
创建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet #create创建 --driver网络类型默认就是桥接可以不选择 --subnet 子网16/ 就是255乘255。24/只能创建255个。所以我们选择16/ --gateway网关相当于咱们的路由器 mynet自定义名字我把它称为mynet 使用ip addr命令可以看到多出来一块网卡。 docker network inspect mynet 此时我们启动新的容器时指定mynet即可也就是 - -net参数 docker run -d -P --name tomcat07 --net mynet tomcat 当然咱们自定义创建的网络可以正常访问外网
apt install net-tools 安装ifconfig
apt install iproute2 -y 安装ip addr
apt install -y iputils-ping 安装ping
不同网段容器通讯
创建完成之后你会发现跨网段是无法互相ping通的 也就是咱们的docker0 和mynet里面的容器是无法进行通信的 使用这条命令将tomcat01 加入到mynet里面也就相当于一个容器两个网卡就可以正常通讯了 docker network connect mynet tomcat01
Docker容器通过独立IP暴露给局域网的方法
我的环境 服务器路由器上网用的192.168.10.1 Kali192.168.10.124 Windows192.168.10.2 宿主机192.168.10.122 Docker-br0自定义的桥接网络172.172.0.1 容器nginx04172.172.0.10
创建自定义网络
创建一个172.172.0.0网段网桥的名字命名为docker-br0这两个根据自己需要来 docker network create --subnet172.172.0.0/16 --gateway 172.172.0.1 docker-br0 通过ip adr可以看到我们创建的网卡
自定义ip开启容器
docker run -itd --net docker-br0 --ip 172.172.0.10 --name nginx04 nginx 进入到容器安装一些工具 docker exec -it nginx04 /bin/bash apt update apt install net-tools
查看容器ip 172.172.0.10 开启nginx服务 Nginx Netstat -ntap
我们在宿主机上访问是没有问题的 我们到kali上无法访问的 也ping不通 路由转发
此时到宿主机开启路由转发 配置文件为 /etc/sysctl.conf echo “net.ipv4.ip_forward1” /etc/sysctl.conf sysctl -p 到kali上面添加静态路由 route add -net 172.172.0.0 netmask 255.255.0.0 gw 192.168.10.122 添加完路由你会发现可以ping通docker-br0我们自定义的网卡但是ping不同容器
Iptables策略
iptables -L -t nat --line-numbers iptables -t nat -L -n
注意那句MASQUERADE all – 172.172.0.0/16 0.0.0.0/0会导致所有172.172.0.0/16的数据包都不能到达docker以外的网络所以我们要关掉这个NAT关掉很容易我们只需删掉这一条iptables规则就可以了。然后源IP为172.172.0.10的数据包就可以出现在192.168.10.1/24的网络中了。
Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all – 172.172.0.0/16 0.0.0.0/0
iptables -t nat -I PREROUTING -s 192.168.10.0/16 -d 172.172.0.0/16 -j DNAT --to 172.172.0.1 iptables -t nat -D PREROUTING 1 根据对应的all删除 可以访问了
但是把NAT关掉了以后虽然内网可以互ping了但是Docker容器可能上不去网呀。第一个路由器如果自动NAT 了172.172.0.10还好但要是没有人给Docker容器做NATDocker容器就不能上网了那我们的nginx也就没法用了。那么如何既保证Docker容器访问外网的数据包被NAT又保证内网通信不被NAT呢只要稍微修改一下iptables规则就好了如下
iptables -t nat -A POSTROUTING -s 172.172.0.10 ! -d 192.168.10.1/24 -j MASQUERADE
Windows同样添加静态路由 route -p add 172.172.0.0 mask 255.255.255.0 192.168.10.122 如果有什么不理解的可以参考下面三条链接
关于通过容器内网ip直接路由到docker容器 https://blog.csdn.net/langchao7946/article/details/121860817?utm_mediumdistribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-7-121860817.pc_agg_new_rankutm_termdocker%E5%AE%B9%E5%99%A8%E5%86%85%E7%BD%91ipspm1000.2123.3001.4430
docker容器通过独立ip暴漏给局域网的方法这个博主讲的非常好简单易懂 https://blog.csdn.net/lvshaorong/article/details/69950694
基于iptables的docker网络隔离通信讲解 如果想要容器正常通信iptbales是极为重要的建议看完这篇文章 https://blog.csdn.net/taiyangdao/article/details/88844558?spm1001.2101.3001.6650.1utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.highlightwordscoredepth_1-utm_sourcedistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.highlightwordscore
总结
创建自定义网络开启容器绑定创建的自定义网络做路由转发Iptables策略
导入的容器靶机如何添加另一块网卡
我们在导入靶机容器之后它是自动开启的网卡也是自动分配好的所以我们在给靶机添加一块网卡就行了命令如下 docker network connect dockerbr0 (网卡名字) CVE-2021-XXXX容器名字 这样我们的容器靶机就有两块网卡了攻击机只要添加一条路由策略即可访问容器靶机