docker

一.介绍

docker是运行在已经运行的linux环境,它是个隔离的小型的程序的运行环境 它共用linux的一些资源,执行效率基本等同于所在linux主机,极大的方便运维与部署

 

 

 

 

二.它的一些优点,为啥选他

总的来说,体积小占内存少只要程序运行需要的东西 移植性好 然后性能高 开发人员做好docker相关配置后 部署时直接拉取镜像 就能创建统一的运行的隔离环境 ——容器

 

三.安装 启动与卸载

centos7安装Docker
1、官网中安装参考手册  https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/
2、确定你是centos7及以上版本 cat  /etc/redhat-release
3、yum安装gcc相关  yum -y install gcc  和 yum -y install gcc-c++
4、卸载旧版本 sudo yum remove docker docker-common  docker-selinux  docker-engine
5、安装需要的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
6、设置stable镜像仓库  sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
7、更新yum软件包索引 sudo yum makecache fast
8、安装docker ce >> sudo yum install docker-ce
9、启动docker  systemctl start docker
10、测试 docker version 和 docker run hello-world

执行helloworld时会判断 本机有镜像没 有就创建容器然后运行 没有就先从仓库拉

卸载

systemctl stop docker

yum -y remove docker-ce

rm -rf /var/lib/docker

四、镜像相关命令

4.1查看

docker images 查看当前所有镜像

-a 查看所有镜像 包含历史的

-q查看所有镜像的id

Last login: Wed Aug 24 19:39:55 2022 from 192.168.56.1
[root@localhost ~]# docker images
REPOSITORY      TAG                 IMAGE ID       CREATED         SIZE
mongo           latest              dfda7a2cf273   8 months ago    693MB
mysql           5.7                 938b57d64674   10 months ago   448MB
redis           latest              7faaec683238   10 months ago   113MB
hello-world     latest              feb5d9fea6a5   11 months ago   13.3kB
flink           1.10.0-scala_2.12   b001a5f6955e   2 years ago     586MB
kibana          7.4.2               230d3ded1abc   2 years ago     1.1GB
elasticsearch   7.4.2               b1179d41a7b4   2 years ago     855MB
nginx           1.10                0346349a1a64   5 years ago     182MB
[root@localhost ~]# docker images -a
REPOSITORY      TAG                 IMAGE ID       CREATED         SIZE
mongo           latest              dfda7a2cf273   8 months ago    693MB
mysql           5.7                 938b57d64674   10 months ago   448MB
redis           latest              7faaec683238   10 months ago   113MB
hello-world     latest              feb5d9fea6a5   11 months ago   13.3kB
flink           1.10.0-scala_2.12   b001a5f6955e   2 years ago     586MB
kibana          7.4.2               230d3ded1abc   2 years ago     1.1GB
elasticsearch   7.4.2               b1179d41a7b4   2 years ago     855MB
nginx           1.10                0346349a1a64   5 years ago     182MB
[root@localhost ~]# docker images -q
dfda7a2cf273
938b57d64674
7faaec683238
feb5d9fea6a5
b001a5f6955e
230d3ded1abc
b1179d41a7b4
0346349a1a64

各字段含义

4.2从镜像仓库中检索镜像

docker search redis 是检索全部redis相关镜像

而通过docker search --help 可以知道 还可以 通过 --limit num 来限定检索stars数最多的前num条

[root@localhost ~]# docker search redis --limit 5
NAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                      Redis is an open source key-value store that…   11282     [OK]       
bitnami/redis              Bitnami Redis Docker Image                      229                  [OK]
circleci/redis             CircleCI images for Redis                       14                   [OK]
redis/redis-stack          redis-stack installs a Redis server with add…   11                   
redis/redis-stack-server   redis-stack-server installs a Redis server w…   9            

4.3从仓库中拉取镜像

docker pull redis就是拉取 redis最新版本镜像就等于docker pull redis:latest

docker pull redis:6.9 就是拉取指定redis版本为 6.9的镜像

4.4查看docker中资源所占空间情况

如下分别是镜像,容器,数据卷,构建缓存所占 空间

[root@localhost ~]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          8         7         3.772GB   787.5MB (20%)
Containers      7         5         859.7MB   0B (0%)
Local Volumes   6         2         470.5MB   134.2MB (28%)
Build Cache     0         0         0B        0B

4.5删除某个镜像

下图是我要删除helloworld镜像 可以根据repository名字或者镜像id删除,如果提示不能删除,

加 -f 可以强制删除

[root@localhost ~]# docker rmi feb5d9fea6a5
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 0ada6f5e1d1a
[root@localhost ~]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

此外删库跑路 像如下 删除多个 一般谨慎使用 特别生产环境

4.6虚玄镜像

了解就好

4.7commit与push

五.容器相关命令

5.1创建与启动与退出容器

i:interative 交互式

t:terminal 终端 

/bin/bash shell 控制台

执行如下命令后相当与在docker中创建了个小 ubuntu容器

[root@localhost ~]# docker run -it ubuntu /bin/bash
root@bcc40acd606c:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

如下命令我们可以看到使用--name 根据同一镜像创建了第二个ubantu容器 

[root@localhost ~]# docker run -it --name secondunbuntucontainer ubuntu bash
root@d0de5c5476a9:/# exit  

5.2 查看容器

使用docker ps -a可以看到我们创建过两个 ubuntu容器

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS                          PORTS                                                                                  NAMES
d0de5c5476a9   ubuntu                "bash"                   About a minute ago   Exited (0) About a minute ago                                                                                          secondunbuntucontainer
bcc40acd606c   ubuntu                "/bin/bash"              8 minutes ago        Exited (127) 3 minutes ago                                                                                             quizzical_mclaren
0ada6f5e1d1a   feb5d9fea6a5          "/hello"                 17 hours ago         Exited (0) 17 hours ago                                                                                                compassionate_grothendieck
efdc8c9c68ef   mongo                 "docker-entrypoint.s…"   8 months ago         Exited (255) 7 months ago       0.0.0.0:27017->27017/tcp, :::27017->27017/tcp                                          mongo
5bc853753904   nginx:1.10            "nginx -g 'daemon of…"   9 months ago         Up 3 days                       0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                             nginx

 还可以加如下选项来进行筛选

5.3启动删除重启强制删除删除多个容器等命令

5.4某容器日志 

docker logs 容器id/名字

5.5查看容器内运行进程以及资源消耗

docker top 容器id/名字

[root@localhost ~]# docker top redis
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             1331                1297                0                   Aug21               ?                   00:04:40            redis-server *:6379

5.6查看容器内部细节

如下 docker inspect 容器id/名字 可以查看这个简易环境的内部信息 比如 主机配置,网络设置等等

[root@localhost ~]# docker inspect redis
[
    {
        "Id": "2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb",
        "Created": "2021-10-28T11:07:56.786345376Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "redis-server",
            "/etc/redis/redis.conf"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1331,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-08-21T14:37:18.184401839Z",
            "FinishedAt": "2022-08-21T14:37:16.540735396Z"
        },
        "Image": "sha256:7faaec68323851b2265bddb239bd9476c7d4e4335e9fd88cbfcc1df374dded2f",
        "ResolvConfPath": "/var/lib/docker/containers/2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb/hostname",
        "HostsPath": "/var/lib/docker/containers/2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb/hosts",
        "LogPath": "/var/lib/docker/containers/2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb/2f800e62d4f1093bed27cd29f4bffb2bd35918f8bac110348f5e98ce77eaa2cb-json.log",
        "Name": "/redis",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/mydata/redis/data:/data",
                "/mydata/redis/conf/redis.conf:/etc/redis/redis.conf"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "6379/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "6379"
                    }
                ]
            },
            "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/69fe4cd37eae73c5dd5001b6a7badaafd75ede48678e78ae3c253161ca4bd66b-init/diff:/var/lib/docker/overlay2/ac8c700336d3794dc8bb41c994746052e3f0295b0701bd72a0daf357a4a11678/diff:/var/lib/docker/overlay2/26dfee7b59392554e5ccc5d0d8298813bbbd33884fa6bf5db8f0c872a8cf0f1c/diff:/var/lib/docker/overlay2/9276527a127f83323c1ca6b6793807f93f569cade50a621c0cfb0ab67e018f8d/diff:/var/lib/docker/overlay2/e323e764522262340f38eaa00de0defe37a421cebc6eb722d39814b66d284154/diff:/var/lib/docker/overlay2/149dde4495b55cfe69206f0f70fcb62fa4c87015248b9ecebcb0ea190626a0f1/diff:/var/lib/docker/overlay2/652d9c4eea6f6a7a71bfd0c9f75811e1a59f37f39751dcee3fece37c753b314d/diff",
                "MergedDir": "/var/lib/docker/overlay2/69fe4cd37eae73c5dd5001b6a7badaafd75ede48678e78ae3c253161ca4bd66b/merged",
                "UpperDir": "/var/lib/docker/overlay2/69fe4cd37eae73c5dd5001b6a7badaafd75ede48678e78ae3c253161ca4bd66b/diff",
                "WorkDir": "/var/lib/docker/overlay2/69fe4cd37eae73c5dd5001b6a7badaafd75ede48678e78ae3c253161ca4bd66b/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/mydata/redis/data",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mydata/redis/conf/redis.conf",
                "Destination": "/etc/redis/redis.conf",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "2f800e62d4f1",
            "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.6",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
                "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
            ],
            "Cmd": [
                "redis-server",
                "/etc/redis/redis.conf"
            ],
            "Image": "redis",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "d194b583802266655aa106ff2e061e50b68279d48c7adf7bb3038195d006daba",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "6379/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "6379"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "6379"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/d194b5838022",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "98937676f9c2ba71ff29db308b399a01fd36a1c95c95aea6ecb3bba9bc33a349",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "7720b280fd25d2f1d1b9f5c41829b59736cb43d4159a22e816916ae17d7f07e0",
                    "EndpointID": "98937676f9c2ba71ff29db308b399a01fd36a1c95c95aea6ecb3bba9bc33a349",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

5.7重新进入容器

前面我们在docker run-it 容器id/name bash运行并进入

容器内部 可以用ctrl+p+q退出容器但是不停止容器

可以看到有如下命令 我们一般执行docker exec -it 容器id/name bash来重新进入容器

[root@localhost ~]# docker exec --help

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
      --env-file list        Read in a file of environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container

 如下代码使用exec 重新进入容器后  用exit退出 容器不会停止运行

[root@localhost ~]# docker exec -it redis bash
root@2f800e62d4f1:/data# ^C
root@2f800e62d4f1:/data# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get 
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> get key
"hello"
127.0.0.1:6379> exit
root@2f800e62d4f1:/data# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                                                                  NAMES
7381f2a045bc   redis                 "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        6379/tcp                                                                               blissful_bouman
d0de5c5476a9   ubuntu                "bash"                   About an hour ago   Up 42 minutes                                                                                              secondunbuntucontainer
5bc853753904   nginx:1.10            "nginx -g 'daemon of…"   9 months ago        Up 4 days           0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                             nginx
a93fde9471cf   elasticsearch:7.4.2   "/usr/local/bin/dock…"   9 months ago        Up 4 days           0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch
f9dae621180b   kibana:7.4.2          "/usr/local/bin/dumb…"   9 months ago        Up 4 days           0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana
2f800e62d4f1   redis                 "docker-entrypoint.s…"   10 months ago       Up About a minute   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                              redis
8c3138489f1b   mysql:5.7             "docker-entrypoint.s…"   10 months ago       Up 4 days           0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                   mysql

5.8备份容器中文件与直接备份容器,导入容器

备份容器内文件

[root@localhost ~]# docker exec -it redis bash
root@2f800e62d4f1:/data# touch tt.txt
root@2f800e62d4f1:/data# ls
appendonly.aof  dump.rdb  tt.txt
root@2f800e62d4f1:/data# exit
exit
[root@localhost ~]# docker cp ^C
[root@localhost ~]# docker cp 2f800e62d4f1:tt.txt /tmp/tt.txt
Error: No such container:path: 2f800e62d4f1:tt.txt
[root@localhost ~]# docker cp 2f800e62d4f1:/tt.txt /tmp/tt.txt 
Error: No such container:path: 2f800e62d4f1:/tt.txt
[root@localhost ~]# docker exec -it redis bash                
root@2f800e62d4f1:/data# pwd
/data
root@2f800e62d4f1:/data# exit
exit
[root@localhost ~]# docker cp 2f800e62d4f1:/data/tt.txt /tmp/tt.txt  
[root@localhost ~]# ll /tmp
total 0
drwx------. 3 root root 17 Aug 21 14:37 systemd-private-cbe823f7b580402784680c1ec50531d7-chronyd.service-wesC3y
-rw-r--r--. 1 root root  0 Aug 25 14:26 tt.txt

导出容器成镜像 

可用作备份 也可以用作容器的拷贝 ,比如我们创建了某容器后想要批量复制它 那么 导出为镜像后

再根据此镜像创建容器 则实现拷贝

5.9根据base 镜像封装 自己的镜像并提交

可以看到我们从docker hub上拉的ubuntu镜像只是最简易版的 vim命令是没有的

[root@localhost ~]# docker run -it ubuntu bash
root@15c0323b5378:/# ls    
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@15c0323b5378:/# vim tmp/demo.txt
bash: vim: command not found

那么我们想要添加vim命令 并且提交当前容器为 镜像该怎么做呢

1.添加 vim命令

可以看到我们安装 vim命令 有提示

After this operation, 70.3 MB of additional disk space will be used.

意思是安装这个命令会下载些东西 会添加 70.3 MB文件到磁盘

root@15c0323b5378:/# apt-get install vim   
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal
  libpython3.8-stdlib libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim-common vim-runtime xxd xz-utils
Suggested packages:
  libasound2-plugins alsa-utils libcanberra-gtk0 libcanberra-pulse gpm readline-doc ctags vim-doc vim-scripts
The following NEW packages will be installed:
  alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal
  libpython3.8-stdlib libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim vim-common vim-runtime xxd xz-utils
0 upgraded, 30 newly installed, 0 to remove and 0 not upgraded.
Need to get 14.9 MB of archives.
After this operation, 70.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic-mgc amd64 1:5.38-4 [218 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic1 amd64 1:5.38-4 [75.9 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 file amd64 1:5.38-4 [23.3 kB]

2.提交当前容器作为我们的新的ubuntu镜像

可以看到提交后我们再找到该镜像 启动后可以看到容器内 就可以成功使用 vim 命令了

invalid reference format: repository name must be lowercase
[root@localhost ~]# docker commit -m "add vim command" -a "robert Ren" 15c0323b5378 ubuntu/withvim:1.1
sha256:c638056f700071004520f1b88ab2bd73f68aa094c70cd1bfe315930bdbb365ba
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID       CREATED         SIZE
ubuntu/withvim         1.1                 c638056f7000   2 minutes ago   162MB
redis/rediscontainer   0.5                 3be94ff46e45   2 days ago      109MB
mongo                  latest              dfda7a2cf273   8 months ago    693MB
mysql                  5.7                 938b57d64674   10 months ago   448MB
ubuntu                 latest              ba6acccedd29   10 months ago   72.8MB
redis                  latest              7faaec683238   10 months ago   113MB
redis                  6.0.8               16ecd2772934   22 months ago   104MB
flink                  1.10.0-scala_2.12   b001a5f6955e   2 years ago     586MB
kibana                 7.4.2               230d3ded1abc   2 years ago     1.1GB
elasticsearch          7.4.2               b1179d41a7b4   2 years ago     855MB
nginx                  1.10                0346349a1a64   5 years ago     182MB
[root@localhost ~]# docker run -it ubuntu/withvim bash
Unable to find image 'ubuntu/withvim:latest' locally
^[[A^[[A^C
[root@localhost ~]# docker run -it ubuntu/withvim:1.1 bash
root@c8fd302c542f:/# vim tmp/demo.txt
root@c8fd302c542f:/# cat tmp/demo.txt 
heihei

5.10把本地镜像推送到阿里云 镜像仓库 并拉取下来

阿里云镜像管理

根据提示就可以把镜像推送到阿里云了

5.11私有镜像

把镜像仓库搭在公司内部服务器上 用于 组员的共享

这个用到时候再补充吧

5.12 带容器卷启动

简单的说就是给容器中重要的数据做备份时用,默认映射后  容器中文件与 主机中文件

两边有任意一边修改 任何一边都会得到同步 无论 容器状态是否是 停止

 

 

 

 如下执行 就是使用容器卷映射的方式 运行 镜像

[root@localhost ~]# docker run -it  --privileged=true -v /tmp/datainhost:/tmp/dataindockercontainer --name=ubun ubuntu/withvim:1.1
root@ddbe43e18775:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ddbe43e18775:/# cd tmp/dataindockercontainer/
root@ddbe43e18775:/tmp/dataindockercontainer# ls
root@ddbe43e18775:/tmp/dataindockercontainer# touch demo.txt
root@ddbe43e18775:/tmp/dataindockercontainer# ls
demo.txt

执行完以上命令后我们再看linux主机中映射的目录下也多出了 demo.txt文件

[root@localhost ~]# cd /
[root@localhost /]# ls
bin  boot  dev  etc  home  jdk  lib  lib64  media  mnt  mydata  opt  proc  root  run  sbin  srv  swapfile  sys  tmp  usr  vagrant  var
[root@localhost /]# cd tmp/datainhost/
[root@localhost datainhost]# ls
demo.txt

如果我们不允许在容器中修改 那么 在 容器目录的后面加上 :ro 改为只读权限

docker run -it  --privileged=true -v /tmp/datainhost:/tmp/dataindockercontainer:ro --name=ubun ubuntu/withvim:1.1

容器卷映射规则的继承

使用如下语法即可 父类就是 父容器的名称

 这样的话就实现了多个容器中数据的共享

因为比如 容器1 修改了 文件 那么 linux主机上文件也会被同步 随后 容器2中的文件也会被同步修改

这里比较简单就不整命令了,外卖到了

七.常用命令概览

 

八.安装运行各种软件

8.1tomcat

常规操作 安装运行

[root@localhost ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete 
9b829c73b52b: Pull complete 
cb5b7ae36172: Pull complete 
6494e4811622: Pull complete 
668f6fcc5fa5: Pull complete 
dc120c3e0290: Pull complete 
8f7c0eebb7b1: Pull complete 
77b694f83996: Pull complete 
0f611256ec3a: Pull complete 
4f25def12f23: Pull complete 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS      PORTS                                                                                  NAMES
7381f2a045bc   redis                 "docker-entrypoint.s…"   3 days ago      Up 3 days   6379/tcp                                                                               blissful_bouman
d0de5c5476a9   ubuntu                "bash"                   3 days ago      Up 3 days                                                                                          secondunbuntucontainer
5bc853753904   nginx:1.10            "nginx -g 'daemon of…"   9 months ago    Up 7 days   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                             nginx
a93fde9471cf   elasticsearch:7.4.2   "/usr/local/bin/dock…"   9 months ago    Up 7 days   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch
f9dae621180b   kibana:7.4.2          "/usr/local/bin/dumb…"   9 months ago    Up 7 days   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana
8c3138489f1b   mysql:5.7             "docker-entrypoint.s…"   10 months ago   Up 7 days   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                   mysql
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID       CREATED         SIZE
ubuntu/withvim         1.1                 c638056f7000   12 hours ago    162MB
redis/rediscontainer   0.5                 3be94ff46e45   3 days ago      109MB
tomcat                 latest              fb5657adc892   8 months ago    680MB
mongo                  latest              dfda7a2cf273   8 months ago    693MB
registry               latest              b8604a3fe854   9 months ago    26.2MB
mysql                  5.7                 938b57d64674   10 months ago   448MB
ubuntu                 latest              ba6acccedd29   10 months ago   72.8MB
redis                  latest              7faaec683238   10 months ago   113MB
redis                  6.0.8               16ecd2772934   22 months ago   104MB
flink                  1.10.0-scala_2.12   b001a5f6955e   2 years ago     586MB
kibana                 7.4.2               230d3ded1abc   2 years ago     1.1GB
elasticsearch          7.4.2               b1179d41a7b4   2 years ago     855MB
nginx                  1.10                0346349a1a64   5 years ago     182MB
[root@localhost ~]# ^C
[root@localhost ~]# docker run -it -p 8080:8080 tomcat bash
root@925599a8a318:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work

关于新版本 tomcat不能直接通过8080访问首页是因为 它把首页从 webapps 目录放到 webapps.dist内了 ,删除webapps 然后 mv webapps.dist webapps即可

8.2mysql

首先docker pull mysql:5.7后,然后按以下命令运行

[root@localhost ~]# docker run --name mysqlzz -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker: Error response from daemon: Conflict. The container name "/mysqlzz" is already in use by container "8b1c8232a644e052d2636b85f865bdafe04c709ac8e5ff40e4e05f9aac840aee". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[root@localhost ~]# docker exec -it mysqlaa bash
root@31e36f35d688:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

至于数据的备份

这里懒得贴命令了,前面整过 就是以容器卷的方式 

至于插入中文乱码

就是在conf目录下 进行如下操作 

8.3redis

也没啥好说的 安装运行差不多

主要是个容器卷的文件映射要注意下 防止容器被删数据丢失

docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf

不进行如下设置的话 redis退出后数据就没了 所以持久化到磁盘可以进行如下设置

vi /mydata/redis/conf/redis.conf

添加appendonly yes

九.mysql主从复制

9.1创建主节点

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS          PORTS                                                                                  NAMES
5bc853753904   nginx:1.10            "nginx -g 'daemon of…"   9 months ago    Up 17 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp                                             nginx
a93fde9471cf   elasticsearch:7.4.2   "/usr/local/bin/dock…"   10 months ago   Up 17 minutes   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch
f9dae621180b   kibana:7.4.2          "/usr/local/bin/dumb…"   10 months ago   Up 17 minutes   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana
8c3138489f1b   938b57d64674          "docker-entrypoint.s…"   10 months ago   Up 17 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                   mysql
[root@localhost ~]# docker run -p 3307:3306 --name mysql-master \
> -v /mydata/mysql-master/log:/var/log/mysql \
> -v /mydata/mysql-master/data:/var/lib/mysql \
> -v /mydata/mysql-master/conf:/etc/mysql \
> -e MYSQL_ROOT_PASSWORD=root  \
> -d mysql:5.7
d047e686648b8829a1ded5b8f8d1ab9aecd95f7ee7e655559470b142ee4baa58

9.2添加配置文件

[root@localhost ~]# vi /mydata/mysql-master/conf/my.cnf

文件内容如下

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

9.3重启主库

docker restart mysql-master

9.4进入master

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

9.5master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

9.6新建从服务器容器实例3308

docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

9.7进入/mydata/mysql-slave/conf目录下新建my.cnf

记得改server_id

vi my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
 

9.8修改完配置后重启slave实例

docker restart mysql-slave

9.9在主数据库中查看主从同步状态

show master status;

9.10剩下步骤 

因为跟前面基本

主从复制命令:change master to master_host='172.17.0.6', master_user='slave', master_password='root', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=154, master_connect_retry=30; 

            • 主从复制命令参数说明

master_host:主数据库的IP地址;

master_port:主数据库的运行端口;

master_user:在主数据库创建的用于同步数据的用户账号;

master_password:在主数据库创建的用于同步数据的用户密码;

master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;

master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

master_connect_retry:连接失败重试的时间间隔,单位为秒。

十.分布式存储算法

这里我们是说的redis

我们存储都是根据key来的,因为取值要根据key取,有三台redis机器,现在有10个redis键值对,那么要怎样存储呢

10.1hash取余算法

如字面意思 就是 先算key的hash值 再对机器数 取余

比如现在 key1算出来hash值为 12 那么对机器数3取余就是0 那么这个键值对就放到机器0

10.2一致性hash算法

背景:

一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决
分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了。
 

目的:

是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

步骤:

一致性哈希环
    一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0,2^32-1],这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间。
 
步骤1:它也是按照使用取模的方法,前面笔记介绍的节点取模法是对节点(服务器)的数量进行取模。而一致性Hash算法是对2^32取模,简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1, 0和2^32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环。

步骤2:

步骤3:

优点:

容错性
假设Node C宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。

 

缺点:

小总结:

为了在节点数目发生改变时尽可能少的迁移数据
 
将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放。
而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。  
 
优点
加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。
 
缺点 
数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

10.3hash槽算法

 

十一.docker中 redis集群之主从与扩缩容 实现

11.1先创建6个redis容器

为了搭建一个三主三从的集群, 先创建6个redis容器

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
 
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
 
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
 
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
 
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
 
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

命令解释:

                • 命令分步解释
                  • docker run
                  • 创建并运行docker容器实例
                  • --name redis-node-6
                  • 容器名字
                  • --net host
                  • 使用宿主机的IP和端口,默认
                  • --privileged=true
                  • 获取宿主机root用户权限
                  • -v /data/redis/share/redis-node-6:/data
                  • 容器卷,宿主机地址:docker内部地址
                  • redis:6.0.8
                  • redis镜像和版本号
                  • --cluster-enabled yes
                  • 开启redis集群
                  • --appendonly yes
                  • 开启持久化
                  • --port 6386
                  • redis端口号

 11.2搭建集群 配置副本数

执行如下第一行指令

redis-cli --cluster create 192.168.56.10:6381 192.168.56.10:6382 192.168.56.10:6383 192.168.56.10:6384 192.168.56.10:6385 192.168.56.10:6386 --cluster-replicas 1

--cluster-replicas 1 表示为每个master创建一个slave节点

后面的信息打印说明集群创建成功,从提示中可以看到 使用的hash槽算法,然后三个主节点把所有槽位分为三份,然后可以看到副本 对应主节点的关系 

master:6381 slave:6385

master:6382 slave:6386

master:6383 slave:6384

root@localhost:/data# redis-cli --cluster create 192.168.56.10:6381 192.168.56.10:6382 192.168.56.10:6383 192.168.56.10:6384 192.168.56.10:6385 192.168.56.10:6386 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.10:6385 to 192.168.56.10:6381
Adding replica 192.168.56.10:6386 to 192.168.56.10:6382
Adding replica 192.168.56.10:6384 to 192.168.56.10:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9c62b58df19039614fc32dc6fa32faa9c90845a6 192.168.56.10:6381
   slots:[0-5460] (5461 slots) master
M: 50acd693ad90ecb9957f7923e3fff1731b04fe41 192.168.56.10:6382
   slots:[5461-10922] (5462 slots) master
M: ef14ef41e4740cff53699403c15ca4ec0015c008 192.168.56.10:6383
   slots:[10923-16383] (5461 slots) master
S: 5564c11b92952c35fbe4002ec5ef4eb9f8b10bb8 192.168.56.10:6384
   replicates 50acd693ad90ecb9957f7923e3fff1731b04fe41
S: 40a46efd6c3fbc91d0c551acc2f99a2e31450dd2 192.168.56.10:6385
   replicates ef14ef41e4740cff53699403c15ca4ec0015c008
S: 79d85f999d062de627263079baf474f6973fb080 192.168.56.10:6386
   replicates 9c62b58df19039614fc32dc6fa32faa9c90845a6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 192.168.56.10:6381)
M: 9c62b58df19039614fc32dc6fa32faa9c90845a6 192.168.56.10:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: ef14ef41e4740cff53699403c15ca4ec0015c008 192.168.56.10:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 79d85f999d062de627263079baf474f6973fb080 192.168.56.10:6386
   slots: (0 slots) slave
   replicates 9c62b58df19039614fc32dc6fa32faa9c90845a6
S: 40a46efd6c3fbc91d0c551acc2f99a2e31450dd2 192.168.56.10:6385
   slots: (0 slots) slave
   replicates ef14ef41e4740cff53699403c15ca4ec0015c008
M: 50acd693ad90ecb9957f7923e3fff1731b04fe41 192.168.56.10:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 5564c11b92952c35fbe4002ec5ef4eb9f8b10bb8 192.168.56.10:6384
   slots: (0 slots) slave
   replicates 50acd693ad90ecb9957f7923e3fff1731b04fe41
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 可以看到cluster配置成功,但是我们在6381节点插入某键值对 key1 value1 报错,说想要move到 6382节点 为啥呢 因为我们 key1 求hash值对16384取余的结果 在 6382的槽位区间

root@localhost:/data# redis-cli -p 6381
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:352
cluster_stats_messages_pong_sent:369
cluster_stats_messages_sent:721
cluster_stats_messages_ping_received:364
cluster_stats_messages_pong_received:352
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:721
127.0.0.1:6381> set key1 value1
(error) MOVED 9189 192.168.56.10:6382

所以我们启动redis客户端时加配置 -c,让数据自动重定向存储

root@localhost:/data# redis-cli -p 6381 -c
127.0.0.1:6381> set key1 value1
-> Redirected to slot [9189] located at 192.168.56.10:6382
OK

我们再检查集群的信息

就可以看到master节点 6382中 多了一条数据

root@localhost:/data# redis-cli --cluster check 192.168.56.10:6381
192.168.56.10:6381 (9c62b58d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.10:6383 (ef14ef41...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.10:6382 (50acd693...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.56.10:6381)
M: 9c62b58df19039614fc32dc6fa32faa9c90845a6 192.168.56.10:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: ef14ef41e4740cff53699403c15ca4ec0015c008 192.168.56.10:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 79d85f999d062de627263079baf474f6973fb080 192.168.56.10:6386
   slots: (0 slots) slave
   replicates 9c62b58df19039614fc32dc6fa32faa9c90845a6
S: 40a46efd6c3fbc91d0c551acc2f99a2e31450dd2 192.168.56.10:6385
   slots: (0 slots) slave
   replicates ef14ef41e4740cff53699403c15ca4ec0015c008
M: 50acd693ad90ecb9957f7923e3fff1731b04fe41 192.168.56.10:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 5564c11b92952c35fbe4002ec5ef4eb9f8b10bb8 192.168.56.10:6384
   slots: (0 slots) slave
   replicates 50acd693ad90ecb9957f7923e3fff1731b04fe41
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

容错切换迁移

主6382和从机切换,先停止主机6382

我们新开一个窗口停掉 6382

[root@localhost ~]# docker stop redis-node-2
redis-node-2

6382主机停了,对应的真实从机上位

6382作为2号主机分配的从机以实际情况为准,具体是几号机器就是几号

中间需要等待一会儿,大概两秒,docker集群重新响应

再次查看集群信息,可以看到2号主机的副本机器 变成了 主机 然后 数据也在里面

root@localhost:/data# redis-cli --cluster check 192.168.56.10:6381
Could not connect to Redis at 192.168.56.10:6382: Connection refused
192.168.56.10:6381 (9c62b58d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.10:6383 (ef14ef41...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.10:6384 (5564c11b...) -> 1 keys | 5462 slots | 0 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.56.10:6381)
M: 9c62b58df19039614fc32dc6fa32faa9c90845a6 192.168.56.10:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: ef14ef41e4740cff53699403c15ca4ec0015c008 192.168.56.10:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 79d85f999d062de627263079baf474f6973fb080 192.168.56.10:6386
   slots: (0 slots) slave
   replicates 9c62b58df19039614fc32dc6fa32faa9c90845a6
S: 40a46efd6c3fbc91d0c551acc2f99a2e31450dd2 192.168.56.10:6385
   slots: (0 slots) slave
   replicates ef14ef41e4740cff53699403c15ca4ec0015c008
M: 5564c11b92952c35fbe4002ec5ef4eb9f8b10bb8 192.168.56.10:6384
   slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

扩缩容:

            • 主从扩容案例
              • 新建6387、6388两个节点+新建后启动+查看是否8节点

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

docker ps

              • 进入6387容器实例内部
                • docker exec -it redis-node-7 /bin/bash
              • 将新增的6387节点(空槽号)作为master节点加入原集群


 

将新增的6387作为master节点加入集群

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381

6387 就是将要作为master新增节点

6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

              • 检查集群情况第1次


 

redis-cli --cluster check 真实ip地址:6381

 

              • 重新分派槽号

重新分派槽号

命令:redis-cli --cluster reshard IP地址:端口号

redis-cli --cluster reshard 192.168.111.147:6381

              • 检查集群情况第2次


 

redis-cli --cluster check 真实ip地址:6381

                • 槽号分派说明

为什么63873个新的区间,以前的还是连续?

重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

              • 为主节点6387分配从节点6388


 

命令:redis-cli --cluster add-node ip:slave端口 ip:master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli --cluster add-node 192.168.111.147:6388 192.168.111.147:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-------这个是6387的编号,按照自己实际情况

              • 检查集群情况第3次


 

redis-cli --cluster check 192.168.111.147:6382

            • 主从缩容案例
              • 目的:6387和6388下线
              • 检查集群情况1获得6388的节点ID


 

redis-cli --cluster check 192.168.111.147:6382

              • 6388删除 从集群中将4号从节点6388删除


 

命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID

redis-cli --cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8

redis-cli --cluster check 192.168.111.147:6382

 检查一下发现,6388被删除了,只剩下7台机器了。

 

              • 将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

redis-cli --cluster reshard 192.168.111.147:6381

 

              • 检查集群情况第二次


 

redis-cli --cluster check 192.168.111.147:6381

4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

              • 将6387删除


 

命令:redis-cli --cluster del-node ip:端口 6387节点ID

redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451

              • 检查集群情况第三次


 

redis-cli --cluster check 192.168.111.147:6381

十二.docker file

12.1基础知识

12.2大致执行流程

12.3docker执行dockerfile的流程 

12.4dockerfile常见保留字指令

这里以tomcat镜像构建dockerfile为例

tomcat/Dockerfile at master · docker-library/tomcat · GitHub

 除了上面这些,还有些保留字 用时可参考下图

12.5自定义centos镜像 带 vim跟ifconfig

12.5.1下载jdk镜像 并放到 mifile目录

Index of /jdk/

[root@localhost myfile]# ls
Dockerfile  jdk-8u171-linux-x64.tar.gz

12.5.2创建并编辑 Dockerfile

记得首字母大写(规范),在里面放以下内容 

遇到俩错 通过换成 centos7 与 修改 fastmirror配置解决fastestmirror 报错

FROM centos:centos7
MAINTAINER zzyy<zzyybs@126.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
#RUN yum -y install vim
安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

12.5.3构建镜像

docker build -t centos7withjdk:1.1 . 

12.5.4创建并进入容器

执行以下命令没有报错可以看到我们使用dockerfile构建镜像成功

[root@d48b39ecd71a local]# pwd
/usr/local
[root@d48b39ecd71a local]# vim jj.txt

12.5.5各命令所属生命周期 

十三.虚玄镜像

13.1定义

看这名字挺复杂,其实意思就是 构建了个错误的没用的镜像

定义:仓库名、标签都是<none>的镜像,俗称dangling image

13.2构建步骤

构建虚玄镜像步骤

13.3查看命令

docker image ls -f dangling=true

13.4删除命令

docker image prune

操作

[root@localhost myfile]# mkdir  mystery
[root@localhost myfile]# ls
Dockerfile  jdk-8u171-linux-x64.tar.gz  mystery
[root@localhost myfile]# cd mystery/
[root@localhost mystery]# touch Dockerfile
[root@localhost mystery]# vi Dockerfile

from centos:centos7
CMD echo 'action is success'
~                                                                                                                                                                                                                      
~                                

 构建之后可以看到虚玄镜像创建成功

[root@localhost mystery]# docker build .   
Sending build context to Docker daemon  2.048kB
Step 1/2 : from centos:centos7
 ---> eeb6ee3f44bd
Step 2/2 : CMD echo 'action is success'
 ---> Running in 52c47c594b76
Removing intermediate container 52c47c594b76
 ---> 741b4a129fba
Successfully built 741b4a129fba
[root@localhost mystery]# docker images
REPOSITORY             TAG                 IMAGE ID       CREATED             SIZE
<none>                 <none>              741b4a129fba   7 seconds ago       204MB
centos7withjdk         1.1                 a6fe45f231f9   38 minutes ago      1.23GB
<none>                 <none>              6792826dbf60   About an hour ago   231MB
ubuntu/withvim         1.1                 c638056f7000   3 weeks ago         162MB
redis/rediscontainer   0.5                 3be94ff46e45   3 weeks ago         109MB
tomcat                 latest              fb5657adc892   8 months ago        680MB

十四.docker 部署微服务项目并运行

14.1创建微服务项目

14.2添加相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/>
    </parent>

    <groupId>com.atguigu.docker</groupId>
    <artifactId>docker_boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mapper.version>4.1.5</mapper.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <dependencies>
        <!--SpringBoot通用依赖模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
        </plugins>
    </build>

</project>


14.3整个接口用于测试

package com.robert.docker_boot.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
public class TestController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/test/helloworld")
    public String helloWorld(){
        return "i will be deploy in docker port:"+port+" hello world user"+ UUID.randomUUID();
    }

}

14.4打包

打包后复制到对应Dockerfile所在目录

14.5构建Dockerfile

内容如下,结合第6节的 保留字含义与 所属生命周期可知:

以java8镜像为父镜像 维护者为 Robert

就是把微服务的jar包放到容器中 并且更名为 firsrBootDockerDemo.jar

然后ENTRYPOINT 后面是容器运行时执行的命令 就是运行 这个微服务jar包 并且暴露于

6001端口


FROM java:8
MAINTAINER Robert
VOLUME /tmp
ADD docker_boot-0.0.1-SNAPSHOT.jar firsrBootDockerDemo.jar
ENTRYPOINT ["java","-jar","/firsrBootDockerDemo.jar"]
EXPOSE 6001

14.6运行镜像生成容器

暴露于 6002端口

docker run -it -p 6002:6001 f691c81ecc2a  bash

 14.7测试

可以看到测试成功

十五.docker network

再运行镜像创建docker容器 时 加 --network 网络类型的方式来指定网络

docker 其实就四个

bridge:docker创建的network默认都是这个,他会递增的给每个新建的容器分配端口 以及自己有套自己的网络设置

host:跟着宿主机走  ip跟网络设置一样

none:没有ip跟相应网络设置网卡啥的需要自己创建 一般用不到

container:指定  跟别的哪个容器共享 同一ip 与网络设置 当那个容器 挂掉时 这个 容器的网络设置也会无效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值