Docker常用命令笔记

news2024/11/25 6:57:08

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(容器名字)
这样我们的容器靶机就有两块网卡了,攻击机只要添加一条路由策略即可访问容器靶机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序python+nodejs+php+springboot+vue 校园餐饮点单配送系统商家 配送员

管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.学生管理:对注册的学生信息进行添加,修改,删除,查询 4.商家管理:对注册的商家信息进行添加,…

【在线研讨会】智慧汽车时代来临 -车规功能安全软硬件一次到位

随着科技的不断发展,智慧汽车的时代已经到来,在实现智慧汽车的过程中,车辆的功能安全、软硬件设计等方面都面临着严峻的挑战。为了确保智慧汽车的安全性和可靠性,在硬件设计方面,需要考虑到各种可能出现的故障和安全风…

日撸 Java 三百行day39

文章目录 说明day39 关键路径1.关键路径2. 代码分析 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata day39 关键路…

PMP课堂模拟题目及解析(第1期)

1.在一个大型施工项目的规划阶段,出现了潜在的经济衰退迹象。之前关于经济衰退的风险被指定为低概率和高影响,预计持续 6-12 个月。项目开始后不久 发生了经济衰退,并按预期影响项目。六个月后,经济衰退影响的持续时间将更改为 24…

网络通信与密码相关概念流程

文章目录 前言一、明文通信二、密文通信1.对称加密2.非对称加密 三、安全信任机制1.CA(Certificate Authority) 证书授权中心2.数字证书 总结 前言 随着科技的发展,人们的通信都转化成电子通信,由于信息需要通过一个公有的网络进行传输,信息…

Spring IOC 源码解读

将回答以下问题: BeanFactory 和 ApplicationContext 之间的关系和区别。一个 Bean 是如何被注入到 IOC 容器里,中间经历了什么过程(Bean 的生命周期)。 先入为主 假设你已经有如下经验: 什么是 IOC。 don‘t call…

verilog手撕代码2——各种加法器介绍——真值表、表达式、电路图

文章目录 前言一、半加器二、全加器三、串行/行波进位加法器(Ripple-Carry Adder/RCA)四、超前进位加法器(Lookahead Carry Adder/LCA)五、进位保存加法器(Carry Save Adder/CSA) 前言 2023.4.25 一、半加…

Terraform

文章目录 简介安装简单使用案例 概念原理状态管理Backend 远程状态存储机制 配置语法Argument 参数Block 块terraform块required_providersbackend provider块: 与基础设施交互resource块: 定义基础架构data块: 数据源 表达式(Experssion)和函数(Functions)变量variable 输入变…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后,部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言,平时参加或者举办一些学校组织的活动的时候,总是避免不了需要准备一些演讲稿、广告宣传文案等内容,甚至于在疫情十分严重的这几年内,如何跟老师“委婉的”请假,也成为了我日常头疼的事情。但在…

React之redux的模板

文章目录 以下为模板代码安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)以下为项目目录在store/index.js里面的模板创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)在main.jsx引入模板(只需要看下面画横线的四行)在组件内使用 以下是…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef)和指数(exp)两个…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候,需要具备的功能有哪些呢? 一、采集跟踪功能。 (1)、信息采集:信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1)概述2)NameNode元数据解析3)Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4)Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5)元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境:Windows11,Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB,发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级,越来越多的新特性让我们的代码变得更加简洁。因此,今天这篇文章,我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用,它可以防止我的代码…

pwm调节亮度

文章目录 运行环境:1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境: ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…