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

Docker教程

docker 安装

官方文档

wget -qO- https://get.docker.com/ | sh

sudo usermod -aG docker your-user

sudo usermod -aG docker ${USER}

newgrp docker # 更新docker用户组

cat /etc/group | grep docker

docker --version

使用非root用户管理

帮助启动类 命令

  • systemctl start docker # 启动Docker
  • systemctl stop docker # 停止Docker
  • systemctl restart docker # 重启Docker
  • systemctl status docker # 查看状态
  • systemctl enable docker # 开机启动
  • docker info # 概要信息
  • docker --help # 查看总体帮助
  • docker xxx --help # 查看命令帮助

镜像命令

  • docker images # 列出本地主机上的镜像
    • -a # 所有历史
    • -q # 只展示ID
  • docker search XXX # 搜索镜像名
    • --limit 5 XXX # 前五
  • docker pull XXX[:tag] # 下载镜像
  • docker system df # 查看镜像/容器/数据卷锁占的空间
  • docker rmi XXX
    • -f # 强制删除
    • docker rmi -f $(docker images -qa) # 删除所有
  • 虚悬镜像是什么:
    • 名称、标签都是None的镜像,俗称虚悬镜像 dangling image
  • docker save 镜像ID -o xxx.tar # 保存一个镜像为一个tar包
  • docker load 镜像ID -i xxx.tar # 从tar包加载镜像
  • docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]

容器命令

  • docker run [OPTIONS] image [COMMAND]

    • [OPTIONS]
      • --name="容器名字" # 为容器指定一个名称
      • -d # 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
      • -i # 以交互模式运行容器,通常与-t同时使用
      • -t # 为容器重新分配一个伪输入终端,通常与-i同时使用
      • -P # 随机端口映射,大写P 映射所有Dockerfile中EXPOSE的端口
      • -p # 指定端口映射,小写p
      • -w # 覆盖WORKDIR工作目录
      • -e # 传递环境变量,同ENV指令
      • -u # 指定用户
      • --restart # 自动重启
        • --restart=always # 总是
        • --restart=on-failure:5 # 退出代码非0时重启,且重启次数最多为5次
      • --log-driver # 日志驱动 ="syslog" 日志重定向到syslog并关闭docker logs命令
      • --entrypoint # 覆盖Dockerfile中的ENTRYPOINT指令
  • docker create [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器,但不运行

  • docker ps # 罗列

    • [OPTIONS]
      • -a # 显示所有正在运行,和历史运行过的容器
      • -l # 显示最近创建的容器
      • -n # 显示最近n个容器
      • -q # 静默模式,只显示容器编号
      • --format 列出其他信息 docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.CreatedAt}}\t{{.Status}}\t{{.Names}}"
  • 退出方式

    • exit # run进去的容器,exit退出,容器停止
    • ctrl+p+q # run进去的容器,ctrl+p+q退出,容器不停止
  • docker start 容器ID或容器名 # 启动已停止运行的容器

  • docker restart 容器ID或容器名 # 重启容器

  • docker stop 容器ID或容器名 # 停止容器

  • docker kill 容器ID或容器名 # 强制停止容器

  • docker rm 容器ID或容器名 # 删除已停止的容器

    • -f # 强制删除
    • docker rm -f $(docker ps -qa) # 删除所有
    • docker ps -aq | xargs docker rm # 删除所有
  • docker logs XXX # 查看容器日志

    • -f # 持续更新
    • -t # 加入时间戳
    • --tail 0 从倒数0行开始
    • 示例 docker logs -ft --tail 10 xxx
  • docker top XXX # 查看docker内部运行的进程

  • docker port XXX port # 查看容器映射端口

  • docker inspect XXX # 查看内部细节

    • 查看挂载目录 docker inspect container_id | grep Mounts -A 20
    • --format 可以格式化细节 docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
  • docker exec -it 容器ID bash地址 # 重新进入交互式

  • docker attach XXX # 重新进入容器

    • attach与exec的区别
      • attach直接进入容器启动的终端,不会启动新的进程,用exit退出,会导致容器的停止。
      • exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
      • 推荐使用exec,退出容器终端,不会导致容器的停止。
  • docker cp 容器ID:容器内部路径 目标外部路径 # 拷贝容器内部文件到外部

  • docker export 容器ID > xxx.tar # 导出容器 对应import

  • cat xxx.tar | docker import - 镜像用户/镜像名:版本号 # 导入容器

  • docker commit -m="描述" -a="作者" 容器ID 要创建的目标镜像名:[标签名] # 基于某容器实例,创建新的镜像

数据卷

数据卷是在一个或者多个容器内被选定的目录,可以绕过分层的联合文件系统(Union File System),为Docker提供持久数据或者共享数据。

这意味着对卷的修改会直接生效,并绕过镜像,当提交或者创建镜像时,卷不被包含在镜像里。卷也可以在容器间共享。即便容器停止,卷里的内容依旧存在。

目录后面加上rw或者ro来指定容器内目录的读写状态。

前面是宿主机目录:后面是容器内目录:最后是读写状态

  • docker -v /var/www/website:/var/www/html/website:ro xxx

建议

创建临时容器
通过Dockerfile文件定义的镜像,产生的容器尽可能的是临时的。所谓的临时,意思是,容器可停止,销毁,重建和替代为最小设置和配置。

不要安装不必要的包
为了降低复杂性,依赖性,文件大小和构建时间,请避免安装额外的或不必要的软件包,因为它们可能“很好”。例如,您不需要在数据库镜像中包含文本编辑器。

容器启动内存限制

Docker

1 启动容器时限制容器内存
docker run -m 4g --memory-swap -1  2 限制已启动容器的内存
docker stop containerId
docker update containerId -m 4g  --memory-swap -1
docker start containerId3 查询是否配置成功
docker inspect containerId

备注:命令详解

--memory  或  -m  限制容器的内存使用量(如10m,200m等)
--memory-swap # 限制内存和 Swap 的总和,不设置的话默认为--memory的两倍
'''
如果只指定了 --memory 则 --memory-swap 默认为 --memory 的两倍
如果 --memory-swap 和 --memory 设置了相同值,则表示不使用 Swap
如果 --memory-swap 设置为 -1 则表示不对容器使用的 Swap 进行限制
如果设置了 --memory-swap 参数,则必须设置 --memory 参数
后期 update --memory 时数值不能超过 --memory-swap 的值,否则会报错 Memory limit should be smaller than already set memoryswap limit参考:https://blog.csdn.net/m0_67266585/article/details/126580997
'''

docker-compose

  airflow-triggerer:<<: *airflow-commoncommand: triggererhealthcheck:test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"']interval: 10stimeout: 10sretries: 5restart: alwaysdeploy:resources:limits:cpus: "1.00"memory: 1Greservations:memory: 200M

查看资源使用情况

docker stats

虚悬镜像

docker image ls -f dangling=true # 查看所有虚悬镜像

docker image prune # 删除所有虚悬镜像

在 Docker 中删除 image 时有时会遇到类似

Error response from daemon: conflict: unable to delete 6ec9a5a0fc9f (cannot be forced) - image has dependent child images

这样的错误,原因是有另外的 image FROM 了这个 image,可以使用下面的命令列出所有在指定 image 之后创建的 image 的父 image

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)

Docker-Compose 容器编排服务

使用一个文件来描述所有容器如何运行

tomcat

sudo docker run -d -p 8090:8080 --name my_tomcat -v /data/app/tomcat:/usr/local/tomcat/webapps -v /data/logs:/data/logs tomcat:8.5-jdk8-corretto

容器镜像服务

阿里云容器镜像服务申请实例,创建仓库。

阿里云的机器可以按照地区使用专用网络
registry-vpc.cn-hangzhou.aliyuncs.com/sajor/project

普通网络命令:

  1. 登录阿里云Docker Registry
docker login --username=13171706376 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

  1. 从Registry中拉取镜像
    可以修改 vi /etc/docker/daemon.json 增加阿里云配置
{"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}
docker pull registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]
  1. 将镜像推送到Registry
docker login --username=13171706376 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/sajor/project:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

  1. 选择合适的镜像仓库地址
    从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

  1. 示例
    使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

Docker修改存储路径教程(硬盘容量不够)

首先,我们需要了解当前Docker的存储路径。你可以通过运行以下命令来获取当前的存储路径:

docker info | grep "Docker Root Dir"

在修改存储路径之前,我们需要先停止并删除Docker服务。运行以下命令来停止并删除Docker服务:

sudo systemctl stop docker
sudo systemctl disable docker

接下来,我们需要修改Docker的配置文件。打开Docker的配置文件/etc/docker/daemon.json,并添加以下内容:

{"data-root": "/path/to/new/docker/directory"
}

迁移Docker默认目录,在修改配置文件后,我们需要将现有的Docker目录迁移到新的存储路径。运行以下命令来迁移Docker目录:

sudo rsync -aP /var/lib/docker/ /path/to/new/docker/directory

确保将/path/to/new/docker/directory替换为你在上一步中设置的新的存储路径。

完成上述步骤后,我们可以重新启动Docker服务以使新的存储路径生效。运行以下命令来重新启动Docker服务:

sudo systemctl start docker

写时复制 copy on write

只读镜像层都是只读的,且以后永远不会发生变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶层添加一个读写层。这个读写层加上其下面的镜像层以及一些配置信息,就构成了一个容器。

如果想修改某文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本仍然存在,但是已经被读写层中的该文件副本所隐藏。

相关文章:

Docker教程

docker 安装 官方文档 wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker your-user sudo usermod -aG docker ${USER} newgrp docker # 更新docker用户组 cat /etc/group | grep docker docker --version 使用非root用户管理 帮助启动类 命令 system…...

数据结构:二叉树

数据结构&#xff1a;二叉树 文章目录 数据结构&#xff1a;二叉树1.一些特殊的二叉树1.满二叉树2.完全二叉树 2.手动创建一颗二叉树3.二叉树深度优先遍历4.二叉树层序遍历5.二叉树基础操作1.创建二叉树2.二叉树节点个数3.二叉树叶子节点个数4.二叉树的高度5.二叉树第k层节点个…...

HTTP超文本传输协议

原文链接&#xff1a; 1.5 万字 40 张图解 HTTP 常见面试题&#xff08;值得收藏&#xff09;_图解http 小林-CSDN博客https://blog.csdn.net/qq_34827674/article/details/124089736?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170521531616777224478386%252…...

视频SDK的技术架构优势和价值

为了满足企业对于高质量视频的需求&#xff0c;美摄科技推出了一款强大的视频SDK&#xff08;软件开发工具包&#xff09;&#xff0c;旨在帮助企业轻松实现高效、稳定的视频功能&#xff0c;提升用户体验&#xff0c;增强企业竞争力。 一、美摄视频SDK的技术实现方式 美摄视…...

Invalid bound statement (not found)(xml文件创建问题)

目录 解决方法&#xff1a; 这边大致讲一下我的经历&#xff0c;不想看的直接点目录去解决方法 今天照着老师视频学习&#xff0c;中间老师在使用动态SQL时&#xff0c;直接复制了一份&#xff0c;我想这么简单的一个&#xff0c;我直接从网上找内容创建一个好了&#xff0c;…...

正则表达式2 常见模式

继上次的正则表达式速攻1/2-CSDN博客 还有一些常见的匹配模式可以直接使用 电子邮箱 xxxxxx.域名 的情况 \b[A-Za-z0-9._%-][A-Za-z0-9.-]\.[A-Z|a-z]{2,}\bhttp或者https网址 的情况 http[s]?://(?:[a-zA-Z]|[0-9]|[$-_.&]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F…...

前端对接电子秤、扫码枪设备serialPort 串口使用教程

因为最近工作项目中用到了电子秤&#xff0c;需要对接电子秤设备。以前也没有对接过这种设备&#xff0c;当时也是一脸懵逼&#xff0c;脑袋空空。后来就去网上搜了一下前端怎么对接&#xff0c;然后就发现了SerialPort串口。 Serialport 官网地址&#xff1a;https://serialpo…...

LeeCode前端算法基础100题(18)整数转罗马数字

一、问题详情: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1…...

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…...

华为数通HCIA题库(750题)

完整题库在这里&#xff1a;华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧&#xff0c;其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是&#xff08; )。 A.它是一个单播MAC地址 B.它是一个广播…...

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

CCF认证+蓝桥杯习题训练

贪心 *上取整公式* *代码展示* #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 1e5 10;typedef long long LL;int v[N] , a[N];int main() {int n , d;cin >> n >> d;for(int i 1 ; i < n…...

vue前端开发自学基础,动态切换组件的显示

vue前端开发自学基础,动态切换组件的显示&#xff01;这个是需要借助于&#xff0c;一个官方提供的标签&#xff0c;名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…...

16.桥接模式

桥接模式 介绍 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合的方式来实现&#xff0c;而不是继承。桥接模式通过将抽象和实现解耦&#xff0c;从而实现抽象和实现的分离&#xff0c;使得系统更加…...

【网络安全】【密码学】【北京航空航天大学】实验一、数论基础(上)【C语言和Java实现】

实验一、数论基础&#xff08;上&#xff09; 一、实验目的 1、通过本次实验&#xff0c;熟悉相关的编程环境&#xff0c;为后续的实验做好铺垫&#xff1b; 2、回顾数论学科中的重要基本算法&#xff0c;并加深对其的理解&#xff0c;为本学期密码学理论及实验课程打下良好…...

Go语言的sync.Pool如何使用?使用场景具体有哪些?

sync.Pool 是 Go 标准库中提供的一个对象池&#xff08;Object Pool&#xff09;的实现。对象池是一种用于缓存和复用对象的机制&#xff0c;可以在一定程度上减轻内存分配的开销。sync.Pool 专门用于管理临时对象&#xff0c;适用于一些需要频繁创建和销毁的短暂对象&#xff…...

MySQL单表查询练习题

一、创建表的素材 表名&#xff1a;worker——表中字段均为中文&#xff0c;比如&#xff1a;部门号、工资、职工号、参加工作等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 …...

Spring MVC中@Controller和@RestController的区别

Controller 和 RestController 是 Spring MVC 中用于处理 HTTP 请求的注解&#xff0c;它们有以下区别&#xff1a; 返回值处理方式&#xff1a; Controller 用于定义一个传统的 Spring MVC 控制器&#xff0c;它的方法通常返回视图名称或 ModelAndView 对象&#xff0c;由视图…...

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…...

Edge浏览器入门

关于作者&#xff1a; CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP&#xff0c;带领团队单日营收超千万。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业化变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...