《docker》入门笔记

文章目录

Docker入门

Docker CE 安装

通过阿里ECS安装

  1. 安装必要的一些系统工具

    $ yum install -y yum-utils device-mapper-persistent-data lvm2
    

    在这里插入图片描述

  2. 添加软件源信息

    $ sudo yum-config-manager \
    	--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    在这里插入图片描述

  3. 更新并安装Docker CE

    $ yum makeache fast
    $ yum install docker-ce docker-ce-cli containerd.io
    

    在这里插入图片描述

  4. 开启Docker服务

    # CentOS <7
    $ service docker start
    
    #CentOS >=7
    $ systemctl start docker
    
  5. 安装校验

    [root@MiWiFi-R4A-srv docker]# docker version
    Client: Docker Engine - Community
     Version:           19.03.12
     API version:       1.40
     Go version:        go1.13.10
     Git commit:        48a66213fe
     Built:             Mon Jun 22 15:46:54 2020
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.12
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.13.10
      Git commit:       48a66213fe
      Built:            Mon Jun 22 15:45:28 2020
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.2.13
      GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
     runc:
      Version:          1.0.0-rc10
      GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
    
  6. 更改阿里云镜像加速

    https://4kfm6u95.mirror.aliyuncs.com --> 账号专属的加速器地址

    在这里插入图片描述

    $ cd /etc/docker
    $ tee /etc/docker/daemon.json <<-'EOF'
    >{"registry-mirrors":["https://4kfm6u95.mirror.aliyuncs.com"]}
    >EOF
    
    # 重新加载
    $ systemctl daemon-reload
    # 重启docker
    $ systemctl restart docker
    
  7. 通过运行hello-world 映像验证是否正确安装了Docker Engine-Community

    $ docker run hello-world
    

Docker卸载

  1. systemctl stop docker
  2. yum -y remove docker-ce
  3. rm -rf /var/lib/docker

Docker 图解

在这里插入图片描述

在这里插入图片描述

run之后Docker做了什么

在这里插入图片描述

Docker运行底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器

容器:是一个运行时环境,就是一个一个的虚拟系统(鲸鱼上的集装箱)

在这里插入图片描述

为什么Docker比VM快

  1. Docker有着比虚拟机更少的抽象层。由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上Docker将会在效率上有明显优势
  2. Docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了繁琐过程,因此新建一个Docker容器只需要几秒钟。

在这里插入图片描述

1、帮助命令

$ docker version
$ docker info
$ docker --help

2、镜像命令

在这里插入图片描述

列出主机上的镜像

docker images

列出主机上镜像

在这里插入图片描述

各个选项说明:

选项说明
REPOSITOR标识镜像的仓库源
TAG镜像的标签
IMAGE ID镜像ID
CREATED镜像创建时间
SIZE镜像大小

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

docker images的常见参数说明:

参数说明
-a列出本地所有的镜像(含中间映射层)
-q只显示镜像ID
–digests显示镜像的摘要信息,类似于备注
–no-trunc显示完整的镜像信息

示例

  1. docker images -a

    在这里插入图片描述

  2. docker images -q

    在这里插入图片描述

  3. docker images --digests

    在这里插入图片描述

  4. docker --no-trunc

    在这里插入图片描述

从仓库中查找镜像

docker search

到仓库查找镜像,如果配置了阿里云镜像,查找依然在官方仓库查找,但是下载会去阿里云上下载

在这里插入图片描述

常见参数说明:

参数说明
–no-trunc显示完整的镜像描述
-s列出收藏数不小于指定值的镜像
–automated只列出 automated build (自动构建) 类型的镜像

示例

  1. docker search -s 30 tomact

    在这里插入图片描述

  2. docker search -s 30 --no-trunc tomcat

    在这里插入图片描述

  3. docker search -s 30 --automated tomcat

    在这里插入图片描述

下载镜像

docker pull

docker pull:[TAG]

docker pull tomcat 等价于 docker pull tomcat:latest

docker pull tomcat:3.2.2 相当于拉取指定版本的tomcat

示例

docker pull tomcat

在这里插入图片描述

通过查看本机镜像,可以看到下载好的镜像docker images

在这里插入图片描述

删除镜像

docker rmi

docker rmi hello-world 相当于docker rmi hello-world:latest

删除单个

docker rmi -f 镜像ID/唯一镜像名

如果镜像使用过或者正在使用,会提示删除失败

在这里插入图片描述

此时可以通过-f参数强制删除:docker rmi -f hello-world。也会将该镜像所依赖(中间映射)镜像删除掉。如下图,有两个被删除了

在这里插入图片描述

删除多个

docker rmi -f 镜像名 镜像名 ...

在这里插入图片描述

删除全部

docker rmi -f $(docker images -q)

3、容器命令

有镜像才能创建容器,这是根本前提(以CentOS镜像演示)

docker pull centos

在这里插入图片描述

新建并启动容器

命令:docker run [OPTIONS] IMAGE [COMMAND][TAG…]

OPTIONS说明(常用):

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

示例

  1. 先查看本机所有镜像:docker images

    在这里插入图片描述

  2. 创建并启动容器:docker run -it --name centos02 0d120b6ccaa8

    在这里插入图片描述

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

命令:docker ps [OPTIONS]

需要在宿主机上执行该命令

参数说明:

参数说明
-a列出当前所有正在运行的容器+历史上运行过
-l*(注:小写l)*显示最近创建的容器
-n显示最近n个创建的容器
-q静默模式,只显示容器编号
–no-trunc不截断输

示例

  1. 重新打开一个命令终端

  2. 输入命令,查看正在运行的容器:docker ps

    在这里插入图片描述

  3. 查看所有运行过和正在运行的容器:docker ps -a

    在这里插入图片描述

  4. 之查看容器编号:docker ps -aq

    在这里插入图片描述

退出容器

有两种退出方式

  1. 容器停止退出:exit

    在这里插入图片描述

    通过docker ps查看正在运行容器,会发现容器已经停止

    在这里插入图片描述

    通过docker ps -l查看运行过的容器

    在这里插入图片描述

  2. 容器不停止退出:Ctrl+P+Q

    通过docker ps查看正在运行的容器,会发现容器依然在运行

启动容器

命令:docker start 容器ID/容器名

启动成功后会返回容器ID

示例

  1. 查看所有容器:docker ps -a

    在这里插入图片描述

  2. 启动上次停止的容器:docker start xxxxxx

    在这里插入图片描述

重启容器

命令:docker restart 容器ID/容器名

重启成功后,会返回容器编号

示例

  1. 查看所有启动的容器:docker ps

    在这里插入图片描述

  2. 重启容器:docker restart xxxxx

    在这里插入图片描述

停止容器

命令:docker stop 容器ID/容器名

正常停止,比较慢

示例

  1. 查看所有容器:docker ps

    在这里插入图片描述

  2. 停止一个容器:docker stop xxxxx

强制停止容器

命令:docker kill 容器ID/容器名

强制停止,会马上停止该容器

示例

  1. 查看所有容器:docker ps

    在这里插入图片描述

  2. 强制停止一个容器:docker kill xxxxxx

删除已停止的容器

命令:

  1. 一次删除一个容器:docker rm 容器ID
  2. 一次删除多个容器:docker rm -f $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm

与删除镜像区分:docker rmi xxx

重要的命令

启动守护式容器

命令:docker run -d 容器ID/容器名

启动成功后,会返回一个ID,但是通过docker ps查不到,因为容器已经退出

很重要的一点:Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如top,tail),就是自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如:service nginx start

但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。所以,最佳的解决方案是:将要运行的程序以前台进程的形式运行

查看容器日志

命令:docker logs -f -t --tail 容器ID

参数说明:

参数说明
-t显示时间戳
-f动态打印最新的日志
–tail 数字显示最后多少条记录
  1. 启动一个守护式容器,通过打印输出,不让容器自动退出

    $ docker run -d centos /bin/sh -c "while true;do echo hello sxh;sleep 2;done"
    

    在这里插入图片描述

  2. 通过docker ps查看正在运行的容器

    $ docker ps
    

    在这里插入图片描述

  3. 查看守护容器的日志,发现有打印输出的内容

    $ docker logs -t -f 容器ID
    

    在这里插入图片描述

查看容器内运行的进程

命令:docker top 容器ID

Linux命令:top查看Linxu进程

在这里插入图片描述

查看容器内部细节

命令:docker inspect 容器ID

会返回一个JSON串,包含了所有内容

[root@sxh ~]# docker inspect 0ef7f7403889
[
    {
        "Id": "0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9",
        "Created": "2020-08-31T13:16:31.915460343Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo hello sxh;sleep 2;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2493,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-08-31T13:16:32.25137072Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
        "ResolvConfPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/hostname",
        "HostsPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/hosts",
        "LogPath": "/var/lib/docker/containers/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9/0ef7f74038896e554865ca25ea28efb3a854df5bd97b8f07e7a45e6f910d0ec9-json.log",
        "Name": "/centos_shouhu",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9-init/diff:/var/lib/docker/overlay2/51b67829e9dbf4d7daf851f9ce50a4134b3fab6dd6a5749bb13b9a3f8c85e28d/diff",
                "MergedDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/merged",
                "UpperDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/diff",
                "WorkDir": "/var/lib/docker/overlay2/a374a6ae2abce4acb8436c0e519fa3917efd2b191fa9d304033682b3747c77c9/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "0ef7f7403889",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true;do echo hello sxh;sleep 2;done"
            ],
            "Image": "0d120b6ccaa8",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200809",
                "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": "66444b7cc32692d6581e321b23e39fa5fdeca140c2385d734db342624c7d302d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/66444b7cc326",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "b60d120d3a8fea831ea9a7272a25b7701202ff002628604c50270a7be0379736",
            "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": "16c781d3b2b7ec5fa445a4d1e418102b9c61f856a04837a516912bace70b9ab9",
                    "EndpointID": "b60d120d3a8fea831ea9a7272a25b7701202ff002628604c50270a7be0379736",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

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

  1. 在宿主机上操作容器docker exec -it 容器ID bashShell

    在宿主机上查看容器中 /tmp 目录下的内容

    在这里插入图片描述

    也可重新进入容器

    在这里插入图片描述

  2. 重新进入docker attach 容器ID

    在这里插入图片描述

上述两个的区别:

  • exec:是在容器中打开新的终端,并且可以启动新的进程
  • attach:直接进入容器启动命令的终端,不会启动新的进程

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

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

在这里插入图片描述

将容器/tmp下的文件拷贝到宿主机的/home

$ docker cp 737ec2108c0b:/tmp/ks-script-2n9owwnh /home/

在这里插入图片描述

Docker镜像是什么

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

UnionFS(联合文件系统)

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里的Centos才200MB?

在这里插入图片描述

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

分层的镜像

docker pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

在这里插入图片描述

图解tomcat为什么镜像特别大(镜像是分层的)

在这里插入图片描述

在这里插入图片描述

Tomcat需要jdk8,需要运行在Centos上,需要Linux内核等等,一层一层的加起来,组成了一个镜像,提供使用

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

最大的一个好处就是:共享资源

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

Docker镜像的特点

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

Docker镜像commit操作

提交容器副本,使之成为一个新的镜像

命令:docker commit

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

案例演示

  1. 从Hub上下载tomcat镜像到本地并成功运行

    docker run -it -p 8080:8080 tomcat

    参数说明:

    参数说明
    -p主机端口:docker容器端口
    -P随机分配端口
    -i交互式启动
    -t打开终端

    docker run -it -P tomcat

    在这里插入图片描述

  2. 删除上一步镜像生产tomcat容器中的文档(doc)

    • docker ps

      在这里插入图片描述

    • docker exec -it xxxxx /bin/bash

      在这里插入图片描述

    • ls -l

      在这里插入图片描述

    • rm -rf docs

      在这里插入图片描述

  3. 也即当前的tomcat运行实例是一个没有文档内容的容器,以它为模板commit一个没有doc的tomcat新镜像sxh/tomcat02,指定版本1.2

    docker commit -a="sxh" -m="tomcat without docs" xxxx sxh/tomcat:1.2

    在这里插入图片描述

    commit成功后,会返回新镜像的ID

  4. 启动我们的新增镜像并和原来的对比

    • 启动sxh/tomcat02:1.2,他没有docs文档

      docker run -it -p 7777:8080 sxh/tomcat02:1.2

      在这里插入图片描述

    • 启动原来pull下来的tomcat,有docs文档

      docker run -it -p 7788:8080 tomcat

      在这里插入图片描述

容器数据卷概念

是什么?

一句话:有点类似Redis里面的rdb和aof文件

Docker的理念:

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

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

能干嘛?

  1. 容器的持久化
  2. 容器间继承+共享数据
  3. 宿主机和容器之间的数据共享

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

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

特点:

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

数据卷也可以完成 宿主机->容器容器->宿主机 之间的文件拷贝

数据卷

容器内添加

直接命令添加

命令(不带权限)

docker run -it -v /宿主机绝对路径:/容器目录 镜像名

$ docker run -it --name centos03 -v /myDataValue:/dataValue centos

在这里插入图片描述

  1. 查看数据卷是否挂在成功

    先通过docker ps找到当前容器ID

    通过docker inspect 307887ae9dfa 查看细节,发现数据卷已绑定

    在这里插入图片描述

  2. 容器和宿主机之间数据共享

    在宿主机中的数据卷中,创建一个文件

    再到容器中的数据卷中,会发现,容器已经同步下来这个文件

    在这里插入图片描述

    在容器中更新host.txt,再创建一个文件

    回到宿主机,可以看到host.txt更新的内容,也可以看到新新创建的文件

    在这里插入图片描述

  3. 容器停止退出后,主机修改后数据是否通同步

    容器停止exit后,更新数据卷目录:/myDataValue;然后重启容器,进入数据卷目录:/dataValue,会发现,依然可以同步更新

    buzhi

命令(带权限)

docker run -it -v /宿主机绝对路径:/容器内目录:ro 镜像名

ro:read only——只读

$ docker run -it --name centos04 -v /myDataValue:/dataValue:ro centos
  1. 在宿主机创建文件

    $ touch host.txt
    $ echo "host update 01" >> host.txt
    
  2. 在容器中查看,并修改,发现无法修改

    $ cd /dataValue
    $ vi host.txt   
    

    进入vi后,编辑时,会提示:readonly file

    在这里插入图片描述

    通过ls -s查看文件详细信息,发现没有写权限

    在这里插入图片描述

  3. 在容器中进入数据卷目录,新建文件

    $ touch coantainer.txt
    touch: cannot touch 'coantainer.txt': Read-only file system
    

    会发现也是无法创建文件,提示:Read-only file system

  4. 在宿主机查看容器细节:docker inspect 9c4dedc736e0

    “Mode”:“ro” — 模式:只读

    "Mounts": [
        {
            "Type": "bind",
            "Source": "/myDataValue",
            "Destination": "/dataValue",
            "Mode": "ro",
            "RW": false,
            "Propagation": "rprivate"
        }
    ]
    

DockerFile添加

相当于Linux中的shell脚本,DockerFile是Docker的脚本

  1. 根目录下新建mydocker文件夹进入

    $ cd /
    $ mkdir /mydocker
    $ cd /mydocker
    
  2. 可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷

    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
    

    说明:出于可移植和分享的考虑,-v 主机目录:容器目录 这种方法不能够直接在DockerFile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

  3. File构建

    $ vim Dockerfile
    
    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer","/dataVolumeContainer2"]
    CMD echo "finished,-----------------success1"
    CMD /bin/bash
    
  4. Build后生成镜像

    获得一个新的镜像

    $ docker build -f /mydocker/Dockerfile -t sxh/centos .
    

    在这里插入图片描述

    通过docker images可以查看生成的镜像

    在这里插入图片描述

  5. run容器

    $ docker run -it --name myselt_centos sxh/centos
    

    启动后,在容器的根目录下就已经存在了2个数据卷目录了

    在这里插入图片描述

  6. 通过上述步骤,容器内的卷目录地址已经知道。对应的主机目录地址在哪?

    通过查看容器的细节信息,可以发现docker默认生成了主机端的数据卷

    在这里插入图片描述

  7. 主机对应默认地址

    /var/lib/docker/volumes/

  8. 备注:

    Docker挂载主机目录Docker访问出现:cannot open directory .: Permission denied

    解决办法:在挂载目录后多加一个--privileged=true参数即可

数据卷容器

是什么?

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

演示+介绍

上一步创建了一个数据卷镜像sxh/centos,已经具备了容器卷:

  • /dataVolumeContainer1
  • /dataVolumeContainer2

以它为模板并运行容器:dc01,dc02,dc03

容器间传递共享:--volumes-from

  1. 先启动一个父容器dc01,在/dataVolumeContainer2中添加内容

    $ docker run -it --name dc01 sxh/centos
    
  2. dc02,dc03继承自dc01

    $ docker run -it --name dc02 --volume-from dc01 sxh/centos
    
    $ docker run -it --name dc03 --volume-from dc01 sxh/centos
    

    分别在两个容器的数据卷/dataVolumeContainer2中添加内容

  3. 回到dc01可以看到dc02,dc03各自添加的内容

  4. 删除dc01容器,dc02容器中的数据卷修改后,dc03容器中的数据卷依然可以同步内容

  5. 删除dc02容器,dc03容器的数据卷依然可以使用

  6. 新建dc04容器,继承dc03,再删除dc03dc04容器的数据卷依然可用

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

DockerFile是什么?

  1. Dockerfile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构建成的脚本

  2. 构建三步骤:

    • 编写Dockerfile文件
    • docker build
    • docker run
  3. 文件什么样?

    以centos为例

    FROM scratch   # 相当于Java中的Object
    ADD centos-7-x86_64-docker.tar.xz / 
    
    LABEL \ # 标签,说明的意思
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="CentOS Base Image" \
        org.label-schema.vendor="CentOS" \
        org.label-schema.license="GPLv2" \
        org.label-schema.build-date="20200809" \
        org.opencontainers.image.title="CentOS Base Image" \
        org.opencontainers.image.vendor="CentOS" \
        org.opencontainers.image.licenses="GPL-2.0-only" \
        org.opencontainers.image.created="2020-08-09 00:00:00+01:00"
    
    CMD ["/bin/bash"]
    

DockerFile构建过程解析

Dockerfile 内容基础知识

  1. 每条 保留字指令 都必须为大写字母,且后面跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有的指令都执行完成

总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

在这里插入图片描述

  1. Dockerfile

    需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务,和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

  2. Docker镜像

    在用Dockerfile定义一个文件之后,docker build 会产生一个Dockers镜像,当运行Docker镜像时,会真正开始提供服务

  3. Docker容器

    容器是直接提供服务的

DockerFile体系结构

保留字指令

  1. FROM

    基础镜像,当前新镜像是基于哪个镜像的

  2. MAINTAINER

    镜像维护者的姓名和邮箱地址

  3. RUN

    容器构建的时候需要运行的命令

  4. EXPOSE

    当前容器对外暴露出的端口

  5. WORKDIR

    指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点

  6. ENV

    用来在构建镜像过程中设置环境变量

    ENV MY_PATH /usr/mytest
    

    这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其他指令中直接使用这些环境变量

    WORKDIR $MY_PATH
    
  7. ADD

    将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

  8. COPY

    类似于ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

    COPY src dest

    COPY ["src","dest"]

  9. VLUME

    容器数据卷,用于数据保存和持久化工作

  10. CMD

    指定一个容器启动时要运行的指令

    Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被 docke run 之后的参数替换

    CMD指令的格式和RUN相似,有两种格式:

    • shell格式:CMD <指令>
    • exec格式:CMD ["可执行文件","参数1","参数2"...]
    • 参数列表格式:CMD ["参数1","参数2",...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
  11. ENTRYPOINT

    指定一个容器启动时要运行的指令

    ENTRYPONIT的目的和CMD一样,都是在指定容器启动程序及参数

  12. ONBUILD

    当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发

总结

BUILDBothRUN
FORMWORKDIRCMD
MAINTAINERUSERENV
COYPEXPOSE
ADDVOLUMN
RUNENTRYPOINT
ONBUILD
.dockerignore

案例

4.1、Base镜像 - scratch

Docker Hub 中99%的镜像都是通过在 base镜像中安装和配置需要的软件构建出来的

在这里插入图片描述

4.2、自定义镜像 - mycentos

编写

  1. Hub默认CentOS镜像登录后的情况

    在这里插入图片描述

    自定义mycentos目的是我们自己的镜像具备如下:

    • 登陆后的默认路径
    • vim编辑器
    • 支持ifconfig查看网路配置
  2. 准备编写DockerFile文件

    FROM centos
    MAINTAINER sxh<531845606@qq.com> #作者和邮箱
    
    ENV MYPATH /usr/local  # 登陆后的默认路径
    WORKDIR $MYPATH
    
    RUN yum -y install vim # vim编辑器
    RUN yum -y install net-tools # 支持ifconfig查看网路配置
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "success-------ok"
    CMD /bin/bash
    

构建

$ docker build -f /mydocker/Dockerfile2 -t 新镜像名字:TAG .

[root@localhost mydocker]# docker build -f ./Dockerfile2 -t mycentos:1.3 .
Sending build context to Docker daemon  3.072kB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
Step 2/10 : MAINTAINER sxh<531845606@qq.com>
 ---> Running in 0fd32f7a31c4
Removing intermediate container 0fd32f7a31c4
 ---> b311790e7a85
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 733bfa5f3296
Removing intermediate container 733bfa5f3296
 ---> 3c016b010ebc
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 1ff1692956dc
Removing intermediate container 1ff1692956dc
 ---> 88161cb60504
Step 5/10 : RUN yum -y install vim
 ---> Running in 97684139364c
CentOS-8 - AppStream                             24 kB/s | 5.8 MB     04:08    
CentOS-8 - Base                                  52 kB/s | 2.2 MB     00:43    
CentOS-8 - Extras                               898  B/s | 7.3 kB     00:08    
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.el8         AppStream       48 k
 which               x86_64      2.21-12.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm         54 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp  59 kB/s |  48 kB     00:00    
(3/5): which-2.21-12.el8.x86_64.rpm             5.8 kB/s |  49 kB     00:08    
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm   42 kB/s | 1.4 MB     00:32    
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm     81 kB/s | 6.3 MB     01:19    
--------------------------------------------------------------------------------
Total                                            98 kB/s | 7.8 MB     01:21     
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream                            1.6 MB/s | 1.6 kB     00:00    
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : which-2.21-12.el8.x86_64                               1/5 
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/5 
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/5 
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5 
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5 
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5 
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5 
  Verifying        : which-2.21-12.el8.x86_64                               5/5 

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64    
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64             

Complete!
Removing intermediate container 97684139364c
 ---> 44c28a25439d
Step 6/10 : RUN yum -y install net-tools
 ---> Running in f5d9d8013e9c
Last metadata expiration check: 0:01:29 ago on Thu Sep  3 08:15:11 2020.
Dependencies resolved.
================================================================================
 Package         Architecture Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.51.20160912git.el8       BaseOS       323 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm   149 kB/s | 323 kB     00:02    
--------------------------------------------------------------------------------
Total                                           107 kB/s | 323 kB     00:03     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 
  Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 
  Verifying        : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 

Installed:
  net-tools-2.0-0.51.20160912git.el8.x86_64                                     

Complete!
Removing intermediate container f5d9d8013e9c
 ---> 9b10c1b8667e
Step 7/10 : EXPOSE 80
 ---> Running in bec70264a12b
Removing intermediate container bec70264a12b
 ---> e367619dad3e
Step 8/10 : CMD echo $MYPATH
 ---> Running in 74ebce4ef90c
Removing intermediate container 74ebce4ef90c
 ---> d460d3cdf975
Step 9/10 : CMD echo "success-------ok"
 ---> Running in cdda4b72f619
Removing intermediate container cdda4b72f619
 ---> a1c0a32fbb20
Step 10/10 : CMD /bin/bash
 ---> Running in 27e58865de53
Removing intermediate container 27e58865de53
 ---> 3514d9a87493
Successfully built 3514d9a87493
Successfully tagged mycentos:1.3
[root@localhost mydocker]# 

通过docker images查看新构建的镜像

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.3                 b2075ccbe763        23 minutes ago      295MB

运行

自定义的镜像生成的容器时可以用vim和ifconfig的

[root@localhost mydocker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.3                 3514d9a87493        15 minutes ago      295MB
sxh/centos          latest              f8735d5423d9        47 hours ago        215MB
centos              latest              0d120b6ccaa8        3 weeks ago         215MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
[root@localhost mydocker]# docker run -it mycentos:1.3 
[root@3dc13d133545 local]# pwd
/usr/local
[root@3dc13d133545 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@3dc13d133545 local]# 

列出镜像的变更历史

docker history 镜像名/镜像ID

示例:docker history mycentos:1.3

[root@localhost mydocker]# docker history mycentos:1.3
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
3514d9a87493        24 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
a1c0a32fbb20        24 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
d460d3cdf975        24 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
e367619dad3e        24 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B                  
9b10c1b8667e        24 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB              
44c28a25439d        24 minutes ago      /bin/sh -c yum -y install vim                   57.2MB              
88161cb60504        30 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
3c016b010ebc        30 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
b311790e7a85        30 minutes ago      /bin/sh -c #(nop)  MAINTAINER sxh<531845606@…   0B                  
0d120b6ccaa8        3 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB               
[root@localhost mydocker]# 

ONBUILD指令

当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发

  1. 自定义一个Dockerfile(名字:Dockerfile4),编写DockerFile

    FROM centos
    RUN yum install -y curl
    ENTRYPOINT ["curl","-s","http://ip.cn"]
    ONBUILD RUN echo "father image onbuild ---------- 886"
    

    当该DockerFile构建成镜像后,会打印father image onbuild ---------- 886

    [root@localhost mydocker]# docker build -f ./Dockerfile4 -t myip_father .
    Sending build context to Docker daemon  4.096kB
    Step 1/4 : FROM centos
     ---> 0d120b6ccaa8
    Step 2/4 : RUN yum install -y curl
     ---> Running in a164d5d0c457
    CentOS-8 - AppStream                             38 kB/s | 5.8 MB     02:37    
    CentOS-8 - Base                                 101 kB/s | 2.2 MB     00:22    
    CentOS-8 - Extras                               6.8 kB/s | 7.3 kB     00:01    
    Package curl-7.61.1-12.el8.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!
    Removing intermediate container a164d5d0c457
     ---> 009ca3aa8436
    Step 3/4 : ENTRYPOINT ["curl","-s","http://ip.cn"]
     ---> Running in 99cf55fd29e0
    Removing intermediate container 99cf55fd29e0
     ---> 9c74d924725c
    Step 4/4 : ONBUILD RUN echo "father image onbuild ---------- 886"
     ---> Running in 18d86df9387e
    Removing intermediate container 18d86df9387e
     ---> 95f0500abf68
    Successfully built 95f0500abf68
    Successfully tagged myip_father:latest
    
  2. 再新建一个Dockerfile(名字:Dockerfile5),继承上一个自定义的镜像

    FROM myip_father
    RUN yum install -y curl
    ENTRYPOINT ["curl","-s","http://ip.cn"]
    

    当构建该镜像时,会触发父类的触发器第6行

    [root@localhost mydocker]# docker build -f ./Dockerfile5 -t myip_son .
    Sending build context to Docker daemon   5.12kB
    Step 1/3 : FROM myip_father
    # Executing 1 build trigger
     ---> Running in 31753d859012
    father image onbuild ---------- 886
    Removing intermediate container 31753d859012
     ---> 12d8678b6ae1
    Step 2/3 : RUN yum install -y curl
     ---> Running in 687b977586ca
    Last metadata expiration check: 0:25:45 ago on Thu Sep  3 08:54:32 2020.
    Package curl-7.61.1-12.el8.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!
    Removing intermediate container 687b977586ca
     ---> 0a237da8aa96
    Step 3/3 : ENTRYPOINT ["curl","-s","http://ip.cn"]
     ---> Running in 89e6ac3c96fb
    Removing intermediate container 89e6ac3c96fb
     ---> 587201037dcd
    Successfully built 587201037dcd
    Successfully tagged myip_son:latest
    [root@localhost mydocker]# 
    

~CMD/ENTRYPOINT 镜像案例~~

自定义镜像 Tomcat 9

  1. mkdir -p /sxh/mydockerfile/tomcat9

  2. 在目录下创建文件

    $ touch c.txt
    
  3. 将jdk和tomcat安装的压缩包拷贝到目录中

    • apache-tomcat-9.0.8.tar.gz
    • jdk-8u171-linux-x64.tar.gz
  4. /sxh/mydockerfile/tomcat9目录下新建Dockerfile文件

    FROM centos
    MAINTAINER sxh<531845606@qq.com>
    # 把宿主机当前上下文的c.txt拷贝到容器/usr/local路径下
    COPY c.txt /usr/local/cincontainer.txt
    # 把tomcat添加到容器中
    ADD apache-tomcat-9.0.37.tar.gz /usr/local/
    ADD jdk-8u171-linux-x64.tar.gz /usr/local/
    # 安装vim编辑器
    RUN yum -y install vim
    # 设置工作访问时候的WORKDIR路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    # 配置Java与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.8.0.171
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
    ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    # 容器运行时监听的端口
    EXPOSE 8080
    # 启动时运行tomcat
    CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
    
    
  5. 构建

    在当前目录下,执行镜像的构建

    docker build -t sxhtomcat9—>以前有-f /Dockerfile,不写的话,会自动在当前目录下查找Dockerfile

    $ docker build -t sxhtomcat9 .
    

    在这里插入图片描述

  6. run

    通过构建出来的镜像,运行一个tomcat容器

    $ docker run -d -p 8080:8080 --name mytom9 \
         -v /sxh/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.37/webapps/test \
         -v /sxh/mydockerfile/tomcat9/tomcat9logs/:/usr/loacl/apache-tomcat-9.0.37/logs \
         --privileged=true sxhtomcat9
    
  7. 验证

    1. 在宿主机的数据卷的logs文件中查看日志,查看是否启动成功

      在这里插入图片描述

    2. 通过网页访问ip:port看是否能访问成功

      在这里插入图片描述

  8. 结合容器卷测试web服务发布

总结

在这里插入图片描述

总体步骤

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像
  5. 停止容器
  6. 移除容器

1. 安装Tomcat

  1. docker hub 上查找tomcat镜像

    $ docker search tomcat
    
  2. 从docker hub 上拉取tomcat镜像到本地

    $ docker pull tomcat
    
  3. docker images 查看是否有拉取到的tomcat

    $ docker images
    
  4. 使用tomcat镜像创建容器(也叫运行镜像)

    $ docker run -it -p 8080:8080 tomcat
    

2. 安装MySQL

2.1 x86

  1. docker hub 上面查找镜像

    在这里插入图片描述

  2. 从docker hub 上拉取MySQL镜像到本地,标签:5.6

  3. 使用mysql5.6镜像创建容器(也叫运行镜像)

    $ docker run -p 12345:3306 --name mysql \
    	-v /sxh/mysql/conf:/etc/mysql/conf.d \
    	-v /sxh/mysql/logs:/logs \
    	-v /sxh/mysql/data:/var/lib/mysql \
        -e MYSQL_ROOT_PASSWORD=123456 \
    	-d mysql:5.6
    

    命令说明:

    • -e MYSQL_ROOT_PASSWORD=123456 :初始化root用户的密码

    进入docker的mysql中,创建库表,插入数据

    $ docker exec -it xxxxx /bin/bash
    $ mysql -u root -p
    > 123456
    > create database db01;
    > use db01;
    > create table t_book (id int not null primary key,book_name varchar(20));
    > insert into t_book values(1,'java');
    

    在这里插入图片描述

    在这里插入图片描述

    通过Windows10,使用navicat连接docker中的mysql

    在这里插入图片描述

  4. 通过Docker进行mysql数据备份

    $ docker exec 容器ID sh -c 'exec mysqldump --all-databases -uroot -p"123456"' \
    	> /sxh/all-databases.sql
    

    在这里插入图片描述

2.2 arm64

# 拉取镜像
$ docker pull mysql/mysql-server:latest

# 启动
$ docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server

# 连接mysql
docker exec -it mysql bash
mysql -u root -p

# 授权
use mysql;
update user set host='%' where user='root';
grant all privileges on *.* to 'root'@'%' ;

# 刷新权限
flush privileges;

3. 安装redis

  1. 从docker hub上拉去redis镜像到本地,标签为:3.2

    $ docker pull redis:3.2
    
  2. 使用redis3.2 镜像创建容器(也叫运行镜像)

    1. 使用镜像

      $ docker run -p 6379:6379 \
      	-v /sxh/myredis/data:/data/ \
      	-v /sxh/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
      	-d redis:3.2 redis-server /usr/local/etc/redis/redis.conf \
      	--appendonly yes
      
      docker run -d 
      --name redis 
      -p 6979:6379 redis:latest redis-server 
      --appendonly yes 
      --requirepass "你的密码"
      
      
    2. 在主机/sxh/myredis/conf/redis.conf目录下新建redis.conf文件

      $ vim /sxh/myredis/conf/redis.conf/redis.conf
      
    3. 测试redis-cli连接

      $ docker exec -it 5bea98c63b48 redis-cli
      127.0.0.1:6379> set k1 v1
      OK
      127.0.0.1:6379> set k2 v2
      OK
      127.0.0.1:6379> set k3 v3
      OK
      127.0.0.1:6379> 
      

      在这里插入图片描述

    4. 测试持久化文件生成

      进入/sxh/myredis/data下,会发现appendonly.aof持久化文件

      在这里插入图片描述

4. 安装Zookeeper

  1. 查看镜像

    docker search zookeeper
    
  2. 拉取镜像

    docker pull zookeeper
    
  3. 启动容器

    docker run -it -p 2181:2181
    

5. 安装kafka

启动命令

docker run  
-d --name kafka -p 9092:9092 
-e KAFKA_BROKER_ID=0 
-e KAFKA_ZOOKEEPER_CONNECT=10.9.44.11:2181 
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.9.44.11:9092 
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 
-t wurstmeister/kafka

KAFKA_ZOOKEEPER_CONNECT: 配置zookeeper管理kafka的路径

KAFKA_ADVERTISED_LISTENERS:把kafka的地址端口注册给zookeeper

KAFKA_LISTENERS=PLAINTEXT: 配置kafka的监听端口 0.0.0.0 表示本机

安装管理页面

#1. 拉取
docker pull sheepkiller/kafka-manager
#2. 启动
docker run -d --name kfk-manager \
--restart always -p 9000:9000 \
-e ZK_HOSTS=<这里换成你的zookeeper地址和端口> \
sheepkiller/kafka-manager
#3. 配置
进入web页面点击cluster配置节点名称即可看到

6. 安装RabbitMQ

  1. docker search rabbitmq

    [root@localhost ~]# docker search rabbitmq
    NAME                                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    rabbitmq                                    RabbitMQ is an open source multi-protocol me…   4023                [OK]                
    tutum/rabbitmq                              Base docker image to run a RabbitMQ server      22                                      
    kbudde/rabbitmq-exporter                    rabbitmq_exporter for prometheus                17                                      [OK]
    frodenas/rabbitmq                           A Docker Image for RabbitMQ                     12                                      [OK]
    cyrilix/rabbitmq-mqtt                       RabbitMQ MQTT Adapter                           9                                       [OK]
    arm64v8/rabbitmq                            RabbitMQ is an open source multi-protocol me…   8                                       
    arm32v7/rabbitmq                            RabbitMQ is an open source multi-protocol me…   7                                       
    gonkulatorlabs/rabbitmq                     DEPRECATED: See maryville/rabbitmq              5                                       [OK]
    heidiks/rabbitmq-delayed-message-exchange   RabbitMQ with the compatible version of the …   4                                       [OK]
    pivotalrabbitmq/rabbitmq-server-buildenv    Image used to build and test RabbitMQ server…   4                                       
    pivotalrabbitmq/rabbitmq-autocluster        RabbitMQ with the rabbitmq-autocluster plugi…   3                                       
    deadtrickster/rabbitmq_prometheus           RabbitMQ + Prometheus RabbitMQ Exporter plug…   2                                       
    riftbit/rabbitmq                            RabbitMQ 3.x Container based on Alpine Linux…   2                                       
    henrylv206/rabbitmq-autocluster             RabbitMQ Cluster                                2                                       [OK]
    foxylion/rabbitmq                           Preconfigured RabbitMQ docker image with sup…   1                                       [OK]
    rabbitmqoperator/cluster-operator           The RabbitMQ Cluster Operator Docker Image      1                                       
    i386/rabbitmq                               RabbitMQ is an open source multi-protocol me…   1                                       
    activatedgeek/rabbitmqadmin                 A rabbitmqadmin docker image for administrat…   1                                       [OK]
    amd64/rabbitmq                              RabbitMQ is an open source multi-protocol me…   1                                       
    ekesken/rabbitmq                            docker image for rabbitmq that is configurab…   1                                       [OK]
    webhostingcoopteam/rabbitmq-conf            RabbitMQ Configurator for Rancher               1                                       [OK]
    s390x/rabbitmq                              RabbitMQ is an open source multi-protocol me…   0                                       
    ppc64le/rabbitmq                            RabbitMQ is an open source multi-protocol me…   0                                       
    pdffiller/rabbitmq                          Rabbitmq 3.7.3 with delayed_message plugin,c…   0                                       
    dubc/rabbitmq-alpine-all-plugins            Additions are that the following plugins are…   0                                       [OK]
    
    
  2. docker pull rabbitmq:management

  3. 创建容器并启动

    docker run -d \
    --name rabbitmq \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=admin \
    -p 15672:15672 -p 5672:5672
    

    RABBITMQ_DEFAULT_USER/PASS:RabbitMQ登录账号/密码

    15672:web管理端端口

    5672:服务端口

  4. 进入rabbitmq开始管理页面权限(如果pull的不是management才需要这一步)

    docker exec -it xxxx

    rabbitmq-plugins enable rabbitmq_management

    root@068122284c43:/# rabbitmq-plugins enable rabbitmq_management
    Enabling plugins on node rabbit@068122284c43:
    rabbitmq_management
    The following plugins have been configured:
      rabbitmq_management
      rabbitmq_management_agent
      rabbitmq_prometheus
      rabbitmq_web_dispatch
    Applying plugin configuration to rabbit@068122284c43...
    The following plugins have been enabled:
      rabbitmq_management
    
    started 1 plugins.
    
    

7. 安装Elasticsearch

  1. docker search elasticsearch

  2. docker pull elasticsearch:xxx

    如果下载指定版本的在:后写对应版本即可;如果不写版本docker pull elasticsearch默认下载最新的

  3. 配置环境

    mkdir -p /myfile/elasticsearch/config
    mkdir -p /myfile/elasticsearch/data
    chmod -R 777 /myfile/elasticsearch/
    echo "http.host: 0.0.0.0" >> /myfile/elasticsearch/config/elasticsearch.yml
    
    
  4. 启动

    docker run \
    --name elasticsearch \
    -p 9200:9200 -p 9300:9300 \
    -e "discovey.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
    -v /myfile/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/confg/elasticsearch.yml \
    -v /myfile/elasticsearch/data:/usr/share/elasticsearch/data \
    -v /myfile/elasticsearch/plugins:/usr/share/elascitsearch/plugins \
    -d elasticsearch:2.4.0
    

8.安装Kibana

ElasticSearch 前端管理页面

  1. 查找

    $ docker search kibana
    
  2. 拉取

    $ docker pull kibana
    

    不写版本好默认拉取最新版本

  3. 配置

    $ mkdir -p /myfile/kibana
    $ chmod 777 /myfile/kibana
    $ echo "server.host: 0.0.0.0" >> /myfile/kibana/kibana.yml
    $ echo "elasticsearch.hosts: http://esip:9200" >> /myfile/kibana/kibana.yml
    

    * esip 换为es服务ip即可,端口改为es服务端口

  4. 启动

    $ docker run --name kibana \
    -v /myfile/kibana/kibana.yml:/usr/share/kibana/config/kinana.yml \
    -p 5601:5601 -d kibana
    

可以省略配置步骤(3),在启动的时候指定es服务也可以:

$ docker run --name kibana \
-p 5601:5601 \
--link elasticsearch -e "elasticsearch_url=172.10.6.37:9200" \
-d kibana

本地镜像发布到阿里云流程

在这里插入图片描述

镜像的生成方法

  1. 前面的DockerFile

  2. 容器创建一个新的镜像

    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

    参数说明:

    参数说明
    -a提交的镜像作者
    -m提交时的说明文字

    示例:

    docker commit -a sxh -m "new mycentos 1.4 from 1.3" 容器ID mycentos:1.4

    在这里插入图片描述

将本地镜像推送到阿里云

本地镜像素材原型

在这里插入图片描述

阿里云开发者平台

https://cr.console.aliyun.com/cn-hangzhou/instances/namespaces

创建仓库镜像

  1. 命名空间

    在这里插入图片描述

  2. 仓库名称

    在这里插入图片描述

    在这里插入图片描述

将仓库推送到registry

在这里插入图片描述

$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]

  1. 登录

    $ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
    

    在这里插入图片描述

  2. 设置推送的镜像和版本号

    在这里插入图片描述

    $ sudo docker tag dafeebe539bf registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1
    
  3. 开始推送到阿里云

    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1
    

    在这里插入图片描述

    在这里插入图片描述

公有云可以查询到

可以在阿里云中搜索上传的镜像

在这里插入图片描述

查看详情

在这里插入图片描述

将阿里云上的镜像下载到本地

docker pull 镜像详情中的地址:版本号

/esip:9200" >> /myfile/kibana/kibana.yml


\* esip 换为es服务ip即可,端口改为es服务端口

4. 启动

```shell
$ docker run --name kibana \
-v /myfile/kibana/kibana.yml:/usr/share/kibana/config/kinana.yml \
-p 5601:5601 -d kibana

可以省略配置步骤(3),在启动的时候指定es服务也可以:

$ docker run --name kibana \
-p 5601:5601 \
--link elasticsearch -e "elasticsearch_url=172.10.6.37:9200" \
-d kibana

本地镜像发布到阿里云流程

[外链图片转存中…(img-S3sOkW1l-1677034910739)]

镜像的生成方法

  1. 前面的DockerFile

  2. 容器创建一个新的镜像

    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

    参数说明:

    参数说明
    -a提交的镜像作者
    -m提交时的说明文字

    示例:

    docker commit -a sxh -m "new mycentos 1.4 from 1.3" 容器ID mycentos:1.4

    [外链图片转存中…(img-kTcvd355-1677034910739)]

将本地镜像推送到阿里云

本地镜像素材原型

[外链图片转存中…(img-fIhwjeiK-1677034910739)]

阿里云开发者平台

https://cr.console.aliyun.com/cn-hangzhou/instances/namespaces

创建仓库镜像

  1. 命名空间

    [外链图片转存中…(img-tVG6rkA9-1677034910739)]

  2. 仓库名称

    [外链图片转存中…(img-tJlOFORZ-1677034910740)]

    [外链图片转存中…(img-1bmpXGui-1677034910740)]

将仓库推送到registry

[外链图片转存中…(img-WyyUUDYQ-1677034910740)]

$ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:[镜像版本号]

  1. 登录

    $ sudo docker login --username=橙汁儿drk registry.cn-hangzhou.aliyuncs.com
    

    [外链图片转存中…(img-6NrBv6KI-1677034910741)]

  2. 设置推送的镜像和版本号

    [外链图片转存中…(img-qgDy8RgT-1677034910741)]

    $ sudo docker tag dafeebe539bf registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1
    
  3. 开始推送到阿里云

    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/sxh_centos/mycentos:1.4.1
    

    [外链图片转存中…(img-SPlPGvk9-1677034910741)]

    [外链图片转存中…(img-O8mneL9l-1677034910741)]

公有云可以查询到

可以在阿里云中搜索上传的镜像

[外链图片转存中…(img-BRcrXaMK-1677034910741)]

查看详情

[外链图片转存中…(img-8heR8QIY-1677034910741)]

将阿里云上的镜像下载到本地

docker pull 镜像详情中的地址:版本号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值