当前位置: 首页 > news >正文

Docker常用命令笔记

docker常用命令

1 基础命令

  1. sudo docker version #查看docker的版本信息

  1. sudo docker info #查看docker系统信息,包括镜像和容器的数量

2 镜像命令

1.sudo docker images #查看本地主机的所有主机镜像

#解释

  1. **REPOSITORY **#镜像的仓库源
  2. TAG **** #镜像的标签
  3. **IMAGE ID **#镜像的id
  4. **CREATED **#镜像的创建时间
  5. **SIZE **#镜像的大小

#可选参数

  1. **-a/ --all **列出所有镜像
  2. **-q/ --quiet **只显示镜像的id

2. sudo docker search 搜索镜像


可选参数
sudo docker search --help

搜索收藏数大于3000的镜像
sudo docker search mysql --filter=STARS=3000

sudo docker pull 镜像名字[:tag] 下载镜像

指定版本下载

sudo docker pull mysql:5.7

3 docker rmi 删除镜像

  1. .sudo docker rmi -f 镜像id #删除指定的镜像id

镜像id可以省略为bbf6

  1. 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

  1. -a stdin: 指定标准输入输出内容类型,可选STDIN/STDERR三项;
  2. -d:后台运行的容器,并返回容器ID;
  3. -i: 以交互模式运行容器,通常与-t同时使用;
  4. -P:随机端口映射,容器内部端口随机映射到主机的端口;
  5. -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  6. -t: 为容器重新分配一个伪输入终端,通常与-i同时使用;
  7. –name=”nginx-lb”: 为容器指定一个名称;
  8. –dns 8.8.8.8:指定容器使用的DNS服务器,默认和宿主一直;
  9. **–dns-search example.com:**指定容器DNS搜索域名,默认和宿主一直;
  10. -h “mars”:指定容器的hostname;
  11. **-e username=”Ritchie”:**设置环境变量
  12. –env-file=[]:从指定文件夹读入环境变量;
  13. –cpuset=”0-2” or—cpuset=”0,1,2“:绑定容器到指定CPU运行;
  14. -m: 设置容器使用内存最大值;
  15. –net=”bridge”:指定容器的网络连接类型,支持bridge/host/none/contariner;四种类型;
  16. –link=[]:添加链接到另一个容器;
  17. –expose=[]:开放一个端口或一组端口;
  18. –volume,-v:绑定一个卷
  19. -it 使用交换方式运行,进入容器查看内容
  20. –privileged=false:指定容器是否为特权容器,特权容器拥有所有的capabilities
  21. –privileged=true

–privileged=true 这个参数是很有用的,使用该参数,container内的root拥有真正的root权限。container内的root只是外部的一个普通用户权限,privileged启动的容器,可以看到很多host上的设备,并且可以执行mount,甚至允许你在docker容器中启动docker容器。
这里举一个例子
启用命令还没加 --privileged=true 参数 可以明确看到docker 尝试去运行容器,但是马上就关闭了。

sudo docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

sudo docker exec -it 4de3 /bin/bash
尝试使用一些命令,提示permission denied,权限禁止 

加入参数命令后
sudo docker run -d --name mysql -p 3306:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql


成功运行命令

简单来说这个命令就是就是增加权限的。很有必要添加的一个参数,因为在里面跳过很多坑。
下面是我经常用的参数
docker run --name Apache -p 10.7.70.55:80:80 -tid --privileged=true centos
** /usr/sbin/init**
docker run -dit --name abc -P centos bash
sudo docker run --name ubuntu -P -tid --privileged=true ubuntu /bin/bash
sudo docker run -d -P –name tomcat01 tomcat

5 进入容器

sudo docker exec -it 5ad2 /bin/bash

6 退出容器

**#exit **停止并推出容器(后台方式运行则仅推出)
**#ctrl+P+Q **不停止容器推出
exit

7.列出运行过的容器

sudo docker ps
**ps ** # 列出当前正在运行的容器
-a #列出所有运行的记录
-n=? # 只显示最近创建的n个容器
-q # 只显示容器的编号

8.删除容器

  1. sudo docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用
  2. sudo docker rm -f $(docker ps -aq) #删除所有的容器
  3. 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搭建靶场环境是很方便的,因为容器内存是比较小的
就像下面这个容器,我已经搭建好的靶场,但是如何导出来呢。并且可以在另一台主机上再次利用。

导出和导入镜像

镜像的保存

  1. docker images
  2. docker save -o tomcat.tar #-o:指定保存的镜像的名字; tomcat.tar:保存到本地的镜像名称; tomcat:镜像名字,通过"docker images"查看
  3. docker load -I tomcat.tar


镜像的导入

  1. docker load -i tomcat.tar
  2. docker images

容器的导入和导出

导出镜像
docker export 5a85 > tomcat.tar

导入容器快照



12. docker Portaniner图形管理界面

Portaniner是docker的图形化管理工具,类似的工具还有rancher
下载运行portaniner镜像并运行,设置本机映射端口为808
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true 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
Kali:192.168.10.124
Windows:192.168.10.2
宿主机:192.168.10.122
Docker-br0(自定义的桥接网络):172.172.0.1
容器(nginx04):172.172.0.10

创建自定义网络

创建一个172.172.0.0网段,网桥的名字命名为docker-br0,这两个根据自己需要来
docker network create --subnet=172.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_forward=1” >> /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容器做NAT,Docker容器就不能上网了,那我们的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_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-7-121860817.pc_agg_new_rank&utm_term=docker+%E5%AE%B9%E5%99%A8%E5%86%85%E7%BD%91ip&spm=1000.2123.3001.4430

docker容器通过独立ip暴漏给局域网的方法!!这个博主讲的非常好,简单易懂
https://blog.csdn.net/lvshaorong/article/details/69950694

基于iptables的docker网络隔离通信讲解
如果想要容器正常通信,iptbales是极为重要的,建议看完这篇文章
https://blog.csdn.net/taiyangdao/article/details/88844558?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.highlightwordscore

总结
  1. 创建自定义网络
  2. 开启容器,绑定创建的自定义网络
  3. 做路由转发
  4. Iptables策略
导入的容器靶机如何添加另一块网卡

我们在导入靶机容器之后,它是自动开启的,网卡也是自动分配好的,所以我们在给靶机添加一块网卡就行了,命令如下
docker network connect docker=br0 (网卡名字) CVE-2021-XXXX(容器名字)
这样我们的容器靶机就有两块网卡了,攻击机只要添加一条路由策略即可访问容器靶机

相关文章:

Docker常用命令笔记

docker常用命令 1 基础命令 sudo docker version #查看docker的版本信息 sudo docker info #查看docker系统信息,包括镜像和容器的数量 2 镜像命令 1.sudo docker images #查看本地主机的所有主机镜像 #解释 **REPOSITORY **#镜像的仓库源TAG **** …...

Nachos系统的上下文切换

Fork调用创建进程 在实验1中通过gdb调试初步熟悉了Nahcos上下文切换的基本流程,但这个过程还不够清晰,通过源码阅读进一步了解这个过程。 在实验1中通过执行Threadtest,Fork创建子进程,并传入SimpleThread执行currentThread->…...

streamx平台部署

一. streamx介绍 StreamPark 总体组件栈架构如下, 由 streampark-core 和 streampark-console 两个大的部分组成 , streampark-console 是一个非常重要的模块, 定位是一个综合实时数据平台,流式数仓平台, 低代码 ( Low Code ), Flink & Spark 任务托…...

css中的background属性

文章目录 一:background-repeat二:background-position三:background缩写方式三:background-size四:background-origin五:background-clip 在日常前端开发中,经常需要进行背景或背景图的处理。但…...

代码评审平台Gerrit安装配置方法介绍

Gerrit是一款开源免费的基于 web 的代码审查工具,是基于 Git 的版本控制系统。在代码入库之前对开发人员的提交进行审阅,检视通过的代码才能提交入库。本文记录如何安装部署gerrit平台。 目录 Gerrit简介环境准备1. 安装Java2. 安装Git3. 安装nginx4. 安…...

一篇文章解决Mysql8

基于尚硅谷的Mysql8.0视频,修修改改。提取了一些精炼的内容。 首先需要在数据库内引入一张表。链接地址如下。 链接:https://pan.baidu.com/s/1DD83on3J1a2INI7vrqPe4A 提取码:68jy 会进行持续更新。。 1. Mysql目录结构 Mysql的目录结构…...

【Python】【进阶篇】6、Django视图函数

目录 6、Django视图函数1. 第一个视图函数1)HttpResponse视图响应类型2)视图函数参数request3)return视图响应 2. 视图函数执行过程 6、Django视图函数 视图是 MTV 设计模式中的 V 层,它是实现业务逻辑的关键层,可以用…...

Latex常用符号和功能记录

公式下括号 \underbrace & \overbrace \begin{equation} \underbrace{L_1L_2}_{loss ~ 1} \overbrace{L_3L_4}^{loss ~ 2} \end{equation}L L 1 L 2 ⏟ l o s s 1 L 3 L 4 ⏞ l o s s 2 L \underbrace{L_1L_2}_{loss ~ 1} \overbrace{L_3L_4}^{loss ~ 2} Lloss 1…...

MySQL高级篇——索引的创建与设计原则

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引(唯一非空) 1.1.4…...

王一茗: “大数据能力提升项目”与我的成长之路 | 提升之路系列(三)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…...

MySQL:数据库的基本操作

MySQL是一个客户端服务器结构的程序, 一.关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等. …...

银行系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:​​​​​​​https://download.csdn.net/download/qq_50954361/87708777 …...

【社区图书馆】-《科技服务与价值链》总结

【为什么研究价值链】 价值链及价值链协同体系是现代产业集群的核心枢纽,是推进城市群及产业集群化、服务化、生态化发展的纽带。因而推进价值链协同,创新发展价值链协同业务科技资源体系,既是科技服务业创新的重要方向,也是重塑生…...

工具链和其他-异步模块加载

目录 CMD/AMD Asynchronous Module Definition(AMD异步模块定义,语法风格) Common Module Definition ES6/CommonJS CommonJS ES6 Module 加载器示例 总结 cmd和amd的区别 现在有哪些异步加载方式 整体结构 编程:commonjs es6 module (有可能解…...

第一次使用R语言

在R语言中&#xff0c;“<-”符号与“”意义一样。另一种奇怪的R语言的等号表示方法&#xff0c;是以“->”表示&#xff0c;但是用得少。 有些计算机语言&#xff0c;变量在使用前要先定义&#xff0c;R语言则不需先定义&#xff0c;可在程序中直接设定使用。 若在Con…...

《语文教学通讯》栏目 收稿范围

《语文教学通讯》创刊于1978年&#xff0c;是由山西师范大学主管&#xff0c;山西师大教育科技传媒集团主办的期刊。历年被人民大学书报资料中心转载、复印的篇幅数量均居同类报刊之首。国内刊号&#xff1a;CN 14-1017/G4&#xff0c;国际刊号&#xff1a;ISSN 1004-6097&…...

Towards Principled Disentanglement for Domain Generalization

本文用大量的理论论述了基于解纠缠约束优化的域泛化问题。 这篇文章认为以往的文章在解决域泛化问题时所用的方法都是non-trivial的&#xff0c;也就是说没有作严格的证明&#xff0c;是不可解释的&#xff0c;而本文用到大量的定理和推论证明了方法的有效性。 动机 因为域泛…...

计算机网络学习02

1、TCP 与 UDP 的区别&#xff1f; 是否面向连接 &#xff1a; UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务&#xff0c;在传送数据之前必须先建立连接&#xff0c;数据传送结束后要释放连接。是否是可靠传输&#xff1a; 远地主机在收到 UDP 报文后&…...

网络交换机端口管理工具

如今&#xff0c;企业或组织级网络使用数百个交换机端口作为其 IT 基础架构的一部分来实现网络连接。这使得交换机端口管理成为日常网络管理任务的一部分。传统上&#xff0c;网络管理员必须依靠手动网络交换机端口管理技术来跟踪交换机及其端口连接状态。这种手动任务弊大于利…...

redis五大命令kv设计建议内存淘汰

什么是redis&#xff1f;主要作用&#xff1f; redis(remote dictionary server)远程字典服务&#xff1a;是一个开源的使用ANSI C语言编写&#xff0c;支持网络、可基于内存可持久化的日志型、key-value数据库&#xff0c;并提供多种语言的api redis的数据存在内存中&#xff…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...