Docker技巧汇总
Docker技巧汇总
- 前言
- 使用流程
- 安装配置
- 镜像管理
- 创建并运行容器
- 使用容器/常用命令
- 导出和导入
- 查看元数据
- 挂载数据卷
- 端口映射/转发
- VS Code连接Docker
前言
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。容器使用沙箱机制,相互独立且性能开销极低。
本文介绍Docker使用技巧,内容包含使用流程、安装配置、镜像管理、创建并运行容器、使用容器、导入和导出、查看元数据、挂载数据卷、端口映射、VS Code连接Docker、等等。
使用流程
- 安装Docker
- 配置Docker
- 拉取镜像
- 创建容器
- 启动容器
- 进入容器
- 退出容器
安装配置
首次使用需要安装和配置:
# 安装Docker
sudo apt install docker.io# 配置Docker
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
镜像管理
查看镜像
docker images
此命令可以查看本地主机上存在的镜像。
搜索镜像
docker search [searchName]# 示例:从docker hub中搜索docker名为centos的镜像
docker search centos
此命令可以从docker hub中搜索镜像,其中:
name:代表此镜像的名称
description:此镜像的描述
stars:下载次数
official:是否由官方提供
拉取镜像
方式1:DockerHub下载
DockerHub官网:链接
方式2:命令行下载
下载命令可在DockerHub获取:
docker pull [options] imageName[:tag]# 默认拉取最新版本
docker pull imageName
docker pull imageName:latest# 拉取指定版本
docker pull imageName:version
其中:imageName为镜像名称,tag和version为版本。
注意:公共服务器上若已存在所需镜像,则无需下载镜像,直接创建容器即可。
删除镜像
docker rmi [imageName]
# or
docker image rm [imageName]# 强制删除
docker rmi -f [imageName]
注意:若存在容器正在引用镜像,则无法删除镜像,需要使用 -f 强制删除。但不推荐这种做法,推荐先删除引用此镜像的容器,再删除此镜像。
创建并运行容器
使用如下命令创建并运行容器:
# 简洁语法
docker run [options] image [command] [args]
# 详细语法
docker run -it --privileged --name [dockerName] -p [hostPort:dockerPort] -v [hostDir:dockerDir] imageName[:tag] [command]# 示例:
docker run -it --privileged --name my_ubuntu -p 8020:22 -v $PWD:/workspace ubuntu:20.04
docker run -it --privileged --name my_ubuntu -p 8020:22 -v /home/[user]/work:/workspace ubuntu:20.04 /bin/bash
变量说明:
command:可省略,若不想省略,可填写 /bin/bash 或 bash;
dockerName:为容器名称,可自定义;
imageName:为要选择的镜像;
tag:一般为镜像版本;
hostPort:为主机端口;dockerPort:为容器端口;
hostDir:为主机目录;dockerDir:为容器目录,目录需为绝对路径;
$PWD:代表终端的当前路径;
user:代表当前用户名;
args:为其他参数
options说明,详情可见官方文档或菜鸟教程:
-d 后台运行容器,并返回容器ID;
-i 以交互模式运行容器,通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-it 为 -i 和 -t 结合;
--name 为容器自定义名称;
-p 为端口映射/转发命令,可将容器端口映射到主机中;用法: -p [hostPort:dockerPort]
-v 为挂载数据卷命令,可将主机目录挂载到容器中,可实现文件同步,目录需为绝对路径;用法: -v [hostDir:dockerDir]
补充:
推荐使用-p和-v命令;
使用-p命令进行端口映射后,可通过ssh连接容器,示例:
# 访问主机的8020端口即可通过ssh连接容器
-p 8020:22
使用-v命令挂载数据卷后,可同步容器外和容器内的文件,示例:
# 将主机当前目录挂载到容器的workspace目录
-v $PWD:/workspace
-p 和 -v 可创建多个映射,示例:
-p [hostPort1:dockerPort1] -p [hostPort2:dockerPort2] -v [hostDir1:dockerDir1] -v [hostDir2:dockerDir2]
使用容器/常用命令
查看容器状态
# 查看已运行容器
docker ps
# 查看所有容器,包含已运行和已停止的容器
docker ps -a
查看容器信息
其中,dockerName为容器名称,dockerId为容器ID,二选一即可。
# 查看容器元数据
docker inspect [dockerName/dockerId]
# 查看容器ID
docker inspect [dockerName/dockerId] | grep Id
# 查看容器IP地址
docker inspect [dockerName/dockerId] | grep IPAddress
# 查看容器端口映射,需先启动容器
docker port [dockerName/dockerId]
启动容器
docker start [dockerName/dockerId]
停止容器
docker stop [dockerName/dockerId]
重启容器
restart 等同于 stop + start 。
docker restart [dockerName/dockerId]
进入容器
进入已运行容器前需先启动容器,使容器保持运行状态。
# attach 退出时会导致容器停止运行
docker attach [dockerName/dockerId]# exec 退出时不会导致容器的停止
# 一定要加/bin/bash或bash或其它可执行的文件
docker exec -it [dockerName/dockerId] /bin/bash
退出容器
# 在容器内使用
exit
删除容器
删除容器时,容器必须是停止状态。
# 删除一个或多个容器
docker rm [dockerName] [dockerName]
# or
docker rm [dockerId] [dockerId]# 删除全部停止容器
docker prune
重命名容器
oldName为旧容器名,newName为新容器名。
docker rename [oldName] [newName]
导出和导入
导出容器
可使用 docker export 从容器创建快照文件:
docker export [dockerName/dockerId] > [name.tar]
# or
docker export --output="[name.tar]" [dockerName/dockerId]# 示例
docker export my_ubuntu > ./docker/my_ubuntu.tar
其中,name.tar 为快照文件。
导入容器镜像
可使用 docker import 从容器快照文件中再导入为镜像:
cat [name.tar] | docker import - [imageName]
# 示例
cat ./docker/my_ubuntu.tar | docker import - my/ubuntu:v1
其中,imageName 为容器镜像。
从容器创建镜像
docker commit [opt] [dockerName/dockerId] [imageName[:tag]]
# 示例
docker commit -a "user" -m "my ubuntu" my_ubuntu my/ubuntu:v1
其中,opt说明如下:
-a:提交的镜像作者;
-c:使用Dockerfile指令来创建镜像;
-m:提交时的说明文字;
-p:在commit时,将容器暂停。
补充
导入或创建镜像后,可以使用docker run命令创建并运行新容器。
查看元数据
此命令可以参考容器/镜像的元数据。
其中,NetworkSettings 中的 Networks -> IPAddress 即为容器的IP地址。
# 查看所有数据
docker inspect [dockerName/dockerId]
# 查看容器ID
docker inspect [dockerName] | grep Id
# 查看容器IP地址
docker inspect [dockerName/dockerId] | grep IPAddress
挂载数据卷
数据卷
Docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。
卷就是目录或者文件,存在一个或者多个容器之中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或者共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会再容器删除时删除其挂载的数据卷。
数据卷特点
- 数据卷可在容器之间共享或者重用数据。
- 卷中的更改可以直接生效。
- 数据卷中的更改不会包含在镜像的更新中。
- 数据卷的生命周期一直持续到没有容器使用它为止。
挂载命令
此命令一般在创建容器时使用。
docker run -it -v [hostDir:dockerDir] [image] /bin/bash# 示例:
docker run -it -v /home/test01:/home centos /bin/bash
hostDir为主机目录,dockerDir为容器目录,目录需为绝对路径。
挂载后,这两个目录是同步的状态,在容器目录中写入任何新的文件,都会同步到主机目录下;同样,主机目录中写入新文件也会同步到容器目录。
端口映射/转发
若未创建容器,则通过 docker run 命令创建容器时,添加 -p 选项设置端口映射即可。
若已创建容器,则可通过以下方案配置端口映射,推荐使用方案1,方便快捷。假设主机端口为hostPort,容器端口为dockerPort。
方案1:重新创建容器
使用 docker export 或 docker commit 命令将已创建容器生成新镜像,再从新镜像创建新容器,新容器正常后删除旧容器。
# 停止容器
docker stop [dockerName/dockerId]
# 提交一个已创建容器生成镜像
docker commit [dockerName/dockerId] [newImageName]
# 创建新容器并添加端口映射
docker run -it --privileged --name [newDockerName] -p [hostPort:dockerPort] -v [hostDir:dockerDir] [newImageName]# 新容器可正常使用后,删除原容器
docker rm [oldDockerName]
# 重命名新容器为原名称
docker rename [newDockerName] [oldDockerName]
方案2:修改容器配置文件
停止容器
docker stop [dockerName/dockerId]
停止Docker服务
sudo systemctl stop docker
进入容器目录
# 查看容器ID
docker inspect [dockerName] | grep Id
# 切换为root用户
su
# 进入容器目录
cd /var/lib/docker/containers/[dockerId]
修改配置文件
hostconfig.json:在 PortBindings 修改以下配置。
"PortBindings":{"[dockerPort]/tcp":[{"HostIp":"","HostPort":"[hostPort]"}]}
# 示例
"PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"8020"}]}
config.v2.json:在 ExposedPorts 增加以下配置。
"ExposedPorts":{"[dockerPort]/tcp":{}}
示例:
"AttachStderr":true,"ExposedPorts":{"22/tcp":{}},"Tty":true
保存文件后,开启Docker服务和容器
sudo systemctl start docker
sudo systemctl enable docker
docker start [dockerName/dockerId]
方案3:修改iptables
注意: 使用iptables相关命令时需要管理员权限。
查看iptables
# 显示nat表所有链
sudo iptables -t nat -vnL
# 显示nat表DOCKER链
sudo iptables -t nat -vnL DOCKER
# 显示行号
sudo iptables -t nat -vnL DOCKER --line-number
查看已创建容器的IP
docker inspect [dockerName/dockerId] | grep IPAddress
增加iptables规则
sudo iptables -t nat -A DOCKER -p tcp --dport [hostPort] -j DNAT --to-destination [dockerIP:dockerPort]
# 示例
sudo iptables -t nat -A DOCKER -p tcp --dport 8021 -j DNAT --to-destination 172.17.0.2:22
删除iptables规则
若添加错误或需要修改,可删除规则再次添加。
sudo iptables -t nat -D DOCKER [lineNumber]
保存iptables规则
通常情况下,定义的规则会被设置为持续到下一次重启。如果不保存,当计算机重启后所有的规则都会丢失,因此需要对iptables规则进行保存。
# 普通保存
sudo iptables-save
# 保存到文件
sudo iptables-save > [fileName]
# 从文件恢复
sudo iptables-restore < [fileName]# 示例
sudo iptables-save > /etc/iptables/rules
sudo iptables-restore < /etc/iptables/rules
VS Code连接Docker
有2个方案可在VS Code连接Docker,方案1不需要进行容器端口映射,方案2需要进行容器端口映射,可自行选择。推荐使用方案2,比较灵活。
方案1需要在VS Code安装 Dev Containers 扩展,方案2需要安装 Remote - SSH 扩展,推荐安装 Remote Development 扩展,包含前2个扩展。
方案1:通过VS Code的容器插件链接
此方法不需要进行容器端口映射。
打开VS Code,点击远程扩展按钮,远程资源管理器选择开发容器,选中已经存在的容器,选择在新窗口中附加即可,如下图:

方案2:通过VS Code的SSH插件连接
此方法需要进行容器端口映射。
此方法与SSH连接主机相同,只需将SSH默认端口号22修改为主机的映射端口号hostPort即可。
连接前需要确保设置容器用户密码、安装openssh-server、修改sshd配置、开启ssh服务,详细步骤请见本人的另一篇博文 VS Code技巧汇总 中的 远程SSH连接 章节。
相关文章:
Docker技巧汇总
Docker技巧汇总 前言使用流程安装配置镜像管理创建并运行容器使用容器/常用命令导出和导入查看元数据挂载数据卷端口映射/转发VS Code连接Docker 前言 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中…...
学习使用微信小程序实现智能名片电子名片功能代码
学习使用微信小程序实现智能名片电子名片功能代码 拨打手机号功能一键复制信息功能定位导航功能存入手机通讯录功能转发分享功能 拨打手机号功能 wx.makePhoneCall({phoneNumber: qipa250 //仅为示例,并非真实的电话号码 })一键复制信息功能 wx.getClipboardData(…...
学习响应式编程中遇到的奇奇怪怪的问题
spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…...
前端常用js、css效果
前端常用js效果 效果参考代码文本横向滚动文本无限滚动无缝轮播无缝滚动盒子上下移动樱花飘落 效果 主要整理了几个常用的,方便平时做项目的时候参考 文本横向滚动 文本无限滚动 无缝轮播 无缝滚动 盒子上下滚动 樱花飘落效果 参考代码 文本横向滚动 <!DOCTYP…...
Modern C++ 条件变量
今天无意中看到一篇帖子,关于条件变量的,不过仔细看看发现它并达不到原本的目的。 程序如下,读者可以先想想他的本意,以及有没有问题: #include <iostream> #include <thread> #include <condition_v…...
免费chartGPT网站汇总--
https://s.suolj.com - (支持文心、科大讯飞、智谱等国内大语言模型,Midjourney绘画、语音对讲、聊天插件)国内可以直连,响应速度很快 很稳定 https://seboai.github.io - 国内可以直连,响应速度很快 很稳定 http://gp…...
关于C#中的async/await的理解
1. 使用async标记的方法被认为是一个异步方法,如果不使用await关键字,调用跟普通方法没有区别 static async Task Main(string[] args){Console.WriteLine("主线程id:" Thread.CurrentThread.ManagedThreadId);TestAwait();Consol…...
docker硬件交互 _ROS2
docker硬件交互 _ROS2 将自己需要挂载的设备接到主板上,在宿主机中建立udev规则(/etc/udev/rules.d/)然后在开启容器时,将设置了规则的devices 通过 --device/dev/myserial --device/dev/rplidar 等 参数挂载到docker容器中 doc…...
JS的数据类型和运算符
typeof()方法:检测数据类型 JS中的基本数据类型 基本数据类型 1.number 数字 2.string 字符串 3.boolean 布尔 4.null 代表空值(typeof方法检测出来的数据类型是object类型) 5.underfined 未定义;变量已声明但是未赋值 6.…...
CSS实现平行四边形
1、为什么实现平行四边形 在日常开发过程中,有些时候我们可以会遇到一种情况,如可视化大屏中要求我们横线实现对应的进度条,但进度条的内容是由无数个平行四边形组装类似于进度条的形式,那么我们就需要使用CSS来进行对应的实现。 …...
第11章 GUI Page500~504 步骤三十二:打开画板文件02
各个图元类新增GetTypeName_Static(),并将原来的GetTypeName()改为调用静态方法实现: 直线: 圆: 十字: 矩形: 文字: tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加: 增加…...
【ROS2】ROS2使用C++实现简单服务端
使用ROS2实现简单的服务端,功能为将客户端提供的两个数相加后返回给客户端。 代码如下: #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" #include "base_interfaces_demo/msg/student.hpp" #include "base_interfac…...
WAF攻防相关知识点总结1--信息收集中的WAF触发及解决方案
什么是WAF WAF可以通过对Web应用程序的流量进行过滤和监控,识别并阻止潜在的安全威胁。WAF可以检测Web应用程序中的各种攻击,例如SQL注入、跨站点脚本攻击(XSS)、跨站请求伪造(CSRF)等,并采取相…...
行云部署前端架构解析-前言 | 京东云技术团队
一个简单的自我介绍 项目规模 截止目前上万次代码提交,总代码行数1超过21万行,其中人工维护的代码超过 13万行,近千个文件。 前端线上服务直接对接的后端服务,达十多个。 跟很多应用一样, 它有行云的入口, 也有独立的服务, 还…...
git提交代码到远端仓库的方法详解
一、何为git git就是版本控制器,就比如说你新建了一个git文件夹,里面用于存放你的C语言实习报告,现在要用git对该文件夹进行接管。当你修改了你的C语言实习报告点击保存之后,就用git的相关命令,提交给git,让…...
基于网络爬虫的天气数据分析
二、网络爬虫设计 网络爬虫原理 网络爬虫是一种自动化程序,用于从互联网上获取数据。其工作原理可以分为以下几个步骤: 定义起始点:网络爬虫首先需要定义一个或多个起始点(URL),从这些起始点开始抓取数据…...
Javaweb之SpringBootWeb案例员工管理之删除员工的详细解析
3.3 删除员工 查询员完成之后,我们继续开发新的功能:删除员工。 3.3.1 需求 当我们勾选列表前面的复选框,然后点击 "批量删除" 按钮,就可以将这一批次的员工信息删除掉了。也可以只勾选一个复选框,仅删除一…...
写点东西《什么是网络抓取?》
写点东西《什么是网络抓取?》 什么是网络抓取? 网络抓取合法吗? 什么是网络爬虫,它是如何工作的? 网络爬虫示例 网络抓取工具 结论 您是否曾经想同时比较多个网站上同一件商品的价格?或者自动提取您最喜欢的…...
使用C#操作文件:一个实际案例——替换文件中的IP地址
标题: 使用C#操作文件:一个实际案例——替换文件中的IP地址 介绍: 欢迎阅读我的最新博客!今天,我们将探讨如何使用C#来处理一个实际的编程挑战:读取一个配置文件并替换其中的IP地址。这是一个非常常见的…...
Zookeeper简介
系列文章目录 Zookeeper安装教程 目录 一、Zookeeper简介 二、Zookeeper的数据结构 三、CPA理论 四、BASE 理论 五、ZooKeeper的特性 前言 这是我的学习笔记,以便后面翻阅。 一、Zookeeper简介 ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务&a…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
触发DMA传输错误中断问题排查
在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...
Ubuntu 可执行程序自启动方法
使用 autostart(适用于桌面环境) 适用于 GNOME/KDE 桌面环境(如 Ubuntu 图形界面) 1. 创建 .desktop 文件 sudo vi ~/.config/autostart/my_laser.desktop[Desktop Entry] TypeApplication NameMy Laser Program Execbash -c &…...
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南 在金融行业安全审计中,未启用HTTPS的Web应用被列为高危漏洞。通过正确配置HTTPS,可将中间人攻击风险降低98%——本文将全面解析Spring Boot中HTTPS的实现方案与实战避坑指南。 一、HTTPS 核心原理与…...
.Net Framework 4/C# 面向对象编程进阶
一、继承 (一)使用继承 子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。 C# 中使用“:”来表示两个类的继承。子类不能访问父类的私有成员,但是可以访问其公有成员,即只要使用 public 声明类成员,就既可以让一…...
