Docker 学习指南1

这篇具有很好参考价值的文章主要介绍了Docker 学习指南1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker容器 笔记

相关知识介绍

什么是镜像

镜像是一种轻量级,可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置以来打包好形成一个可交付的运行环境(包括代码,运行时需要的库,环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

为什么Docker比较比VM快

(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

常用命令

帮助启动类启动命令

启动命令

systemctl start docker

关闭命令

systemctl start docker

开机启动

systemctl enable docker

重启

systemctl restart docker

停止

systemctl stop docker

卸载

yum remove docker-ce docker-ce-cli containerd.io

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

帮助

docker --help

镜像命令

列举前5个

docker search --limit 5 redis

指定版本号,获取镜像

docker pull redis:6.0.8

删除命令

docker rmi 某个XXX镜像名字ID

docker rmi -f 强制删除某个XXX镜像名字ID

docker rmi -f $(docker images -qa) 删除全部

查看镜像/容器/数据卷所占用的空间

docker system df

什么是虚悬镜像

在Docker中,悬浮镜像(也称为虚悬镜像或悬挂镜像)是指那些已经创建但没有被任何容器引用的镜像。这些镜像通常是在构建新镜像或删除容器时产生的,它们是一些没有被引用的中间层镜像。

每次构建镜像时,Docker会创建一系列的镜像层,每一层代表镜像的一个步骤或操作。如果在构建过程中的某一步骤出现错误,或者构建后没有将镜像推送到远程仓库,那么这些中间层就可能成为虚悬镜像。此外,当使用docker build命令构建镜像时,如果新旧镜像同名,旧镜像名称被取消,也可能出现仓库名、标签均为none的镜像,这类无标签镜像也被称为虚悬镜像。

虚悬镜像的特点是它们“悬浮”在Docker中,没有被任何容器所使用,而且也不会被Docker清理工具自动删除。因此,需要手动清理这些镜像以释放存储空间。可以使用docker image prune或docker image rm命令来删除虚悬镜像。

容器命令

启动容器命令
OPTIONS说明(常用):有些是一个减号,有些是两个减号

–name=“容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort //宿主机端口:容器端口
ip::containerPort…

以交互模式启动一个容器

使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash

列出当前所有正在运行的容器

docker ps [OPTIONS]

退出容器

exit;

ctrl + q + p; 退出容器,但不会停止容器

强制停止容器(但不会删除)

docker kill 容器ID或者容器名

删除停止容器

docker rm 容器ID

docker rm -f $(docker ps -a -q)

一般情况下,我们希望docker的服务是在后台运行的,我们可以通过 -d 指定容器的后台运行模式

docker run -d 容器名

使用镜像centos:latest以后台模式启动一个容器
docker run -d centos

问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如
service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。

所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断

docker run -it centos

docker run -d redis ????

查看日志

docker logs (有相关可视化工具 嘻嘻)

进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell ==> docker exec -it ubuntu /bin/bash

重新进入docker attach 容器ID

上述两个区别

attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止

exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止 推荐使用

从容器内拷贝文件到主机上

docker cp 容器ID:容器内路径 目的主机路径

docker cp 70e63eea3c61:/tmp/a.txt /opt/module/

导入和导出容器

export 导出容器的内容留作为一个tar归档文件

import 从tar包中的内容创建一个新的文件系统再导入为镜像

案例

docker export 容器ID > 文件名.tar

cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号 (这里的版本号可以随便写,不影响程序)

联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??…

最大的一个好处就是 - 共享资源,方便复制迁移,就是为了复用

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动-无论添加,删除,还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

Docker镜像commit操作补充

  1. apt-get update 更新linux包管理工具

  2. apt-get -y install vim 安装vim

  3. docker commit提交容器副本使之成为一个新的镜像: docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

    docker commit -m=“add vim cmd” -a=“Eric” f98857dfb14b myubuntu:1.1

本地镜像发布到阿里云

$ docker login --username=xxxx@qq.com xxxx.com 
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun_yupi:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun:[镜像版本号]

从Registry中拉取镜像

$ docker pull registry.cn-hangzhou.aliyuncs.com/fly_rui/aliyun:v0.0.1

数据卷

是什么

先来看看Docker的理念:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

能干嘛

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

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

容器的持久化

容器间继承+共享数据

就相当于一个共享文件夹

容器内添加

直接命令添加

docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash //“:”代表映射:容器内的数据备份+持久化到本地主机目录 一个v可以挂载多个

权限管理

读写(默认)

docker run -it -v /宿主机目录:/容器内目录:rw centos /bin/bash

只读(容器内部只读)

docker run -it -v /宿主机目录:/容器内目录:ro centos /bin/bash

容器卷之间的继承

docker run -it --privileged=true -v /opt/module/host_data:/tmp/docker_data --name=u1 ubuntu

docker run -it --privileged=true -volumes-from u1 --name u2 ubuntu

查看容器挂载目录

docker inspect 容器ID

安装MySQL

简单版

docker pull mysql

docker run -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

docker exec -it a02dcc3c20a2 /bin/bash

mysql -uroot -p123456

这样我们就有了一个容器版的MySQL

docker run -d -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQLROOTPASSWORD=123456 -d mysql:5.7

命令说明:

-d 后台运行

-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。
–name mysql:运行服务名字
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d

-v /zzyyuse/mysql/data:/var/lib/mysql

-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。

-e MYSQLROOTPASSWORD=123456 以root用户启动并设置密码为123456

安装redis

下载最新的 redis 镜像
docker pull redis

启动镜像
docker run -p 6379:6379 -v /opt/module/redis/data:/data -v /opt/module/conf/redis.conf:/etc/redis/redis.conf -d redis:6.0.8 redis-server /etc/redis/redis.conf --appendonly yes文章来源地址https://www.toymoban.com/news/detail-835204.html

到了这里,关于Docker 学习指南1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习学习】第一天:入门指南

    引言 当今社会,机器学习技术已经被广泛应用于许多领域,如自然语言处理、图像处理和金融分析等。然而,机器学习这一领域需要掌握大量的数学知识和编程技能,因此对于初学者来说,可能会感到非常困难。本文将为初学者提供一份机器学习入门指南,帮助他们了解机器

    2024年02月02日
    浏览(39)
  • 【深度学习】深度强化学习初学者指南

            GAN(Generative Adversarial Networks)是一种深度学习模型,它由两个神经网络组成:一个生成网络和一个判别网络。生成网络学习如何生成类似于给定数据集的新数据,而判别网络则学习如何区分生成网络生成的数据和原始数据。这两个网络相互竞争,使得生成器越来

    2024年02月13日
    浏览(40)
  • Maven进阶学习指南

    当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中。但当一个大的项目同时需要依赖各种各样的外部服务,就存在着配置繁琐、依赖冲突等问题,因此可以通过maven来完成对应的

    2024年02月11日
    浏览(37)
  • 现代C++学习指南-具体类

    类作为C++中重要的概念之一,有着众多的特性,也是最迷人的部分! 类是一个加工厂,开发者使用C++提供的各种材料组装这个工厂,使得它可以生产出符合自己要求的数据,通过对工厂的改造,可以精细控制对象从出生到死亡的各种行为,真正达到我的代码我做主的境界。

    2024年02月09日
    浏览(32)
  • 现代C++学习指南-标准库

    在[上一章](https://www.yuque.com/docs/share/adb5b1e4-f3c6-46fd-ba4b-4dabce9b4f2a?# 《现代C++学习指南-类型系统》)我们探讨了C++的类型系统,并提出了从低到高,又从高到低的学习思路,本文就是一篇从高到低的学习指南,希望能提供一种新的视角。 编程语言一般分为两个部分,一部分是语

    2024年02月09日
    浏览(31)
  • 实战应用Android进阶学习指南

    作者:禅与计算机程序设计艺术 在软件开发的历史上,从最初的手工编码到后来的脚本编程、GUI编程、打包工具、编译器等各种工具的出现,使得程序员可以将复杂的代码转换成可执行的程序,实现了快速开发、迭代更新、快速部署等效率上的优势。随着互联网的普及、手机

    2024年02月08日
    浏览(48)
  • 现代C++学习指南-方向篇

    C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为

    2024年02月08日
    浏览(34)
  • 现代C++学习指南-类型系统

    在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统。 在进入类型系统之前,我们应该先达成一项共识——尽可能使用C++的现代语法。众所周知,出于兼容性的考虑,C++中很多语法都是合

    2024年02月08日
    浏览(39)
  • 【ARM学习】Cortex- A系列程序员学习指南

    ARM处理器无处不在。 移动电话、个人计算机、电视或汽车。在大约30亿元的微处理器总出货量中,x86架构占据一个非常小的位置(但仍然非常有利可图的)。 ARM处理器不是一个单一的处理器,而是 一个拥有相同指令集和程序员模型的同一处理器家族 ,并有 一定程度的向后兼

    2024年02月01日
    浏览(43)
  • 深度学习调参指南

    1. 选择合适的模型架构 模型的结构(层数和宽度),参数配置,尽量用已经有效的模型 2. 选择优化器 针对具体的问题,从选择常用的优化器开始,进行比较 3. 选择BatchSize 1). Batch Size决定训练速度,但是不影响验证集性能 2). 通常选择最大可支持的Bacth Size 3). 增加Batch Size减少训

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包