Docker技巧汇总

Docker技巧汇总

  • 前言
  • 使用流程
  • 安装配置
  • 镜像管理
  • 创建并运行容器
  • 使用容器/常用命令
  • 导出和导入
  • 查看元数据
  • 挂载数据卷
  • 端口映射/转发
  • VS Code连接Docker

前言

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。容器使用沙箱机制,相互独立且性能开销极低。

本文介绍Docker使用技巧,内容包含使用流程、安装配置、镜像管理、创建并运行容器、使用容器、导入和导出、查看元数据、挂载数据卷、端口映射、VS Code连接Docker、等等。

使用流程

  1. 安装Docker
  2. 配置Docker
  3. 拉取镜像
  4. 创建容器
  5. 启动容器
  6. 进入容器
  7. 退出容器

安装配置

首次使用需要安装和配置:

# 安装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为镜像名称,tagversion为版本。
注意:公共服务器上若已存在所需镜像,则无需下载镜像,直接创建容器即可。

删除镜像

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不会再容器删除时删除其挂载的数据卷。

数据卷特点

  1. 数据卷可在容器之间共享或者重用数据。
  2. 卷中的更改可以直接生效。
  3. 数据卷中的更改不会包含在镜像的更新中。
  4. 数据卷的生命周期一直持续到没有容器使用它为止。

挂载命令
此命令一般在创建容器时使用。

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连接 章节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

AI时代—ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

Python初识——小小爬虫

一、找到网页端url 打开浏览器&#xff0c;打开百度官方网页点击图片&#xff0c;打开百度图片 鼠标齿轮向下滑&#xff0c;点击宠物图片 进入宠物图片网页&#xff0c;在网页空白处点击鼠标右键&#xff0c;弹出的框中最下方显示“检查”选项&#xff0c;点击&#xff08;我是…

搭建一个JavaWeb项目流程详解

搭建一个JavaWeb项目流程 本文致力于&#xff0c;让编程者一步步明白书写一个JavaWeb项目应该做些什么&#xff0c;梳理清楚流程框架&#xff0c;需要的jar包&#xff0c;同时手写了一个分页工具类也在其中&#xff0c;让你在编程中更加丝滑。 1.src\main\java\com\einmeer\qia…

springboot中一些注解

springboot中一些注解 1:项目启动时会去扫描启动的注解&#xff0c;一般是启动时就想要被加载的方法&#xff1a; 2:springBoot中MSApplication启动类的一些其他注解&#xff1a; EnableAsync&#xff1a;这是一个Spring框架的注解&#xff0c;它用于开启方法异步调用的功能。当…

【MySQL自身的性能优化】InnoDB 的 Buffer Pool

这里写目录标题 一、引入缓存的重要性二、InnoDB 的 Buffer Pool1. Buffer Pool 内部组成2. free 链表管理空闲页3. flush 链表管理脏页4. LRU 链表提高缓存命中那咱需要咋地解决预读问题呢&#xff1f;那咱需要咋地解决 Buffer Pool 污染问题呢&#xff1f; 5. 脏页什么时候被…

pyqt5+python子域名扫描程序

import sysfrom PyQt5 import uic from PyQt5.QtWidgets import * #requests库内置了不同的方法来发送不同类型的http请求 import requests#BS主要功能是从网页抓取数据&#xff0c;提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能 from bs4 import Beau…

WebSocket协议、与HTTP对比

WebSocket 也可前往本人的个人网站进行阅读 WebSocket 和 HTTP WebSocket和HTTP协议一样&#xff0c;都是基于TCP协议实现的应用层协议。 HTTP协议通常是单边通信&#xff0c;主要用于传输静态文档、请求-响应通信&#xff0c;适用于Web浏览器加载网页、API调用等。然而Web…

NX二次开发获取圆弧的四个象限点

我是用来用来画水路线框的UF_MODL_ask_curve_points&#xff08;&#xff09;可以按弧长或者弧度获取曲线的等分点&#xff0c;取PI/2的圆弧&#xff0c;即将圆弧四等分&#xff0c;你也可以取任意等分点。 int GetArcPoint(tag_t arc_tag,double point[4][3]) {if(arc_tag0)r…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的&#xff0c;所以所有的部署操…

DRmare Music Converter - 一款高效的音乐转换工具,让您的音乐无处不在!

DRmare Music Converter是一款专业的音乐转换工具&#xff0c;旨在帮助用户更方便地管理和享受音乐。无论您是使用Mac还是Windows操作系统&#xff0c;DRmare Music Converter都能为您提供高效、便捷的音乐转换体验。 DRmare Music Converter支持多种音频格式的转换&#xff0…

伊恩·斯图尔特《改变世界的17个方程》波动方程笔记

主要是课堂的补充&#xff08;yysy&#xff0c;我觉得课堂的教育模式真有够无聊的&#xff0c;PPT、写作业、考试&#xff0c;感受不到知识的魅力。 它告诉我们什么&#xff1f; 小提琴琴弦上某个小段的加速度&#xff0c;与相邻段相对于该段的平均位移成正比。 为什么重要&…

Studio One2024免费版下载及入门教程分享

众所周知&#xff0c;Studio One是一个专业的音频编辑软件&#xff0c;近几年随着音视频剪辑越来越火&#xff0c;Studio One也逐渐被人们所熟知。最近&#xff0c;就有许多小伙伴私信我&#xff0c;寻求Studio One的入门教程。 这不&#xff0c;今天小编就给大家带来了音频剪…

一个好用的工具,对网工来说是绝杀技!

上午好&#xff0c;我是老杨。 提到用人&#xff0c;很多单位和管理者第一反应都是应聘者的能力。能力到底怎么界定&#xff0c;其实每个人都有不同的判定标准。 在我看来&#xff0c;做事专注&#xff0c;且能尽可能“偷懒”的网工 &#xff0c;就是我个人筛选员工的标准。 …

Python seaborn库的边框设置(Seaborn篇-02)

Python seaborn库的边框设置(Seaborn篇-02)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习&#xff08;十七&#xff09;虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下&#xff1a; OS WI…

AI学习(2): PyTorch2.x环境安装

1.介绍 注:下面是对PyTorch进行了简单的介绍&#xff0c;不喜欢可直接跳过。 1.1 什么是PyTorch PyTorch是一个由Facebook人工智能研究团队开发的开源机器学习库&#xff0c;用于开发人工智能和深度学习的应用程序。PyTorch支持广泛的机器学习和深度学习算法&#xff0c;并基于…

Flink Kubernetes Operator 介绍

一、简介 Flink Kubernetes Operator是针对在Kubernetes上运行Apache Flink应用程序而设计的工具。它充分利用了Kubernetes的优势&#xff0c;实现了对Flink集群的弹性管理和自动化操作&#xff0c;通过扩展Kubernetes API的方式&#xff0c;提供了管理和操作Flink部署的功能。…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在将一个复杂对象的创建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示形式。 主要角色&#xff1a; 产品&#xff08;Product&#xff09;&#xff1a;表示正在构建…