docker学习笔记

一.docker出现的原因

  1. 环境一致性问题:在不同的开发环境和生产环境中,可能会出现因为系统差异、依赖关系、库版本等问题导致应用无法正常运行。Docker 通过容器技术,为应用提供了一个一致的运行环境,从而解决了这个问题。

  2. 资源利用率问题:传统的虚拟化技术需要为每个虚拟机运行一个完整的操作系统,这会消耗大量的系统资源。Docker 容器直接运行在宿主机的内核上,不需要额外的操作系统层,因此可以更加高效地利用系统资源。

  3. 快速部署和扩展:Docker 容器可以快速创建和销毁,可以很方便地实现应用的快速部署和扩展。

  4. 持续集成和持续部署:Docker 可以很好地与现有的持续集成和持续部署工具集成,实现自动化测试、构建和部署。

  5. 微服务架构:随着微服务架构的流行,Docker 提供了一种轻量级、可扩展的方式来部署和管理微服务。                                                                                                                                

总之,Docker 的出现,极大地简化了应用的开发、测试和部署过程,提高了开发效率,降低了运维成本,Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

概括:docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

传统虚拟机技术是一种将一台物理计算机分割成多个虚拟的计算环境的技术。每个虚拟机(VM)都运行自己的操作系统,并且可以在物理硬件上独立运行,仿佛它是唯一的操作系统一样。以下是传统虚拟机技术的一些关键特点:
1. 硬件虚拟化:虚拟机管理程序(如VMware ESXi、Microsoft Hyper-V、KVM、Xen等)模拟硬件资源,如CPU、内存、网络和存储,以便为每个虚拟机提供一个隔离的运行环境。
2. 操作系统独立:每个虚拟机都可以运行不同的操作系统,例如Windows、Linux、macOS等,这为不同类型的应用提供了灵活性。
3. 资源分配:虚拟机允许管理员为每个虚拟机分配特定的CPU、内存和存储资源,确保不同应用和服务之间的资源隔离。
4. 易于迁移和备份:虚拟机通常可以很容易地迁移到其他物理服务器上,这使得硬件维护和升级变得更加灵活。同时,虚拟机镜像的备份和恢复也相对简单。
5. 安全隔离:虚拟机之间是隔离开的,一个虚拟机的崩溃或被攻击不会影响到其他虚拟机。
然而,传统虚拟机技术也存在一些缺点:
6.资源开销:每个虚拟机都需要运行完整的操作系统,这会占用较多的CPU、内存和存储资源。
7. 启动时:虚拟机启动可能需要较长时间,因为需要加载和初始化整个操作系统。
8.性能影响:由于虚拟化层的存在,虚拟机的性能可能不如物理机。


相比之下,容器技术(如Docker)提供了一种更轻量级的方法来打包和部署应用,容器共享宿主机的操作系统内核,不需要为每个应用运行单独的操作系统,因此容器在启动速度和资源效率方面优于虚拟机。然而,虚拟机仍然在需要完全隔离和运行不同操作系统的场景中发挥重要作用。

由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:
Linux容器(Linux Containers,缩写为 LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

比较了 Docker 和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

docker的基本组成(镜像,容器,仓库)

如:redis r1 = docker run

redis 就是一个镜像

r1 就是一个容器(redis r1 = docker run这一个整体就是一个容器实例)

1.Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。

2.容器

 从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

 从镜像容器角度
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

3.仓库

仓库(Repository)是集中存放镜像文件的场所

二.docker 的安装(docker是基于linux内核的)

安装在linux中的centos7环境中,要确保在该环境中能连接到外面的网络(ping www.baidu.com)

1.在安装前,要清理docker的旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.安装gcc相关

安装gcc

yum -y install gcc

安装gcc-g++

yum -y install gcc-g++

安装管理yum仓库和软件包的实用工具----yum-utils

yum install -y yum-utils

安装阿里镜像仓库

阿里云-->产品-->容器-->容器镜像服务ACP-->管理控制台-->镜像工具-->镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rjz4tji1.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装数据缓存,加快软件包搜索和安装的速度

yum makecache fast

安装存储库

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动Docker

sudo systemctl start docker

验证Docker Engine安装是否成功,方法是运行 hello-world图像

sudo docker run hello-world

三.开始学习docker的操作

三.一:启动类命令

1.启动docker : systemctl start docker

2.停止docker: systemctl stop docker

3.重启docker: systemctl restart docker

4.查看docker的状态: systemctl status docker

5.docker开机自启动 : systemctl enable docker

6.查看docker的概要信息: docker info

7.查看docker总体帮助文档: docker --help

8.查看docker命令帮助文档: docker 具体命令 --help

三.二镜像命令

REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号,latest表示最新版,可以手动指定版本号
IMAGE ID:镜像ID,唯一
CREATED:镜像创建的时间
SIZE:镜像的大小

NAME:镜像名称

DESCRIPTION:镜像说明

STARS:点赞数

OFFICIAL:是否是官方镜像,有ok标识的表示官方镜像

AUTOMATED:是否是自动构建的,有ok标识的表示自动构建


同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,docker 将默认使用 最新的 镜像

1.docker images : 列出本地主机上的镜像

使用语法:docker images [OPTIONS] [REPOSITORY[:TAG]]

 OPTIONS:

-a :列出所有的镜像

-f :过滤规则

接下来的命令不再详解,详解可以使用查看docker命令帮助文档: docker 具体命令 --help学习

2.docker search 镜像名 :根据镜像名找到指定的镜像,

以下是redis的排名前五的镜像

3.docker pull  镜像名 : 根据给定的镜像名下载指定的镜像

以下是下载redis的实例

当我们下载镜像时,有小概率会产生虚悬镜像,也就是REPOSITORY和TAG都是<none>的镜像,这一类的镜像没有用,需要删除它

4.docker system df : 显示docker磁盘使用情况

5.docker rmi 镜像名 :根据给定的镜像名删除指定的镜像

四.容器命令

先决条件

容器是镜像的实例,所以在操作容器前,需要有对应的镜像,容器才是真正干活的对象,也就是需要进入到容器内部进行操作

本次以ubuntu为例

下载ubuntu镜像

docker pull ubuntu

四.一:两种运行容器的方法(进入容器内部)

1.docker run ubuntu
  • 这个命令会创建一个 Ubuntu 容器,并直接运行容器的默认命令,通常情况下,默认命令是 /bin/bash,但是如果没有指定 -it 参数,则命令执行后,容器会在执行完默认命令后立即退出。
  • 这种方式启动的容器,用户无法进行交互式操作,也就是说,你无法在容器内执行命令或者与容器进行交互。
2.docker run -it ubuntu /bin/bash
  • it 参数是两个参数的简写,-i 保证容器标准输入(STDIN)是开启的(以交互模式运行容器),-t 为容器重新分配一个伪输入终端。
  • /bin/bash 是要在容器内执行的命令,它提供了一个交互式的 shell,允许用户与容器进行交互。
  • 使用这个命令,用户可以启动一个容器,并且有一个命令行界面可以进行各种操作,就像在本地机器上操作一样。
  • -p :手动指定端口号
  • -P:系统随机分配端口号
  • --name="指定的容器名"
  • -d:获取后台正在运行的容器id

两者操作的对比结果

很明显,docker run ubuntu 只是创建了一个ubuntu的容器(实例),并没有进入到ubuntu容器内部,也就是没有产生交互效果

而 docker run -it ubuntu 

  1. 分配伪终端-t 参数告诉 Docker 分配一个伪终端,并绑定到容器的标准输入上。这样,当你进入容器时,你将能够看到一个终端界面,就像你在本地机器上打开了一个终端一样。

  2. 保持标准输入打开-i 参数告诉 Docker 保持标准输入(STDIN)打开,即使没有附加终端。这意味着你可以在容器运行期间向其发送输入

3.docker ps :列出正在运行的容器实例

4.在容器内部退出:exit  :在退出容器的同时也会杀死所在容器的线程 前提条件是执行了docker run 命令后进入的容器(而对于docker exec 命令无效)

5.在容器内部退出:快捷键 :ctrl+p+q : 在退出容器的同时保证容器的存活

6.启动已经停止运行的容器 :docker start  容器id或者容器名

7.重启容器:docker restart 容器id或者容器名

8.停止容器: docker stop 容器id或者容器名

9.强制停止容器: docker kill 容器id或者容器名

10.删除已经停止的容器 : docker rm 容器id或者容器名

一次性删除多个容器实例

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

2.docker ps -a -q | xargs docker rm

警告:删除操作是十分危险的事情,一定要再三思虑,或者干脆不删,在实际工作中,对公司的容器或者仓库里面的镜像不要去有删除的操作

6.两种启动容器实例的对比
前台式启动容器

Docker前台启动容器的代码通常是使用 docker run 命令时,不添加 -d 选项(表示后台运行)

  1. 日志丢失:如果容器意外退出,没有记录日志的话,可能会导致日志信息丢失。
  2. 不适合长期运行:对于需要长期运行的服务,如web服务器,不适合前台启动,因为它们需要在后台运行。
  3. 资源管理:在容器数量较多时,前台启动会导致管理困难,因为每个前台运行的容器都需要一个独立的终端。

这里开了两个命令窗口用来演示

这是前台式启动redis(2.新建会话)

然后在1.新建会话中查看正在运行的容器

最后,前台式启动redis所在2.新建会话中,不小心按到ctrl+c导致redis服务停止,分别在去观察两个会话的变化

后台式启动容器(守护进程式启动容器服务)

Docker后台启动容器通常使用 docker run 命令时添加 -d 选项

docker run -d 镜像名或者镜像id

在实际使用中,后台启动是生产环境中常见的运行方式,因为它可以保持服务的持续运行,并且不会影响宿主机上的其他操作。对于需要监控和日志记录的场景,可以使用 Docker 的日志驱动来实现日志的收集和存储。

两者对比

调试容器,与容器交互,实时输出这一类,请采用前台式启动

后台运行,生产环境,持久化日志这一类请采用后台式启动

7.查看容器日志 :docker logs 容器名或者容器id

这个命令会显示容器的标准输出(STDOUT)和标准错误输出(STDERR)。

8.查看容器内部的运行进程:docker top 容器名或者容器id

 Docker 容器内部的运行进程,可以使用 docker top 命令。

9.查看容器内部细节:docker inspect 容器名或者容器id

 要查看 Docker 容器的详细信息,可以使用 docker inspect 命令。这个命令会返回一个 JSON 格式的数组,包含了容器的配置和状态信息。

一部分信息

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

1.docker exec -it 容器名或者id  /bin/bash     (开发中常用)

要进入正在运行的 Docker 容器并以命令行交互,可以使用 docker exec 命令。这个命令可以在运行中的容器内执行任意命令。以下是如何使用 docker exec 进入容器的示例:

docker exec -it CONTAINER_NAME_OR_ID /bin/bash

这里的选项说明如下:

  • -i:即使没有附加任何终端,也保持 STDIN 打开。
  • -t:分配一个伪终端。
  • CONTAINER_NAME_OR_ID:容器名或 ID。
  • /bin/bash:在容器中运行的命令。这里使用的是 Bash shell,但你可以根据容器内安装的 shell 来调整。

2.docker  attach  容器名或者id  

使用 docker attach 时,终端会与容器的控制台同步。在终端上的输入会被发送到容器中,容器的输出也会显示在终端上。这适用于需要与容器进行交互的场景,比如,运行一个交互式命令或监控容器的实时输出。

docker attach 的缺点,有:

  • 当退出 docker attach 会话时,如果容器没有其他前台进程在运行,容器可能会停止。
  • 如果容器已经在生成大量输出,那么在附加到容器时,可能会错过一些早期的输出,或者很难阅读滚动过的输出。
  • docker attach 不支持多个会话同时附加到同一个容器,这在多用户或自动化场景中可能会有限制。

因此,对于需要长期监控或频繁交互的场景,docker exec 通常是一个更好的选择,因为它允许在不影响容器运行的情况下执行命令和脚本。

11. docker cp 容器名或者容器id:容器内文件的路径   存放文件的目的主机路径   
作用:把容器内的文件拷贝到主机上(容器到linux系统上),常用于数据的备份
12.容器的导入与导出
1.  容器的导出: docker export 容器名或者容器id  >  文件名.tar   

容器的导出:把一个容器打包成一个以.tar为后缀的文件, 在其他机器上在打开该.tar文件,会得到与打包前容器一模一样的新容器

2.容器的导入 : cat   文件名.tar  | docker import  -  镜像用户/镜像名:镜像版本号

导出的 tar 包可以使用 docker import 命令导入为镜像。导入的镜像可以用来创建新的容器

五.docker的架构以及实现原理

1. docker架构图

Docker 在运行时分为docker客户端 和 Docker 引擎(Docker 守护进程 ,我们日常使用各种 docker 命令,就是在使用 客户端工具 与 Docker 引擎 进行交互。

2.Client客户端

Docker 是一个客户端-服务器(C/S)架构程序。

Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。

Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程(服务端)

3.docker_host(docker引擎)

Docker 引擎是 Docker 平台的核心组件,它是一个客户端-服务器应用程序,包括以下几个主要部分:
1. Docker 守护进程(Docker Daemon):
   - Docker 守护进程在后台运行,它是 Docker 引擎的服务器部分。
   - 它负责监听 Docker API 请求并管理 Docker 对象,如镜像、容器、网络、存储卷等。
   - Docker 守护进程还负责构建、运行和分发 Docker 容器。
2. Docker 客户端(Docker Client):
   - Docker 客户端是 Docker 引擎的客户端部分,它向 Docker 守护进程发送命令。
   - 用户通过与 Docker 客户端交互来控制 Docker 守护进程。
   - Docker 客户端可以将用户的命令发送给本地或远程的 Docker 守护进程。
3. Docker registries:
   - Docker 注册表是存储 Docker 镜像的地方。Docker 引擎可以从注册表中拉取镜像用于创建容器。
   - 公共的 Docker 注册表如 Docker Hub 提供了大量的现成镜像,供用户下载和使用。私有注册表则用于存储组织内部的镜像。
4. Graph:
   - Docker 引擎中的 Graph 组件负责管理镜像和层的存储。它跟踪镜像的层以及它们如何组合成最终的镜像。
   - 当 Docker 引擎构建或运行容器时,它会查找所需的镜像层,如果本地不存在,则从注册表中拉取。
5. Driver:
   - Docker 引擎使用多种驱动程序来管理不同的方面,如执行驱动程序(execution drivers)、存储驱动程序(storage drivers)和网络驱动程序(network drivers)。
   - 执行驱动程序负责容器的生命周期管理,如创建、运行和停止容器。
   - 存储驱动程序管理镜像层和容器层的存储,例如 `aufs`、`overlay2`、`devicemapper` 等。
   - 网络驱动程序负责容器网络的配置和管理。
6. Libcontainer:
   - Libcontainer 是一个 Docker 引擎使用的库,它直接与 Linux 内核的命名空间和 cgroups 功能交互,用于创建和管理容器的运行环境。
   - 它替代了 Docker 早期版本中的 LXC 依赖,提供了一个更轻量级、更高效的容器管理方案。
7. Docker API:
   - Docker 引擎提供了一个 RESTful API,它允许外部程序和工具与 Docker 守护进程交互。
   - Docker 客户端使用这个 API 与 Docker 守护进程通信。
8. Docker CLI:
   - Docker 命令行界面(CLI)是 Docker 引擎的一部分,它提供了一个用户界面,允许用户直接与 Docker 守护进程交互。


Docker 引擎的设计允许它扩展和集成其他工具和服务,如 Docker Compose、Docker Swarm 和 Kubernetes,这些工具和服务可以帮助管理应用程序的部署和运行
 

4.镜像

Docker镜像(Docker Image)是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于该环境开发的软件。它包含了运行某个软件所需的所有内容,如代码、运行时库、环境变量和配置文件等。Docker镜像可以看作是一个只读的模板,用于创建容器实例

Docker镜像具有分层的结构,每一层都代表一个特定的修改或添加(搭建积木,一个积木就是一层)。这种结构使得镜像可以高效地共享和重用,同时允许快速的部署和扩展。最底端的引导文件系统(bootfs)构成了镜像的基础,而之上的各层可以视为对基础镜像的修改或增强,形成所谓的父镜像和子镜像关系。

此外,Docker镜像具有只读性,一旦创建就不能直接修改,任何对镜像的更改都会生成新的镜像。这种特性确保了镜像的一致性和可靠性。

总的来说,Docker镜像为应用程序提供了一个一致的运行环境,避免了因环境差异导致的问题,从而提高了应用程序的可移植性和可维护性。

5.容器

容器(Container)是一种轻量级的虚拟化技术,它允许你在资源隔离的环境中运行应用程序及其依赖项,而无需启动完整的虚拟机。容器技术使得应用程序的部署和扩展变得更加快速、高效和灵活。

容器通过共享宿主机的操作系统内核,实现了轻量级的虚拟化。每个容器都拥有自己独立的文件系统、进程空间和网络空间,使得它们相互隔离。这种隔离性确保了容器之间的安全性,避免了应用程序之间的冲突和干扰。

六.镜像分层

Docker 支持通过扩展现有的镜像,创建新的镜像。

实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的(搭建需要的积木(文件),便是所谓的镜像分层)

从上图中可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。

这就是容器 Copy-on-Write 特性。

七.基于某一个基础镜像扩展某个功能后,提交容器副本,使之成为一个具有原基础镜像功能和新扩展功能的镜像(个人创建镜像)

Docker commit 命令用于将容器的文件系统更改保存为一个新的镜像。这个命令在容器运行期间,基于容器的当前状态创建一个新的镜像,从而允许用户保存对容器的修改,以便以后重用或分发。

八.容器数据卷

我发现有位博主的文章写得很好,于我学习很有帮助,这里我直接复制他得文章,

http://t.csdnimg.cn/uN3Ta

由图可知:容器数据卷是独立于容器之外的,类似于盘挂载在电脑上的效果

Docker 数据卷是一种广泛使用的工具,用于确保容器在运行时的数据持久性。Docker 数据卷是安装在 Docker 容器上的文件系统,用于保存正在运行的容器生成的数据。

docker数据卷绕过UFS,可以提供很多有用的特性:

  • 可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 更新数据卷不会影响镜像
  • 当该容器不再存在时,数据卷依然持续存在

数据卷

当我们创建一个数据卷时,它存储在 Docker 主机上的一个目录中。数据卷由 Docker 管理,并与主机的核心功能隔离。

给定的数据卷可以同时安装到多个容器中。当没有正在运行的容器使用数据卷时,数据卷仍然可供 Docker 使用,并且不会自动删除。

当我们挂载一个数据卷时,它可能是命名的或匿名的。匿名数据卷在首次挂载到容器时没有明确的名称,因此 Docker 给它们一个随机名称,保证在给定的 Docker 主机中是唯一的。除了名称之外,命名卷和匿名卷的行为方式相同

数据挂载(Bind mounts)

数据挂载可以存储在主机系统的任何位置。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。

当我们使用绑定挂载时,主机上的文件或目录被挂载到容器中。文件或目录由其在主机上的完整路径引用。该文件或目录不需要已经存在于 Docker 主机上。

数据挂载非常有效,但它们依赖于主机的文件系统,具有可用的特定目录结构。如果我们想开发新的 Docker 应用程序,那么考虑使用命名卷而不是绑定挂载。

临时挂载(tmpfs mounts)

tmp fs  挂载只存储在宿主机系统的内存中,从不写入宿主机系统的文件系统。它不会保存在磁盘上,无论是在 Docker 主机上还是在容器内。

tmp fs mount 可以在容器的生命周期内用于存储非持久状态或敏感信息。

 -v 或 --mount 标志

-v 或 --volume 标志用于独立容器,而 --mount 标志用于 swarm 服务。但是,从 Docker 17.06 开始,我们也可以将 --mount 与独立容器一起使用。

--mount更加明确和详细。最大的区别是 -v 语法将所有选项组合在一个字段中,而 --mount语法将它们分开。

Docker 新用户应该选择 --mount 参数。如果用户需要指定卷驱动程序选项,则使用 --mount 参数。

-v 或 --volume

以冒号字符 : 分隔,字段必须按正确的顺序排列。冒号: 前面是宿主机目录,后面为容器内目录(前宿主机,后容器)。宿主机目录不存在,会自动生成。

启动一个 ubuntu 容器,宿主机/usr/local/data 目录挂载到容器 /data 目录

$ docker run -it -v /usr/local/data:/data ubuntu:18.04 /bin/bash

在 Docker 中,-v 或 --volume 参数用于创建数据卷并挂载到容器中。这允许你在容器和宿主机之间,或者容器和容器之间共享文件或目录。-v 参数后面通常跟的是一个或多个宿主机上的文件或目录位置:容器内的挂载点的映射关系

–mount

由多个键值对组成,以逗号分隔,每个键值对由<key>=<value>组成。

--mount 语法比 -v 或 --volume 更冗长。

可以指定挂载类型,可以为 volume 、bind 或 tmpfs。

不指定挂载类型,默认是 volume 挂载类型。

挂载 volume 类型:

$ docker run -it --mount type=volume,source=my-data,destination=/data ubuntu:18.04 /bin/bash


挂载 bind 类型:

$ docker run -it --mount type=bind,source=/usr/local/data,destination=/data ubuntu:18.04 /bin/bash


挂载 tmpfs 类型

$ docker run -it --mount type=tmpfs,destination=/data ubuntu:18.04 /bin/bash


type :要挂载的类型。可以是 bind、volume 或 tmpfs。
source :要挂载的源。对于有名字的数据卷,这里是数据卷的名字。对于匿名卷忽略这个字段。
destination :要挂载的容器内路径。将文件或目录挂载在容器中的路径作为其值。 可能被指定为 destination、dst 或 target。
--mount挂载类型为 volume 时,source 指定的源为数据卷的名字。如果不指定source,则会默认挂载在 docker 数据卷的默认目录下(/var/lib/docker/volumes/)。

查看某容器的数据卷路径

docker inspect 容器id

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

数据卷的作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

配置容器卷

docker run  -it  --name=容器名 -v 宿主机目录文件:容器内目录文件  镜像名  /bin/bash

九.docker上的常规安装

大体步骤

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像     -->服务端的端口映射
  5. 停止镜像
  6. 移除镜像

以mysql为例

1(官网) .在dockerhub上搜索要下载的mysql

dockerhub:Docker Hub Container Image Library | App Containerization

或者直接在docker中找前五个

docker search mysql --limit 5

2.拉取镜像

官网:docker pull mysql      默认拉取最新的镜像

3.查看本地镜像

docker images

4.启动镜像

 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

--name :自定义容器名字

-e : 设置环境变量

-e MYSQL_ROOT_PASSWORD=密码 :访问数据库的密码

-d 参数表示“detached mode”,即后台运行模式

mysql:tag :是你要运行的 Docker 镜像的名称和版本号

查看是否启动成功

docker ps

进入mysql容器

docker exec -it 容器名或者容器id /bin/bash

在容器内部执行 mysql -uroot -p

在 Docker 中,mysql 容器是用来运行 MySQL 数据库的。当你想要连接到该容器中的 MySQL 服务器时,你可以使用 mysql 客户端命令行工具。命令 mysql -uroot -p 就是用来连接到 MySQL 服务器的标准命令,其中 -uroot 表示以 root 用户身份连接,-p 表示在连接时提示输入密码。

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system

所有MySQL命令的列表:
请注意,所有文本命令都必须位于第一行,并以“;”结尾
?         (\?)“帮助”的同义词。
clear(\c)清除当前输入语句。
connect(\r)重新连接到服务器。可选参数为db和host。
delimiter(\d)设置语句分隔符。
edit(\e)使用$EDITOR编辑命令。
ego(\G)向mysql服务器发送命令,垂直显示结果。
exit(\q)退出mysql。与退出相同。
go(\g)将命令发送到mysql服务器。
help(\h)显示此帮助。
nopage(\n)禁用寻呼机,打印到stdout。
notee(\t)不要写入outfile。
寻呼机(\P)设置pager[到页面]。通过PAGER打印查询结果。
print(\p)打印当前命令。
prompt(\R)更改mysql提示。
quit(\q)退出mysql。
rehash(\#)重新生成完成哈希。
source(\.)执行SQL脚本文件。将文件名作为参数。
status(\s)从服务器获取状态信息。
system(\!)执行系统

tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
query_attributes Sets string parameters (name1 value1 name2 value2 ...) for the next query to pick up.
 

tee(\T)设置outfile[to_outfile]。将所有内容附加到给定的outfile中。
use(\u)使用其他数据库。将数据库名称作为参数。
charset(\C)切换到另一个字符集。可能需要处理具有多字节字符集的binlog。
warnings(\W)在每条语句后显示警告。
nowarning(\w)不要在每条语句后都显示警告。
resetconnection(\x)清除会话上下文。
query_attributes为下一个要提取的查询设置字符串参数(名称1值1名称2值2…)。

查看mysql的版本

可以datagrip连接docker

中文乱码:请查看字符编码:

SHOW VARIABLES LIKE 'character%'

redis安装

  1. 创建容器卷的时候记得加入--privileged=true
  2. 在centOS宿主机下新建一个目录 /app/redis   mkdir /app/redis
  3. 将一个redis.conf文件模板拷贝进/app/redis目录下
  4. 在/app/redis目录下修改redis.conf文件  默认出厂的原始redis.con
  5. 使用redis镜像创建容器
  6. 测试redis-cli连接
  7. 证明docker启动使用了我们自己指定的配置文件
  8. 测试redis-cli连接

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值