Docker学习(一)-简介

news/2024/7/4 13:42:24

目录

一、概述

二、Docker安装

Docker安装前提条件

Docker的基本组成

Docker架构图

Docker安装

hello-word示例:

 三、Docker运行原理

四、Docker常用命令

1、帮助命令

2、镜像命令

3、容器命令

五、Docker镜像原理

Docker镜像加载原理

六、Docker容器数据卷


一、概述

Docker镜像的设计,使得Docker得以打破过去[程序即应用]的观念。透过镜像(images)将作业系统核心除外,运作应用程序所需要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”

Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的 基础上发展过来的。将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

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

虚拟机(virtual machine)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。

虚拟机的缺点:1.资源占用多2.冗余步骤多3.启动慢

由于虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC).

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

DevOps(开发自运维):一次构建、随处运行。好处是:更快速的应用交付和部署、更便捷的升级和扩缩容、更简单的系统运维、更高效的计算资源利用。

Docker、Mesos等容器技术使大规模动态调度成为可能。

Docker官网

Docker Hub仓库

Docker Hub存储镜像。

二、Docker安装

Docker安装前提条件

CentOS 6.5(64-bit)或更高的版本。

Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.10以上。

Docker运行在CentOS6.5或更高的版本的CentOS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。

查看内核:

uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)

uname -r

Docker的基本组成

1、镜像(image):Docker镜像(image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。

镜像与容器的关系,类似于类与对象的关系。

镜像---容器

类---对象;Person p1 = new Person();     

2、容器(container):Docker利用容器(container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

3、仓库(repository):集中存放镜像文件的场所。

仓库(repository)和创库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是Docker Hub  Docker Hub仓库、存放了数量庞大的镜像供用户下载。

国内的公开仓库包括阿里云、网易云等。

总结:

Docker本身是一个容器运行载体或称之为管理引擎。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。

image文件生成的容器实例,本身也是一个文件,称为镜像文件。

Docker架构图

Docker安装

CentOS安装Docker为例:
1、Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS版本,
然后安装相应的EPEL包。
yum install -y epel-release
2、CentOS 6.8安装docker
yum install -y docker-io
2.1、CentOS 7安装docker
yum install -y docker-ce
3、CentOS 6.8安装后的配置文件:/etc/sysconfig/docker
3.1、CentOS 7安装后的配置文件:/etc/docker/daemon.json
4、CentOS 6.8启动Docker后台服务:
service docker start
4.1、CentOS 7启动Docker后台服务
systemctl start docker
5、docker version 验证

阿里云镜像加速

aliyun镜像登录、找到[容器镜像服务 ACR]-->[镜像加速器]-->[加速器地址]

找到CentOS 7安装Dokcer后的配置文件:/etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://l60je4gn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

检查是否配置完镜像加速器
ps -ef|grep docker

参考doker-ce

hello-word示例:

docker run hello-world

------------------------------------------
[root@localhost docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
2db29710123e: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for docker.io/hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker run运行过程

 三、Docker运行原理

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱。

Docker容器虚拟机(VM)
操作系统与宿主机共享OS宿主机OS上运行虚拟机OS
存储大小镜像小,便于存储与传输镜像庞大
运行性能几乎无额外性能损失操作系统额外的CPU、内存消耗
移植性轻便、灵活、适应于Linux笨重,与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者
部署速度快速、秒级较慢,10s以上

四、Docker常用命令

1、帮助命令

1.验证docker是否安装完成等版本信息
docker version
2.docker自身信息描述(更详细)
docker info
3.docker所有命令帮助说明
docker --help

2、镜像命令

1.列出本地主机上的镜像
docker images
--例
[root@localhost ~]# docker images
REPOSITORY              TAG       IMAGE ID            CREATED             SIZE
docker.io/tomcat        latest    4ebba13e9156        2 months ago        680 MB
docker.io/zookeeper     latest    36c607e7b14d        3 months ago        278 MB
docker.io/hello-world   latest    feb5d9fea6a5        6 months ago        13.3 kB
[root@localhost ~]#
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义
不同的镜像。如果不指定一个镜像的版本标签,例如只使用hello-world,docker将默认
使用hello-world:latest镜像
----------
OPTIONS说明:
-a:列出本地所有的镜像(含中间镜像层)     [docker images -a]
-q:只显示镜像ID                         [docker images -q]
--digests:显示镜像的摘要信息            [docker images --digests]  多一列DIGEST信息
--no-trunc:显示完整的镜像信息           [docker images --no-trunc]
2.在docker Hub上查找镜像
docker search [OPTIONS] 镜像ID/名
----------
OPTIONS说明:
--no-trunc:显示完整的镜像描述                [docker search --no-trunc 镜像ID/名]
-s:列出收藏数不小于指定值的镜像              [docker search -s 30 镜像ID/名]
--automated:只列出automated build类型的镜像  [docker search --automated 镜像ID/名]
3.下载镜像
docker pull 镜像ID/名[:TAG]
docker pull tomcat  <==等价于==> docker pull tomcat:lastest
4.删除镜像文件
docker rmi 镜像ID/名
docker rmi -f 镜像ID/名:删除单个镜像 -f:强制删除
docker rmi -f 镜像ID1/名1 镜像ID2/名2:删除多个镜像
docker rmi -f $(docker images -qa):删除全部镜像

3、容器命令

1.拉取一个centos镜像演示
docker pull centos
2.新建并启动容器
docker run centos
----------
OPTIONS说明:
--name="容器新名字":为容器指定一个名称
-d:后台运行容器,并返回容器ID
-i:以交互式模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种方式
    1.ip:hostPort:containerPort
    2.ip::containerPort
    3.hostPort:containerPort
    4.containerPort
3.列出当前所有正在运行的容器
docker ps [OPTIONS]
----------
OPTIONS说明:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器            [docker ps -l]
-n:显示最近n个创建的容器         [docker ps -n 3]
-q:静默模式,只显示容器编号      [docker ps -lq]
--no-trunc:不截断输出
4.退出容器
两种退出方式
exit:容器停止退出
ctrl+P+Q:容器不停止退出
5.启动容器
docker start 容器ID/名
6.重启容器
docker restart 容器ID/名
7.停止容器
docker stop 容器ID/名
8.强制停止容器
docker kill 容器ID/名
9.删除已停止的容器
docker rm 容器ID
一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

重要

1.查看容器日志
docker logs -f -t --tail 5 容器ID
-t:是加入时间戳
-f:跟随最新的日志打印
--tail:数组显示最后多少条
2.查看容器内进程
docker top 容器ID
3.查看容器内部细节
docker inspect 容器ID
4.进入正在运行的容器并以命令行交互
docker exec -it 容器ID /bin/bash
5.重新进入正在运行的容器
docker attach 容器ID
attach:直接进入容器启动命令的终端,不会启动新的进程
exec:是在容器中打开新的终端,并且可以启动新的进程
6.从容器内拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径

五、Docker镜像原理

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

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都是4G左右,为什么docker中CentOS镜像才200M左右?

[root@localhost ~]# docker images
REPOSITORY              TAG      IMAGE ID            CREATED             SIZE
docker.io/tomcat        latest   4ebba13e9156        2 months ago        680 MB
docker.io/centos        latest   5d0da3dc9764        7 months ago        231 MB
[root@localhost ~]#

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs。

再想一个问题,window上下载tomcat.rar压缩包一般80-90M左右大小,但是在docker中的tomcat大小竟然是680MB.相对来说比centos系统还要大。为什么?

按照docker镜像底层分层的文件系统能解释通了。可以看下图之间的简单包含关系。

 为什么Docker镜像要采用这种分层结构呢?

最大的好处是-共享资源

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

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

Docker镜像commit操作补充

docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例演示:
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
62d67b5f059a        tomcat              "catalina.sh run"   2 months ago        Up 12 minutes       0.0.0.0:8080->8080/tcp   tomcat1
[root@localhost ~]# docker commit -m="tomcat lwz" -a="lwz" 62d67b5f059a lwz/tomcat:1.11
sha256:39691e27a979afe54d5d72ff08bc6daf8f79563d6417c7507aec5168a94fcaaf
[root@localhost ~]# docker images
REPOSITORY              TAG      IMAGE ID        CREATED             SIZE
lwz/tomcat              1.11     39691e27a979    30 seconds ago      680 MB
docker.io/tomcat        latest   4ebba13e9156    2 months ago        680 MB
docker.io/zookeeper     latest   36c607e7b14d    3 months ago        278 MB
docker.io/hello-world   latest   feb5d9fea6a5    6 months ago        13.3 kB
docker.io/centos        latest   5d0da3dc9764    7 months ago        231 MB
[root@localhost ~]# docker run -d -p 9090:8080 --name tomcatlwz lwz/tomcat:1.11
71e03a856bd0e730d58eb4cef631a25884cc5b246898dd191b65d3a3d89dde51
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
71e03a856bd0        lwz/tomcat:1.11     "catalina.sh run"   10 seconds ago      Up 9 seconds        0.0.0.0:9090->8080/tcp   tomcatlwz
62d67b5f059a        tomcat              "catalina.sh run"   2 months ago        Up 18 minutes       0.0.0.0:8080->8080/tcp   tomcat1
[root@localhost ~]#

六、Docker容器数据卷

Docker容器数据卷:容器的持久化、容器间继承+数据共享

添加数据卷方式一:

添加数据卷方式一:
一.添加容器数据卷
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像ID/名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像ID/名
带权限:ro:read only 只读
演示:
docker run -it -v /myDataVolume:/dataVolumeContainer 镜像ID/名
/myDataVolume和/dataVolumeContainer都不存在于宿主机和容器中:执行上面命令会创建该目录
之间数据共享
[root@localhost ~]# docker images
REPOSITORY              TAG       IMAGE ID          CREATED             SIZE
docker.io/tomcat        latest    4ebba13e9156      2 months ago        680 MB
docker.io/zookeeper     latest    36c607e7b14d      3 months ago        278 MB
docker.io/tomcat        8.5       2d2bccf89f53      3 months ago        678 MB
docker.io/hello-world   latest    feb5d9fea6a5      6 months ago        13.3 kB
docker.io/centos        latest    5d0da3dc9764      7 months ago        231 MB
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@bbd5a74e1de7 /]# ls -l
total 24
lrwxrwxrwx.   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   2 root root    6 Apr 17 02:28 dataVolumeContainer
drwxr-xr-x.   5 root root  360 Apr 17 02:28 dev
drwxr-xr-x.   1 root root   62 Apr 17 02:28 etc
drwxr-xr-x.   2 root root    6 Nov  3  2020 home
lrwxrwxrwx.   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root    6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root    6 Nov  3  2020 media
drwxr-xr-x.   2 root root    6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root    6 Nov  3  2020 opt
dr-xr-xr-x. 109 root root    0 Apr 17 02:28 proc
dr-xr-x---.   2 root root 4096 Sep 15  2021 root
drwxr-xr-x.   1 root root   20 Apr 17 02:28 run
lrwxrwxrwx.   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root    0 Apr 17 00:51 sys
drwxrwxrwt.   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x.  20 root root 4096 Sep 15  2021 var
[root@bbd5a74e1de7 /]#

--------------新开连接终端查看主机目录----------------------------------
[root@localhost ~]# 
[root@localhost ~]# cd ..
[root@localhost /]# ls -l
total 32
lrwxrwxrwx.   1 root root    7 Jan 15 03:47 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jan 15 03:52 boot
drwxr-xr-x.  19 root root 3000 Apr 16 20:51 dev
drwxr-xr-x.  87 root root 8192 Apr 16 20:51 etc
drwxr-xr-x.   4 root root   34 Feb 12 10:03 home
lrwxrwxrwx.   1 root root    7 Jan 15 03:47 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jan 15 03:47 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 16 22:28 myDataVolume
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x. 111 root root    0 Apr 16 20:51 proc
dr-xr-x---.   2 root root 4096 Apr 11  2018 root
drwxr-xr-x.  29 root root  840 Apr 16 20:51 run
lrwxrwxrwx.   1 root root    8 Jan 15 03:47 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Apr 16 20:51 sys
drwxrwxrwt.  19 root root 4096 Apr 16 21:11 tmp
drwxr-xr-x.  13 root root 4096 Jan 15 03:47 usr
drwxr-xr-x.  19 root root 4096 Jan 15 03:47 var
[root@localhost /]#

---------------------------------------------------
通过docker inspect  来验证数据卷和主机进行绑定
HostConfig-->"Binds": [
                "/myDataVolume:/dataVolumeContainer"
            ]
-----验证如下:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
bbd5a74e1de7        centos              "/bin/bash"         10 minutes ago      Up 10 minutes                                clever_tesla
7606bb489ac5        2d2bccf89f53        "catalina.sh run"   28 minutes ago      Up 28 minutes       0.0.0.0:7777->8080/tcp   tomcat3
[root@localhost /]# docker inspect bbd5a74e1de7
[
    {
        "Id": "bbd5a74e1de7cd1d7db172c0c4b6a61cac206f55567904348083323d1c84287d",
        "Created": "2022-04-17T02:28:23.438456409Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3241,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-04-17T02:28:23.630022213Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/bbd5a74e1de7cd1d7db172c0c4b6a61cac206f55567904348083323d1c84287d/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/bbd5a74e1de7cd1d7db172c0c4b6a61cac206f55567904348083323d1c84287d/hostname",
        "HostsPath": "/var/lib/docker/containers/bbd5a74e1de7cd1d7db172c0c4b6a61cac206f55567904348083323d1c84287d/hosts",
        "LogPath": "",
        "Name": "/clever_tesla",
        "RestartCount": 0,
        "Driver": "overlay2",
        "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c478,c830",
        "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c478,c830",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/myDataVolume:/dataVolumeContainer"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "journald",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "docker-runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/2762c4e0b4082548fbc6121c4f8bb0161793ecf2a8bf1e5d2600ec3cd1b29fec-init/diff:/var/lib/docker/overlay2/56c149dce051f5a94165b12b7a081ff54d27a5bb62dc01ce31c02d248c8b4207/diff",
                "MergedDir": "/var/lib/docker/overlay2/2762c4e0b4082548fbc6121c4f8bb0161793ecf2a8bf1e5d2600ec3cd1b29fec/merged",
                "UpperDir": "/var/lib/docker/overlay2/2762c4e0b4082548fbc6121c4f8bb0161793ecf2a8bf1e5d2600ec3cd1b29fec/diff",
                "WorkDir": "/var/lib/docker/overlay2/2762c4e0b4082548fbc6121c4f8bb0161793ecf2a8bf1e5d2600ec3cd1b29fec/work"
            }
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/myDataVolume",
                "Destination": "/dataVolumeContainer",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "bbd5a74e1de7",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "73df06e38ac246df2a3c49c38587796446b5034fa2ff0c04022a539ff12e909c",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/73df06e38ac2",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "bb4a3e3176318492eb0c13e76ab05a90670cb9de98810fd32859db99c5daef89",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "30cfa69dcc77a3a4b3741917381912044b4f126a40f1a8f2d595b0b04e114ecc",
                    "EndpointID": "bb4a3e3176318492eb0c13e76ab05a90670cb9de98810fd32859db99c5daef89",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03"
                }
            }
        }
    }
]
[root@localhost /]#

添加数据卷方式二:

添加数据卷方式二:
二.DockerFile添加
1.linux主机根目录下新建mydocker文件夹并进入
2.可在DockerFile中使用VOLUME命令来给镜像添加一个或多个数据卷
VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
3.File构建
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----success"
CMD /bin/bash
在mydocker文件夹创建dockerfile文件
[root@localhost /]# mkdir mydocker
[root@localhost /]# ls -l
total 32
lrwxrwxrwx.   1 root root    7 Jan 15 03:47 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jan 15 03:52 boot
drwxr-xr-x.  19 root root 3000 Apr 16 20:51 dev
drwxr-xr-x.  87 root root 8192 Apr 16 20:51 etc
drwxr-xr-x.   4 root root   34 Feb 12 10:03 home
lrwxrwxrwx.   1 root root    7 Jan 15 03:47 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jan 15 03:47 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 16 22:28 myDataVolume
drwxr-xr-x.   2 root root    6 Apr 16 23:16 mydocker
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x. 111 root root    0 Apr 16 20:51 proc
dr-xr-x---.   2 root root 4096 Apr 11  2018 root
drwxr-xr-x.  29 root root  840 Apr 16 20:51 run
lrwxrwxrwx.   1 root root    8 Jan 15 03:47 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Apr 16 20:51 sys
drwxrwxrwt.  19 root root 4096 Apr 16 21:11 tmp
drwxr-xr-x.  13 root root 4096 Jan 15 03:47 usr
drwxr-xr-x.  19 root root 4096 Jan 15 03:47 var
[root@localhost /]# cd mydocker
[root@localhost mydocker]# touch dockerfile
[root@localhost mydocker]# vi dockerfile
[root@localhost mydocker]# cat dockerfile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----success"
CMD /bin/bash
[root@localhost mydocker]#
4.build后生成镜像
docker build -f dockerfile文件 -t 镜像名 .
---------------演示---------------
[root@localhost mydocker]# docker build -f /mydocker/dockerfile -t lwz/centos .
Sending build context to Docker daemon 2.048 kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME /dataVolumeContainer1 /dataVolumeContainer2
 ---> Running in 1c63c4c7c5a0
 ---> ea11fd1d5a18
Removing intermediate container 1c63c4c7c5a0
Step 3/4 : CMD echo "finished,----success"
 ---> Running in ec4ffe7e8227
 ---> 6a54632181ef
Removing intermediate container ec4ffe7e8227
Step 4/4 : CMD /bin/bash
 ---> Running in c83c5cd77ab9
 ---> da3afaac64a7
Removing intermediate container c83c5cd77ab9
Successfully built da3afaac64a7
[root@localhost mydocker]# docker images
REPOSITORY              TAG       IMAGE ID            CREATED              SIZE
lwz/centos              latest    da3afaac64a7        About a minute ago   231 MB
docker.io/tomcat        latest    4ebba13e9156        2 months ago         680 MB
docker.io/zookeeper     latest    36c607e7b14d        3 months ago         278 MB
docker.io/tomcat        8.5       2d2bccf89f53        3 months ago         678 MB
docker.io/hello-world   latest    feb5d9fea6a5        6 months ago         13.3 kB
docker.io/centos        latest    5d0da3dc9764        7 months ago         231 MB
[root@localhost mydocker]#
5.run容器
[root@localhost mydocker]# docker run -it lwz/centos
[root@ab2596e56c96 /]# ls -l
total 24
lrwxrwxrwx.   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   2 root root    6 Apr 17 03:30 dataVolumeContainer1
drwxr-xr-x.   2 root root    6 Apr 17 03:30 dataVolumeContainer2
drwxr-xr-x.   5 root root  360 Apr 17 03:30 dev
drwxr-xr-x.   1 root root   62 Apr 17 03:30 etc
drwxr-xr-x.   2 root root    6 Nov  3  2020 home
lrwxrwxrwx.   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root    6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root    6 Nov  3  2020 media
drwxr-xr-x.   2 root root    6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root    6 Nov  3  2020 opt
dr-xr-xr-x. 114 root root    0 Apr 17 03:30 proc
dr-xr-x---.   2 root root 4096 Sep 15  2021 root
drwxr-xr-x.   1 root root   20 Apr 17 03:30 run
lrwxrwxrwx.   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root    0 Apr 17 00:51 sys
drwxrwxrwt.   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x.  20 root root 4096 Sep 15  2021 var
[root@ab2596e56c96 /]#
能看到dataVolumeContainer1和dataVolumeContainer2.说明我们创建镜像成功。
关联主机目录随机目录。
6.Docker挂载主机目录Docker访问出现cannot open directory .:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true参数即可

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

容器间数据共享:--volumes-from 容器ID/名

[root@localhost ~]# docker run -it --name dc01 lwz/centos
[root@63a1a0d320fb /]# [root@localhost ~]#
[root@localhost ~]# docker run -it --name dc02 --volumes-from dc01 lwz/centos
[root@e3992d732990 /]# [root@localhost ~]#
[root@localhost ~]# docker run -it --name dc03 --volumes-from dc01 lwz/centos
[root@6334378ac1f1 /]# [root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE      COMMAND       CREATED      STATUS        PORTS        NAMES
6334378ac1f1 lwz/centos "/bin/sh -c /bin/bash" 56 seconds ago Up 55 seconds    dc03 
e3992d732990 lwz/centos "/bin/sh -c /bin/bash" 2 minutes ago  Up 2 minutes     dc02
63a1a0d320fb lwz/centos "/bin/sh -c /bin/bash" 3 minutes ago  Up 3 minutes     dc01
[root@localhost ~]#
----这3个容器之间的数据卷可互相通信共用。
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

今天多学一份本事,明天少说一句求人的话。

勿在浮沙之上筑高台

Spring Boot入门+深入(六)-Docker


http://www.niftyadmin.cn/n/3298006.html

相关文章

不能失去你所以我为你改变自己

不能失去你所以我为你改变自己从 喷嚏网--读书、培训、8小时外的健康生活! 之 [铂程斋] 作者&#xff1a;xilei1 那时候洛洛和陈果已通过网络“相识”了两年。洛洛是石家庄的&#xff0c;而陈果是长沙的。两人聊得很开心&#xff0c;一直以来也很默契。两个人常常想到一起&…

用mstsc連接服務器收到超出最大連接數的問題

方法一:在win2003里面copy一個sysdir/windows/system32/tsadmin.exe文件運行連接,將那幾個占坑不拉s的人給踢出去,然后重新連接 方法二:運行里面輸入mstsc /console /v:yourservernameorIP:port連接(以前可以用,但不知道為什,我手下的幾臺服務器都無法用) 转载于:https://www.c…

Docker学习(二)-DockerFile

目录 一、DockerFile解析 DockerFile构建过程解析 DockerFile保留字指令 二、本地镜像发布到阿里云 一、DockerFile解析 DockerFile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成的脚本。 构建三步骤&#xff1a; 1、编写DockerFile文件 2、doc…

有状态as无状态之线程问题

有状态就是有数据存储功能。有状态对象(Stateful Bean)&#xff0c;就是有实例变量的对象 &#xff0c;可以保存数据&#xff0c;是非线程安全的。在不同方法调用间不保留任何状态。 无状态就是一次操作&#xff0c;不能保存数据。无状态对象(Stateless Bean)&#xff0c;就是没…

JVM学习(二)--类加载器子系统

目录 一、内存结构 二、类的加载器及类的加载过程 类加载器的分类 启动类加载器&#xff08;引导类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff09; 扩展类加载器&#xff08;Extension ClassLoader&#xff09; 应用程序类加载器&#xff08;系统类加…

程控制中关于搜索、控制计算机的功能 和 VB中截获shell程序的输出

相信大家对“冰河”之类的软件一定都非常的感兴趣&#xff0c;这里我们一起来讨论一下“冰河”类软件中关于如何实现搜索、控制远端计算机&#xff08;在局域网、或互联网上搜索那些中了木马的机器&#xff09;的功能。 一、 编程原理 客户端程序&#xff1a;&#xff08;控制远…

JVM学习(三)--运行时数据区

目录 一、运行时数据区 1、简介 2、程序计数器(PC寄存器) 3、虚拟机栈 3.1、简介 3.2、栈的存储单位 3.3、局部变量表&#xff08;Local Variables&#xff09; 3.4、操作数栈&#xff08;Operand Stack&#xff09; 3.5、栈顶缓存&#xff08;Top-of-Stack Cashing&a…

RenderMan介绍

RenderMan介绍RenderMan是一种一流的渲染器或者说是一种渲染思想&#xff0c;一种系统。用于动画效果中的后毛发等制作的软件。这个软件是皮克斯开发的&#xff0c;广泛应用于好莱坞的影片&#xff0c;包括动画和真人电影中的特效镜头。 RenderMan是PIXAR出品的目前最强大的渲染…