• docker学习总结(流水线、redis集群、网络待)


    1,概述

    虚拟化技术:容器(应用层)、虚拟机(软件层)

    docker:隔离,镜像占用资源小,秒级
    vm:GB级
    

    docker基于Go语言开发的
    image-20211128181747806

    2,docker基础

    2.1,架构

    image-20211128181747806
    图1 架构图

    镜像(image)

    ​ docker镜像就像一个模板,例如:redis镜像》run》redis容器(对外提供服务)

    ​ 一个镜像可以创建多个容器!!!

    容器(container)

    ​ 利用容器技术独立运行一个或者一组应用,通过镜像创建

    ​ 启动、停止、删除

    仓库(repository):类似github、gitlab代码仓库

    ​ 存放镜像的地方:公有仓库和私有仓库

    2.2,安装docker

    image-20211128200047202
    图2 查看自己的服务器内核情况

    image-20211128200047202
    图3 通过数据库

    # 1,先删除老版本
    sudo apt-get remove docker docker-engine docker.io containerd runc
    
    # 2,设置仓库
    sudo apt-get update
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
        
    # 3,直接进入阿里云docker加速镜像设置国内的镜像地址(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://g8kfoxhi.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    # 4,安装docker
     sudo apt-get update
     sudo apt-get install docker-ce docker-ce-cli containerd.io
    
    # 5,查看是否安装成功(执行hello-world程序)
    docker search hello-world
    docker pull hello-world
    docker run hello-world
    
    # 其他 docker的资源路径
    /var/lib/docker 
    # 如果想要协助该资源则可以直接
    rm -rf /var/lib/docker
    

    2.3,docker hello-world启动流程

    image-20211129000700013
    图4 docker镜像启动流程

    2.4,底层原理

    docker是怎么工作?

    ​ docker是一个Client-Server结构的系统,docker的守护进程运行在主机上。通过socket从客户端访问!

    image-20211129000700013

    图5 docker底层

    docker为什么比虚拟机快?

    ​ 1,docker只在应用层进行抽象

    ​ 2,docker(秒级别)利用的是宿主机的内核,vm(分钟级别)需要Guest OS

    ​ 所以说,新建一个容器的时候,docker不需要像虚拟机那样重新加载一个操作系统内核,避免引导!

    image-20211129000700013
    图6 虚拟机与docker架构区别

    image-20211129001110317
    图7 docker与虚拟机的性能差异
    备注:当前docker也支持全平台

    2.5,docker常用命令

    帮助命令

    docker version		# 显示版本
    docker info				# 系统信息
    docker [命令] --help			# 帮忙命令
    
    

    镜像命令

    docker images			# 查看所有镜像
    
    REPOSITORY 
    

    搜索

    docker search [namelike]
    
    Options:
      -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print search using a Go template
          --limit int       Max number of search results (default 25)
          --no-trunc        Don't truncate output
    

    下载

    docker pull [name]			# 如果不写tag,默认就是latest
    
    Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    Pull an image or a repository from a registry
    Options:
      -a, --all-tags                Download all tagged images in the repository
          --disable-content-trust   Skip image verification (default true)
          --platform string         Set platform if server is multi-platform capable
      -q, --quiet                   Suppress verbose output
      
    例如:
    docker pull mysql
    docker pull docker.io/library/mysql:latest  # 等价
    

    删除镜像

    docker rmi -f ${docker images -qa} # 删除所有
    docker rmi -f [镜像id 镜像id ...] # 删除单个或多个
    

    容器命令

    docker run [可选参数] image
    --name 		#容器名称
    -d				#后台方式运行
    -it 			#使用交换方式运行,进入容器查看内容
    -p				#指定容器的端口 例如 -p 8080:8080
    	-p ip:主机端口:容器端口
    	-p 主机端口:容器端口(常用)
    -P				#随机一个端口
    
    # 测试centos
    [root@iZbp1jbs6mikemed8a6mooZ:~]# docker run -it centos /bin/bash
    [root@9f7972f753e0 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@9f7972f753e0 /]# exit
    
    

    列出所有运行的容器

    docker ps #显示所有正在运行的容器
    docker ps -a #显示所有容器
    docker ps -n #显示n个
    docker ps -q #只显示id
    
    

    退出容器

    exit #直接容器停止退出
    ctrl +p +q
    

    删除容器

    docker rm [id] #只能删除未运行
    docker rm -f [id] #强制删除所有容器
    docker rm -f ${docker ps -aq}	#强制删除所有容器
    docker ps -a -q|xargs docker rm	#删除所有容器
    

    启动和停止容器

    docker start [id]
    docker restart [id]
    docker stop [id]
    docker kill [id]	#强制停止
    

    常用的其他命令

    docker run -d [name]	# 后台启动
    # 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
    
    

    日志

    Usage:  docker logs [OPTIONS] CONTAINER
    
    Fetch the logs of a container
    
    Options:
          --details        Show extra details provided to logs
      -f, --follow         Follow log output
          --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
      -n, --tail string    Number of lines to show from the end of the logs (default "all")
      -t, --timestamps     Show timestamps
          --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
          
    # 样例
    docker logs -f -t --tail 100 ba8c6c794fae	# 查看最近的100条日志
    docker logs -ft  ba8c6c794fae	# 查看最近的100条日志
    docker run -d centos /bin/sh -c "while true;do echo wanyu;sleep 1;done"
    

    查看容器中的进程信息

    [root@iZbp1jbs6mikemed8a6mooZ:~]# docker top acba17f136c3
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                859775              859753              0                   Nov29               ?                   00:00:00            nginx: master process nginx -g daemon off;
    systemd+            859834              859775              0                   Nov29               ?                   00:00:00            nginx: worker process
    systemd+            859835              859775              0                   Nov29               ?                   00:00:00            nginx: worker process
    

    查看docker中容器的状态

    docker stats
    CONTAINER ID   NAME                  CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
    1196c69ed611   webdav-aliyundriver   1.86%     404.3MiB / 7.429GiB   5.32%     151MB / 144MB     49.2kB / 152kB    48
    6cde4548c0a8   consul                0.15%     22.07MiB / 7.429GiB   0.29%     289kB / 8.53MB    12.8MB / 478MB    10
    3fe6fe9b36e0   zipkin                0.18%     262.2MiB / 7.429GiB   3.45%     190kB / 4.79MB    58.7MB / 86kB     48
    acba17f136c3   nginx                 0.00%     5.898MiB / 7.429GiB   0.08%     109kB / 118kB     3.96MB / 0B       5
    ba8c6c794fae   rabbitmq              0.17%     111.6MiB / 7.429GiB   1.47%     1.42MB / 4.9MB    8.44MB / 94.2kB   25
    3457dfb68671   postgres              0.00%     28.11MiB / 7.429GiB   0.37%     671kB / 533kB     14.7MB / 249MB    7
    1ba5c5143b3c   redis-test            0.27%     7.52MiB / 7.429GiB    0.10%     468kB / 947kB     3.74MB / 24.6kB   5
    b4e6a28e2ec3   nexus                 0.64%     1.572GiB / 7.429GiB   21.17%    5.06MB / 18.5MB   6.34MB / 308MB    106
    

    查看容器的信息

    Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]
    
    Return low-level information on Docker objects
    
    Options:
      -f, --format string   Format the output using the given Go template
      -s, --size            Display total file sizes if the type is container
          --type string     Return JSON for specified type
    
    点击查看docker inspect [id]
    
    [root@iZbp1jbs6mikemed8a6mooZ:~]# docker inspect ba8c6c794fae
    [
        {
            "Id": "ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9",
            "Created": "2021-11-15T01:00:05.26730652Z",
            "Path": "docker-entrypoint.sh",
            "Args": [
                "rabbitmq-server"
            ],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 245415,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2021-11-28T14:55:17.581464973Z",
                "FinishedAt": "2021-11-28T14:55:05.650833939Z"
            },
            "Image": "sha256:a4eb038c2ecb80281487ebbdf40938bbc05ebf976df23ff664dec072aad5546a",
            "ResolvConfPath": "/var/lib/docker/containers/ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9/hostname",
            "HostsPath": "/var/lib/docker/containers/ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9/hosts",
            "LogPath": "/var/lib/docker/containers/ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9/ba8c6c794faed04c6d72d5fe44ee81856ee786175325c33bb99899cab2e54ea9-json.log",
            "Name": "/rabbitmq",
            "RestartCount": 0,
            "Driver": "overlay2",
            "Platform": "linux",
            "MountLabel": "",
            "ProcessLabel": "",
            "AppArmorProfile": "docker-default",
            "ExecIDs": null,
            "HostConfig": {
                "Binds": null,
                "ContainerIDFile": "",
                "LogConfig": {
                    "Type": "json-file",
                    "Config": {}
                },
                "NetworkMode": "default",
                "PortBindings": {
                    "15672/tcp": [
                        {
                            "HostIp": "",
                            "HostPort": "15672"
                        }
                    ],
                    "5672/tcp": [
                        {
                            "HostIp": "",
                            "HostPort": "5672"
                        }
                    ]
                },
                "RestartPolicy": {
                    "Name": "always",
                    "MaximumRetryCount": 0
                },
                "AutoRemove": false,
                "VolumeDriver": "",
                "VolumesFrom": null,
                "CapAdd": null,
                "CapDrop": null,
                "CgroupnsMode": "host",
                "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/e9c85a92ac0b77f7cde594a77161a09da13466171602e9d25523f5d19b3b16eb-init/diff:/var/lib/docker/overlay2/35fd3bcf07f11dcb9411055f9a769cd2c200409f7e5ad7b3bb86310ada66ddaf/diff:/var/lib/docker/overlay2/e0bcd1bcb4c5255bb60b96009ded735001428bd7192eedce421579baad70686d/diff:/var/lib/docker/overlay2/45572bc4887aa6081a5020c0d873ca265db119543390ed1a8c972297246f4774/diff:/var/lib/docker/overlay2/bdeca6a433e28a38697efcf02f2ef67e1f5b7ac6cde5e5969d7c9390da7c9000/diff:/var/lib/docker/overlay2/7d797d0cbba46fcddb2ba1ab7e22332f4470019a41303a7c7d8e586a4dea5c6b/diff:/var/lib/docker/overlay2/500b8c37f7bbf6b8d392e4cd9a1317366d8323a689a115d2bce96b19a8e14c27/diff:/var/lib/docker/overlay2/a58f0d5dd6ece8510c32fab5a508a285888a3e8a1a4bca1c164ae488a507d0dd/diff:/var/lib/docker/overlay2/9c2252ca7416153ddc579aeff11f7195e21d7a0db20b1f74f6d73a0d98c7dbd5/diff:/var/lib/docker/overlay2/62a25cea110c9408ec62c08b3de6e4121aea0b60ff18dd32575b33898a36fece/diff",
                    "MergedDir": "/var/lib/docker/overlay2/e9c85a92ac0b77f7cde594a77161a09da13466171602e9d25523f5d19b3b16eb/merged",
                    "UpperDir": "/var/lib/docker/overlay2/e9c85a92ac0b77f7cde594a77161a09da13466171602e9d25523f5d19b3b16eb/diff",
                    "WorkDir": "/var/lib/docker/overlay2/e9c85a92ac0b77f7cde594a77161a09da13466171602e9d25523f5d19b3b16eb/work"
                },
                "Name": "overlay2"
            },
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "45692529f011e22ffe3b097f4fea2ba54dc305635d4ea056b422143190a684e7",
                    "Source": "/var/lib/docker/volumes/45692529f011e22ffe3b097f4fea2ba54dc305635d4ea056b422143190a684e7/_data",
                    "Destination": "/var/lib/rabbitmq",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
            "Config": {
                "Hostname": "rabbitmqhost",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {
                    "15672/tcp": {},
                    "15691/tcp": {},
                    "15692/tcp": {},
                    "25672/tcp": {},
                    "4369/tcp": {},
                    "5671/tcp": {},
                    "5672/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "RABBITMQ_DEFAULT_USER=admin",
                    "RABBITMQ_DEFAULT_PASS=rabbitmq",
                    "PATH=/opt/rabbitmq/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "OPENSSL_VERSION=1.1.1l",
                    "OPENSSL_SOURCE_SHA256=0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1",
                    "OPENSSL_PGP_KEY_IDS=0x8657ABB260F056B1E5190839D9C4D26D0E604491 0x5B2545DAB21995F4088CEFAA36CEE4DEB00CFE33 0xED230BEC4D4F2518B9D7DF41F0DB4D21C1D35231 0xC1F33DD8CE1D4CC613AF14DA9195C48241FBF7DD 0x7953AC1FBC3DC8B3B292393ED5E9E43F7DF9EE8C 0xE5E52560DD91C556DDBDA5D02064C53641C25E5D",
                    "OTP_VERSION=24.1.5",
                    "OTP_SOURCE_SHA256=a6b28da8a6382d174bb18be781476c7ce36aae792887dc629f331b227dfad542",
                    "RABBITMQ_DATA_DIR=/var/lib/rabbitmq",
                    "RABBITMQ_VERSION=3.9.9",
                    "RABBITMQ_PGP_KEY_ID=0x0A9AF2115F4687BD29803A206B73A36E6026DFCA",
                    "RABBITMQ_HOME=/opt/rabbitmq",
                    "RABBITMQ_LOGS=-",
                    "HOME=/var/lib/rabbitmq",
                    "LANG=C.UTF-8",
                    "LANGUAGE=C.UTF-8",
                    "LC_ALL=C.UTF-8"
                ],
                "Cmd": [
                    "rabbitmq-server"
                ],
                "Image": "rabbitmq",
                "Volumes": {
                    "/var/lib/rabbitmq": {}
                },
                "WorkingDir": "",
                "Entrypoint": [
                    "docker-entrypoint.sh"
                ],
                "OnBuild": null,
                "Labels": {}
            },
            "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "0391b2e391560ec3c1411dbb8a9c2b3c554e7054d4a7eb7043f5ec9d9527dd5a",
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "Ports": {
                    "15672/tcp": [
                        {
                            "HostIp": "0.0.0.0",
                            "HostPort": "15672"
                        },
                        {
                            "HostIp": "::",
                            "HostPort": "15672"
                        }
                    ],
                    "15691/tcp": null,
                    "15692/tcp": null,
                    "25672/tcp": null,
                    "4369/tcp": null,
                    "5671/tcp": null,
                    "5672/tcp": [
                        {
                            "HostIp": "0.0.0.0",
                            "HostPort": "5672"
                        },
                        {
                            "HostIp": "::",
                            "HostPort": "5672"
                        }
                    ]
                },
                "SandboxKey": "/var/run/docker/netns/0391b2e39156",
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "48435f72b1cb9c41ab511f61fdd7a77133af1585b1c63e171dda4c41dc9025c0",
                "Gateway": "172.17.0.1",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.6",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "MacAddress": "02:42:ac:11:00:06",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "2b8b92432a38ddbe5b410f687d5ca9dd37372d552895d571564cadd8b0b93134",
                        "EndpointID": "48435f72b1cb9c41ab511f61fdd7a77133af1585b1c63e171dda4c41dc9025c0",
                        "Gateway": "172.17.0.1",
                        "IPAddress": "172.17.0.6",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "02:42:ac:11:00:06",
                        "DriverOpts": null
                    }
                }
            }
        }
    ]
    

    进入正在运行的容器

    # 通常使用后台执行,进入容器中修改一些配置
    docker exec -it [id] /bin/bash	# 进入容器后开启新的终端
    docker attach [id]							# 进入容器正在执行的终端,不会启动新的终端,退出会关闭!!
    

    文件拷贝

    # 将容器内的文件拷贝到外部
    docker cp 752b54e35d4d:/home/wanyu.java /home
    
    # 拷贝是手动过程,未来使用-v卷的集合可以实现数据打通
    

    image-20211201003720909

    3,练习部署

    3.1,es+kibana

    难点

    1,暴露的端口很多
    2,特别耗费内存
    3,数据一般需要放置到安全目录!挂载
    

    启动命令

    # --net somenetwork ? 网络配置
    docker network create somenetwork
    docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
    
    # elasticsearch特别卡顿
    # 直接访问9200端口查看
    
    点击查看http://ip:9200/
    
    {
      "name" : "ab061e45a753",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "FubYpwPzT8iksfByFF-i_g",
      "version" : {
        "number" : "7.6.2",
        "build_flavor" : "default",
        "build_type" : "docker",
        "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
        "build_date" : "2020-03-26T06:34:37.794943Z",
        "build_snapshot" : false,
        "lucene_version" : "8.4.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    
    # 增加内存限制
    docker run -d --name elasticsearch2 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"  elasticsearch:tag
    
    点击查看docker stats
    
    CONTAINER ID   NAME                  CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
    9620da899a40   elasticsearch2        0.20%     219.4MiB / 7.429GiB   2.88%     876B / 0B         164kB / 156kB     36
    1196c69ed611   webdav-aliyundriver   0.14%     404.5MiB / 7.429GiB   5.32%     155MB / 147MB     49.2kB / 152kB    48
    6cde4548c0a8   consul                0.26%     21.91MiB / 7.429GiB   0.29%     289kB / 8.53MB    12.9MB / 479MB    10
    3fe6fe9b36e0   zipkin                3.13%     261.7MiB / 7.429GiB   3.44%     190kB / 4.79MB    58.8MB / 86kB     49
    acba17f136c3   nginx                 0.00%     6.023MiB / 7.429GiB   0.08%     110kB / 119kB     5.82MB / 0B       5
    ba8c6c794fae   rabbitmq              0.18%     112MiB / 7.429GiB     1.47%     1.44MB / 5.44MB   8.93MB / 94.2kB   25
    3457dfb68671   postgres              0.00%     28.41MiB / 7.429GiB   0.37%     671kB / 533kB     14.8MB / 250MB    7
    1ba5c5143b3c   redis-test            0.15%     7.656MiB / 7.429GiB   0.10%     470kB / 973kB     4.07MB / 24.6kB   5
    b4e6a28e2ec3   nexus                 0.53%     1.572GiB / 7.429GiB   21.16%    5.06MB / 18.5MB   6.35MB / 309MB    106
    

    image-20211201233830885

    直接使用外部的ip地址连接也可以

    3.2,部署portainer

    docker run -d -p 8082:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    直接访问ip:8082即可
    

    image-20211201235649927

    具体可参考链接3

    注意:不要贸然放开2375 端口,除非你想被docker中的挖矿病毒入侵!!!

    4,docker镜像原理

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

    4.1,UnionFS(联合文件系统)

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

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

    4.2,docker镜像加载原理

    ​ docker镜像用我自己的话说就是盖楼房一样,一层一层的搭建,先是地基(bootfs)、一层(rootfs)、二层、......n层。-万雨

    ​ 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就是各种不同的操作系统发行版。

    image-20211202232842123

    核心点:由于unionFS的缘故,docker上层的东西可以共用下层相同的文件,所以使得docker很轻巧!!!

    image-20211202233221081

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

    ​ 虚拟机是分钟级别,容器是秒级!

    4.3,分层原理

    ​ 下载一个镜像里面是由很多层(layer)的,分层下载、共有!

    docker image inspect redis #注意其中的layers
    
    点击查看docker image inspect redis
    
    [
        {
            "Id": "sha256:02c7f2054405dadaf295fac7281034e998646996e9768e65a78f90af62218be3",
            "RepoTags": [
                "redis:latest"
            ],
            "RepoDigests": [
                "redis@sha256:e595e79c05c7690f50ef0136acc9d932d65d8b2ce7915d26a68ca3fb41a7db61"
            ],
            "Parent": "",
            "Comment": "",
            "Created": "2021-09-03T13:26:48.395038582Z",
            "Container": "3627b30c1a4cf3ef703e0516beee6428efe1b08a5314f5f106b84250635809cb",
            "ContainerConfig": {
                "Hostname": "3627b30c1a4c",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {
                    "6379/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "GOSU_VERSION=1.12",
                    "REDIS_VERSION=6.2.5",
                    "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
                    "REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
                ],
                "Cmd": [
                    "/bin/sh",
                    "-c",
                    "#(nop) ",
                    "CMD [\"redis-server\"]"
                ],
                "Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
                "Volumes": {
                    "/data": {}
                },
                "WorkingDir": "/data",
                "Entrypoint": [
                    "docker-entrypoint.sh"
                ],
                "OnBuild": null,
                "Labels": {}
            },
            "DockerVersion": "20.10.7",
            "Author": "",
            "Config": {
                "Hostname": "",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {
                    "6379/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "GOSU_VERSION=1.12",
                    "REDIS_VERSION=6.2.5",
                    "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
                    "REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
                ],
                "Cmd": [
                    "redis-server"
                ],
                "Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
                "Volumes": {
                    "/data": {}
                },
                "WorkingDir": "/data",
                "Entrypoint": [
                    "docker-entrypoint.sh"
                ],
                "OnBuild": null,
                "Labels": null
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 105408201,
            "VirtualSize": 105408201,
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/e85c9d4bafcf1c40dcf4c7267ca818d50c2f45431a0d1653a66bb68a2dca9137/diff:/var/lib/docker/overlay2/89f9dfc82617f584b5c188baed7551df3fbf3b3bd63a80304d10052e31e8fb84/diff:/var/lib/docker/overlay2/35ec30c65570785f546b2f7bee4c01b0de4ab167ec80d9be38b0a0b2828e5723/diff:/var/lib/docker/overlay2/94e27980d165ce69590d62121ae8e0bb3a10a0ee0964a1e3b0e6d006731b8535/diff:/var/lib/docker/overlay2/424f20b09e163cec1a6802233c76cdf1c5c0e46c32acec0dcf7aa4c9f8efd5c4/diff",
                    "MergedDir": "/var/lib/docker/overlay2/25abbc429add8302f431fdbefb3dd5b55370129f5de3a53f450aa9ea10dfc47b/merged",
                    "UpperDir": "/var/lib/docker/overlay2/25abbc429add8302f431fdbefb3dd5b55370129f5de3a53f450aa9ea10dfc47b/diff",
                    "WorkDir": "/var/lib/docker/overlay2/25abbc429add8302f431fdbefb3dd5b55370129f5de3a53f450aa9ea10dfc47b/work"
                },
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:d000633a56813933cb0ac5ee3246cf7a4c0205db6290018a169d7cb096581046",
                    "sha256:bdad86443e47c5665683ac41c1f24f28479d830d7e3cc47d0a337ee5166c7714",
                    "sha256:6a7992ac480029d82b7dbb757d16fe5d023aa283ed32b52267cd1fe9e6b73c49",
                    "sha256:be43d2475cf809c0f2ec31950e849d0f888f3121970fd99196a11a903f8c3820",
                    "sha256:be5818ef2907adfe19be14bf66647b5fb5a2029143f9297f8ce1ff1fd1d35753",
                    "sha256:c54e0c16ea22fa873c12f6a7f3fb4e021bb58d67c292156a6ce6e08637458b7c"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]
    

    image-20211203231440160

    4.4,commit镜像

    docker commit 提交一个容器为新的副本
    # 命令和git原理类似
    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
    

    实战测试

    # 1,启动一个默认的Tomcat
    # 2,发现这个默认的Tomcat是没有webapps应用,镜像
    docker pull tomcat	# 下载Tomcat镜像
    docker run -d -p 8080:8080 tomcat	# 后台模式运行
    docker exec -it [id] /bin/bash	# 进入操作台
    
    # 3,将自己的文件拷贝进去
    cd /usr/local/tomcat
    cp -r webapps.dist/* webapps
    
    # 4,将改动后的文件commit为一个镜像
    

    查看8080端口页面

    image-20211203235034378

    将上述修改后的镜像重新打包!

    image-20211203235317457

    # 使用docker inspect [镜像id] 查看原始镜像layer和重新提交的layer数据差异!
    
    

    image-20211204001322997

    5,容器数据卷

    5.1,命令

    ​ docker的理念是将应用和环境打包成一个镜像!(但是,数据也打包成镜像就不太好吧!数据丢失!)

    ​ 容器之间可以有一个数据共享技术!docker容器中产生的数据,同步到本地!

    ​ 卷技术-目录挂载,将容器中的目录挂载到Linux中的目录中!

    1,容器持久化和同步操作;
    2,容器间也可以进行数据共享!
    

    image-20211204002839910

    docker run -it -v  /home/docker_v:/home centos /bin/bash
    docker inspect [容器id]
    

    image-20211204125942720

    5.2,实战:mysql

    docker pull mysql
    docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=你自己设置的数据库密码 --name mysql-wanyu mysql
    
    # 下面的是官方测试
    docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    

    ​ 使用dbeaver直接连接mysql成功!注意需要修改其中的allowPublicKeyRetrieval=true配置!

    image-20211204211856125

    ​ 直接在mysql中创建一个新的数据库时,由于容器数据卷技术本地目录会有test库相关文件变更

    image-20211204212234197

    5.3,具名和匿名挂载

    # 匿名挂载
    -v 容器路径!
    
    docker run -d -P --name nginx01 -v /etc/nginx nginx		# 匿名挂载(待测试)
    docker run -d -P --name nginx02 -v nginx-wanyu:/etc/nginx nginx		# 具名挂载
    
    docker volume ls # 查看数据卷情况
    # 这个可以发现volume name中会有相关的匿名挂载
    

    image-20211205000821700

    查看匿名挂载的目录

    docker inspect [容器id]
    

    image-20211205101241850

    image-20211205101345473

    docker volume inspect nginx-wanyu

    image-20211205001112131

    如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
    -v 容器路径 							# 匿名挂载
    -v 卷名:容器内路径					# 具名挂载
    -v /宿主机路径:容器内路径		# 指定路径挂载
    
    拓展:
    # 通过 -v 容器内路径:ro rw 改变读写权限
    # ro readonly
    # rw readwrite
    docker run -d -P --name nginx03 -v nginx-wanyu:/etc/nginx:ro nginx
    docker run -d -P --name nginx03 -v nginx-wanyu:/etc/nginx:rw nginx
    

    5.4,打包样例centos(展示volume特性)

     # 创建一个dockerfile文件,名字可以随机 建议Dockerflie
     # 文件中的内容 指令(大写)
     
     FROM centos
     
     VOLUME ["/volume01","/volume02"]
     
     CMD echo "----end-----"
     CMD /bin/bash
     
     # 里面每一个命令就是镜像的一层
     docker build -f /home/docker-test-volume/dockerfile1 -t wanyu/centos:1.0 .
    

    image-20211205122016930

    image-20211205123610303

    image-20211205123533129

    5.5,数据卷容器

    多个centos同步数据

    docker run -it --name docker01 wanyu/centos:1.0
    docker run -it --name docker02 --volumes-from docker01 wanyu/centos:1.0
    
    # 此时两个容器的自定义数据卷是共享的!(通过--volumes-from创建的容器,其数据是共享的)
    
    docker01中的volume是匿名数据卷,删除docker01,其他的容器数据卷不受影响!
    

    image-20211205203957763

    多个mysql实现数据共享(当前不好实现!)

    docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=activeclub --name mysql-wanyu01 mysql
    
    docker run -d -P -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
    docker run -d -P -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql
    
    docker run -d -P --volumes-from mysql02 -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql
    
    
    docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=activeclub --name mysql-wanyu0 mysql
    
    docker run -d -p 3311:3306 --volumes-from mysql-wanyu0 -e MYSQL_ROOT_PASSWORD=activeclub --name mysql-wanyu1 mysql
    

    报错

    image-20211205221528192

    好像会因为这个数据卷已经被其他容器读写中,导致本次读写被拒绝了!

    当前的情况是:只有关闭原有的mysql-wanyu0容器,才能正常使用mysql-wanyu1

    6,DockerFile

    DockerFile就是用来构建docker镜像的构建文件!命令脚本

    通过这个脚本可以生成镜像,镜像是一层层的,脚本的一个个的命令

    6.1,基础知识

    构架步骤:

    1,编写一个dockerfile文件
    2,docker build构建成一个镜像
    3,docker run 运行镜像
    4,docker push 发布镜像(dockerHub、阿里云镜像仓库)
    

    image-20211205224813763

    ​ dockerfile是面向开发的,以后要发布项目,做镜像,需要编写dockerfile文件,这个文件十分简单!

    ​ docker镜像逐渐成为企业交付的标准,必须掌握!

    dockerfile:构建文件,构建了一切的步骤,源代码(编译链)
    docker image:通过dockerfile构建生成的镜像,最终发布和运行的产品,原来是jar、war,后续就是直接docker镜像部署
    docker container:容器就是镜像运行起来提供服务的组件!
    

    6.2,dockerfile命令

    1,每个保留关键字(指令)都必须是大写
    2,执行是从上到下
    3,# 表示注释
    4,每个指令都会创建提交一个新的镜像,并提交
    
    FROM 			 			# 基础进行,一切从这里开始构建
    MAINTAINER			# 镜像的作者,姓名+邮箱
    RUN 						# 镜像构建的时候需要运行的命令
    ADD							# 步骤,添加内容 
    WORKDIR					# 镜像的工作目录
    VOLUME					# 挂载的数据卷
    EXPOSE					# 暴露端口配置 
    CMD							# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT			# 指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD					# 当构建一个被继承的dockerfile,这个时候就会运行ONBUILD,触发指令
    COPY						# 类似ADD,将我们的文件拷贝到镜像中
    ENV							# 构建的时候设置环境变量,设置内存大小或者其他环境参数
    

    image-20211205231402549

    6.3,实战:centos

    ​ docker hub中99%的镜像都是以FROM scratch开始!然后配置需要的软件和配置来构建的

    image-20211205232418618

    image-20211205232446211

    任务:构建一个带有vim、ifconfig命令的centos镜像

    # 1。编写dockerfile的文件dockerfile-centos
    FROM centos
    MAINTAINER wanyu<XXXXXX@qq.com>
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "----end----"
    CMD /bin/bash
    
    # 2,通过dockerfile文件构建镜像
    docker build -f dockerfile-centos -t wanyu-centos:1.0 .
    
    点击查看docker stats
    
    [root@iZbp1jbs6mikemed8a6mooZ:/home/dockerfile-test]# docker build -f dockerfile-centos -t wanyu-centos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/10 : FROM centos
     ---> 5d0da3dc9764
    Step 2/10 : MAINTAINER wanyu
     ---> Running in e6809c7dd314
    Removing intermediate container e6809c7dd314
     ---> 0ea1bdd2f8ec
    Step 3/10 : ENV MYPATH /usr/local
     ---> Running in 68267f5b4fe0
    Removing intermediate container 68267f5b4fe0
     ---> 62d54a07b103
    Step 4/10 : WORKDIR $MYPATH
     ---> Running in cc5b572d010f
    Removing intermediate container cc5b572d010f
     ---> 1ea33fe2b5ef
    Step 5/10 : RUN yum -y install vim
     ---> Running in 538d3635db9a
    CentOS Linux 8 - AppStream                      771 kB/s | 8.2 MB     00:10    
    CentOS Linux 8 - BaseOS                         4.3 MB/s | 3.5 MB     00:00    
    CentOS Linux 8 - Extras                          19 kB/s |  10 kB     00:00    
    Dependencies resolved.
    ================================================================================
     Package             Arch        Version                   Repository      Size
    ================================================================================
    Installing:
     vim-enhanced        x86_64      2:8.0.1763-16.el8         appstream      1.4 M
    Installing dependencies:
     gpm-libs            x86_64      1.20.7-17.el8             appstream       39 k
     vim-common          x86_64      2:8.0.1763-16.el8         appstream      6.3 M
     vim-filesystem      noarch      2:8.0.1763-16.el8         appstream       49 k
     which               x86_64      2.21-16.el8               baseos          49 k
    Transaction Summary
    ================================================================================
    Install  5 Packages
    Total download size: 7.8 M
    Installed size: 30 M
    Downloading Packages:
    (1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm        231 kB/s |  39 kB     00:00    
    (2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 475 kB/s |  49 kB     00:00    
    (3/5): which-2.21-16.el8.x86_64.rpm             389 kB/s |  49 kB     00:00    
    (4/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm  652 kB/s | 1.4 MB     00:02    
    (5/5): vim-common-8.0.1763-16.el8.x86_64.rpm    527 kB/s | 6.3 MB     00:12    
    --------------------------------------------------------------------------------
    Total                                           563 kB/s | 7.8 MB     00:14     
    warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
    CentOS Linux 8 - AppStream                      1.6 MB/s | 1.6 kB     00:00    
    Importing GPG key 0x8483C65D:
     Userid     : "CentOS (CentOS Official Signing Key) "
     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-16.el8.x86_64                               1/5 
      Installing       : vim-filesystem-2:8.0.1763-16.el8.noarch                2/5 
      Installing       : vim-common-2:8.0.1763-16.el8.x86_64                    3/5 
      Installing       : gpm-libs-1.20.7-17.el8.x86_64                          4/5 
      Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64                          4/5 
      Installing       : vim-enhanced-2:8.0.1763-16.el8.x86_64                  5/5 
      Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64                  5/5 
      Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64                    5/5 
      Verifying        : gpm-libs-1.20.7-17.el8.x86_64                          1/5 
      Verifying        : vim-common-2:8.0.1763-16.el8.x86_64                    2/5 
      Verifying        : vim-enhanced-2:8.0.1763-16.el8.x86_64                  3/5 
      Verifying        : vim-filesystem-2:8.0.1763-16.el8.noarch                4/5 
      Verifying        : which-2.21-16.el8.x86_64                               5/5 
    Installed:
      gpm-libs-1.20.7-17.el8.x86_64         vim-common-2:8.0.1763-16.el8.x86_64    
      vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
      which-2.21-16.el8.x86_64             
    Complete!
    Removing intermediate container 538d3635db9a
     ---> 6e05fa365556
    Step 6/10 : RUN yum -y install net-tools
     ---> Running in 37e396baef2f
    Last metadata expiration check: 0:00:23 ago on Sun Dec  5 15:38:25 2021.
    Dependencies resolved.
    ================================================================================
     Package         Architecture Version                        Repository    Size
    ================================================================================
    Installing:
     net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 k
    Transaction Summary
    ================================================================================
    Install  1 Package
    Total download size: 322 k
    Installed size: 942 k
    Downloading Packages:
    net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   1.5 MB/s | 322 kB     00:00    
    --------------------------------------------------------------------------------
    Total                                           470 kB/s | 322 kB     00:00     
    Running transaction check
    Transaction check succeeded.
    Running transaction test
    Transaction test succeeded.
    Running transaction
      Preparing        :                                                        1/1 
      Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 
      Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 
      Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 
    Installed:
      net-tools-2.0-0.52.20160912git.el8.x86_64                                     
    Complete!
    Removing intermediate container 37e396baef2f
     ---> 6bda7a481d68
    Step 7/10 : EXPOSE 80
     ---> Running in 6d975d602b27
    Removing intermediate container 6d975d602b27
     ---> d79a352bafc1
    Step 8/10 : CMD echo $MYPATH
     ---> Running in 1e98f38f7472
    Removing intermediate container 1e98f38f7472
     ---> 25aa4791b8c4
    Step 9/10 : CMD echo "----end----"
     ---> Running in ab3d6b669573
    Removing intermediate container ab3d6b669573
     ---> 7a046095a7b7
    Step 10/10 : CMD /bin/bash
     ---> Running in 1f30a110730a
    Removing intermediate container 1f30a110730a
     ---> 16fb3dd27c56
    Successfully built 16fb3dd27c56
    Successfully tagged wanyu-centos:1.0
    

    image-20211205234518051

    可以通过docker history [镜像id]查看镜像构建历史

    image-20211205234725584

    例如:postgres的构建历史

    image-20211205234905112

    CMD与ENTRYPOINT区别(待实践)

    测试CMD命令

    image-20211205235546583

    测试ENTRYPOINT命令

    # 直接执行docker run id -l
    

    image-20211205235825636

    ​ 很多命令只有细微的区别,最好的学习就是对比执行效果!

    6.4,实战:Tomcat镜像

    两个关键的文件下载地址

    https://mufasa-blog-images.oss-cn-beijing.aliyuncs.com/img/apache-tomcat-9.0.33.tar.gz

    https://mufasa-blog-images.oss-cn-beijing.aliyuncs.com/img/jdk-8u311-linux-x64.tar.gz

    FROM centos
    MAINTAINER wanyu<xxxx@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u311-linux-x64.tar.gz /usr/local
    ADD apache-tomcat-9.0.33.tar.gz /usr/local
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local/jdk1.8.0_311
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_311
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.33
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD touch /usr/local/apache-tomcat-9.0.33/logs/catalina.out
    CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.33/logs/catalina.out
    
    docker build -t wanyuTomcat .
    
    docker run -d -p 9090:8080 --name wanyuTomcat 1f4f43c5147a
    

    6.5,发布镜像到阿里云

    1,直接登录阿里云,进入控制台搜索镜像服务

    image-20211210151836579

    2,自己创建镜像仓库

    image-20211210151926753

    3,直接在镜像仓库中有类似github仓库的命令教学

    image-20211210152222490

    docker login --username=XXXXX registry.cn-hangzhou.aliyuncs.com			# 登录镜像
    docker pull registry.cn-hangzhou.aliyuncs.com/activeclub/private:[镜像版本号]
    
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/activeclub/private:[镜像版本号]
    docker push registry.cn-hangzhou.aliyuncs.com/activeclub/private:[镜像版本号]
    

    image-20211210154440890

    6.6,将自己的springBoot项目打包docker镜像(待)

    使用阿里云流水线CI/CD持续化集成工具很方便(devops)

    1,构架springboot项目

    2,打包应用

    3,编写dockerfile

    4,构架镜像

    5,发布运行

    流程:
    1,
    
    
    
    
    

    7,Docker网络

    ip addr
    # lo:本机回环地址
    # eth0:阿里云内网地址
    # docker0:docker生成的地址
    
    # 代表三种不同的环境,docker如何处理网络访问?
    

    image-20211210155346286

    veth-path虚拟网络技术
    
    

    image-20211210224400594

    image-20211210225146024

    docker中的所有网络接口都是虚拟的,虚拟的转发效率高!

    高可用问题:
    docker中直接使用类似consul那种服务名注册的形式,以容器名称来代替ip,实现重启动态更换ip但是不用额外更换ip
    
    docker run -d -P --name tomcat02 --link tomcat01 tomcat
    # 之后就可以直接在tomcat02容器中直接
    ping tomcat01
    

    7.3,自定义网络

    docker network ls

    image-20211210231323080

    网络模式:
    bridge:桥接docker(默认,自定义)
    none:不配置网络
    host:和宿主机共享网络
    container:容器网络联调(使用较少,局限较大)
    

    image-20211210231531118

    # 启动命令 --net bridge,这个就是docker0
    docker run -d -P --name tomcat01 tomcat
    docker run -d -P --name tomcat01 --net bridge tomcat 
    
    # docker0特点:默认,域名不能访问,--link可以打通连接
    
    # 可以自定义网络
    # --dirver bridge
    # --subnet 192.168.0.0/16
    # --gateway 192.168.0.1
    docker network create --driver bridge --subnet 192.168.0.0/16 --getway 192.168.0.1 mynet
    

    image-20211210231949194

    image-20211210232251889

    image-20211210232503145

    直接将容器运行在自定义的网络中,同一个网路中的容器之间可以通过名字互相ping通网络!!!
    优势:不同的集群使用不同的网络,保证集群网络是安全和健康的
    

    7.4,网络联通

    image-20211210233120455

    # 测试打通tomcat - mynet
    docker network connect mynet tomcat03
    
    # 联通之后就是tomcat01放到mynet网络下
    # 一个容器两个ip
    # 阿里云服务:公网ip、私网ip
    

    7.5,部署redis集群(待)

    image-20211210234820988

    8,参考链接

    1,https://docs.docker.com/get-started/overview/

    2,遇见狂神说-b站视频

    3,portainer连接远程docker

    4, docker阿里云加速配置

    5,Docker开启远程安全访问

    6,什么是DevOps?

    7,aliyun流水线Flow

    8,jenkins

    探究未知是最大乐趣
  • 相关阅读:
    [svc]二三层数据格式&&三层数据如何匹配路由
    [na][dhcp]dhcp细枝末节&dhcp防攻
    [docker]使用quaaga实现(rip ospf)实现主机间容器互通
    [svc]centos7安装优化最佳姿势
    [svc]gns3模拟器及探讨几个bgp问题
    [svc]ip routing和no ip routing
    [docker]macvlan实现双vlan互通
    Jmeter 日志设置---如何设置java协议中被测jar的日志?
    Jmeter java协议配置文件导入
    eclipse, Log4j配置(真心的详细~)
  • 原文地址:https://www.cnblogs.com/Mufasa/p/15617324.html
Copyright © 2020-2023  润新知