• 【工具与中间件】Linux-Docker-Redis


    当你翻旧物发现了宝贝......

    0. 前言

    某天秋高气爽(emmm,发文时可能已立冬了),风和日丽,广东这边一如既往地闷热(成功水字一行,手动emoj)。闲来无事,打开尘封已久的服务器一看,嗯,风平浪静,并没有受到攻击。于是,我就想着看看能不能在这台服务器搞点什么东西,做个项目学习一下。

    一般web项目缓存都会用到redis,那就先从配一个redis开始吧!现在流行用 docker 配置,正准备下载 docker 呢, 随手 docker images 一下,好家伙,原来不知道什么时候已经有了(云服务器送的? 还是哪天我乱搞搞上去的?)不记得,不管了,那咱就直接docker 下 安装 redis 吧!

    当然了,为了更好地水一水字数,下文还是会提一下 Docker 及 Redis 的一些基本概念,方便自己及各位读者大大后续学习。

    学习目标
    Docker 下 安装 Redis, 并能访问。后续可根据本次 Docker 配置 及 Redis 下载,对 Docker 以及 Redis 进行更深入学习,并将其运用到个人项目中。

    参考教程

    1. Linux 下 安装 Docker

    1.1 Docker 基本概念

    本小节我们介绍 Docker 的基本概念。

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 ——《百度百科》

    其中,Docker 有 三大核心概念: 仓库、镜像、容器,我们必须了解,便于日后更深入的学习:

    仓库
    仓库类似于我们常用的代码仓库,与 Maven 仓库、 Git Hub 等类似,此处主要指 docker hub,远程仓库。仓库的贡献者是全世界的程序员,我们的镜像主要从仓库中拉取。一般常用的镜像拉取下来之后都是开箱即用。

    镜像
    docker 镜像类似于虚拟机镜像。docker 镜像 提供了虚拟机运行所需的库、资源、配置等文件,也提供了许多运行时参数。

    从我个人对各类镜像的使用体验看来,我个人将镜像看作是一个大点的安装包,像是系统镜像。仅从使用的角度,我们把它当作安装包就好了。

    容器
    容器也类似于我们常见的容器概念。每个容器是独立的,互不干扰。当然如果特定需求要让不同容器里的不同服务相互产生联系也不是不行,需要另寻解决方案。就像是我们生活中衣柜、文件柜等都可以看作一个个容器,一般情况下,根据用途分门别类放置物品。
    其中,docker 容器 由docker 镜像生成。从严格意义上来说,镜像层是只读的,docker 在镜像层上层 创建一个可写层,镜像本身不变。

    上次公司内部培训,我一位师兄作为讲师,他是这么教我们的:看Docker 的 LOGO 多像集装箱,相互独立,互不影响,里面装的货物都能各自使用。 这是因为每个 docker 容器 里跑的是一个个虚拟机,镜像在虚拟机里运行,就像是我们在 Windows 安装的 VMware。 至于获取镜像的仓库,类似于Maven、某Hub等远程仓库,里面放了很多大家做好的镜像,拉下来用即可。

    以上概念太多不好理解?在深入学习之前,我们可以先收藏 Docker 三大核心概念,然后 简单地 理解: Docker 是一些大佬做的工具,我们重点学习的是如何使用这个工具。

    至于 Docker 更深入的概念,篇幅有限,下次我们再一起学习吧!

    1.2 Linux 安装 Docker

    虽然俺的服务器已安装了Docker,但来都来了,怎么样也得给兄弟们重新安装一遍,争取一文会用 Docker 嘛。

    1.2.1 安装

    我的是CentOS,按照官网提示,CentOS docker 键入如下命令安装:

    sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    • 1

    当然,由于网络、yum工具没有及时更新等原因,直接使用官网给的命令下载不一定成功,此时,我们可选用一些其它参考文章推荐的安装方式,例如:

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    
    • 1

    安装成功后,执行 docker -v命令,若成功输出 docker 版本,则安装成功。

    docker -v
    Docker version 24.0.7, build afdd53b
    
    • 1
    • 2

    1.2.2 Hello World

    程序员的第一句代码都是hello world,docker 也不例外。已有大佬在docker 仓库上打包好了 hello world 镜像。在正式开始学习 docker 常用命令之前,我们先走个流程运行 hello world镜像吧!

    启动docker
    初次使用docker ,很有可能会因为系统并没有运行docker 而导致 执行 docker 命令时报 Cannot Connect to the Docker Daemon at ‘unix:///var/run/docker.sock, 此时我们先启动docker 就可解决

    # 启动docker
    [root@localhost ~]# systemctl start docker
    
    # 查看docker 状态
    [root@localhost ~]# systemctl status docker
    
    • 1
    • 2
    • 3
    • 4
    • 5

    拉取hello-world镜像

    docker pull hello-world
    
    • 1

    出现以下说明成功:

    
    [root@localhost ~]# docker pull hello-world
    Using default tag: latest
    latest: Pulling from library/hello-world
    719385e32844: Pull complete
    Digest: sha256:88ec0acaa3ec199d3b7eaf73588f4518c25f9d34f58ce9a0df68429c5af48e8d
    Status: Downloaded newer image for hello-world:latest
    docker.io/library/hello-world:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    跑一跑hello-world

    docker run hello-world
    
    • 1

    效果:

    [root@localhost ~]# docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行成功,欢迎来到 docker 的世界!

    1.3 Docker 常用命令

    好了,现在我们有了Docker,在正式拉取我们所需的镜像之前,我们先熟悉一下Docker 常用命令吧!

    1.3.1 系统启动/暂停/卸载 docker

    要让 docker 根据我们的需求(一般都是开机自启)如期启动运行,首先我们要从系统层面设置 docker 开机自启:

    # 启动Docker
    systemctl start docker
    # 停⽌Docker
    systemctl stop docker
    # 重启
    systemctl restart docker
    # 设置开机⾃启
    systemctl enable docker
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    若是 docker 由于某些原因损坏,需要重装,那么可参考以下卸载命令:

    yum remove docker
    
    • 1

    1.3.2 docker 容器的增/删/停/查看状态

    docker 常见命令。篇幅有限,本小节只介绍相关命令,至于命令的细节,如命令的各参数,读者请自行查阅。

    相关命令

    # 拉取镜像
    docker pull
    
    # 推送镜像到Docker Registry
    docker push
    
    # 查看本地镜像
    docker images
    
    # 删除本地镜像
    docker rmi 
    
    # 创建并运行容器
    docker run
    
    # 停止指定容器
    docker stop
    
    # 启动指定容器
    docker restart
    
    # 删除指定容器
    docker rm
    
    # 查看容器
    docker ps
    
    # 查看容器运行日志
    docker logs
    
    # 进入容器
    docker exec
    
    # 保存镜像到本地压缩文件
    docker save
    
    # 加载本地压缩文件到镜像
    docker load
    
    # 查看容器详细信息
    docker inspect
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    细心的同学可能发现了,除了要加上 docker 前缀,以及 部分参数可能要遵循 docker 的规则,docker 的大部分命令与 Linux 命令很像。触类旁通。

    实践
    我们可以将上文提到的hello-world 进行 docker 命令的练习。此处给个我个人练习的示例 :

    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
    8b039b88c24c   hello-world   "/hello"   4 hours ago   Exited (0) 4 hours ago             gracious_mcclintock
    [root@localhost ~]# docker rm 8b039b88c24c
    8b039b88c24c
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@localhost ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    redis         latest    7f27d60cb8e0   12 days ago    138MB
    hello-world   latest    9c7a54a9a43c   6 months ago   13.3kB
    [root@localhost ~]# docker rmi 9c7a54a9a43c
    Untagged: hello-world:latest
    Untagged: hello-world@sha256:88ec0acaa3ec199d3b7eaf73588f4518c25f9d34f58ce9a0df68429c5af48e8d
    Deleted: sha256:9c7a54a9a43cca047013b82af109fe963fde787f63f9e016fdc3384500c2823d
    Deleted: sha256:01bb4fce3eb1b56b05adf99504dafd31907a5aadac736e36b27595c8b92f07f1
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    redis        latest    7f27d60cb8e0   12 days ago   138MB
    [root@localhost ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    哈哈,上述例子 redis 偷跑了(这是本文第二个主题,也是我本人原本要的目标镜像与容器),没关系,在下一小节我们依然会介绍docker 下载 redis, 并简要介绍 redis 相关 概念

    1.3.3 小结

    Docker 除了可以拉取仓库上的镜像并创建容器,还可以将自己的项目制作成镜像并在容器里启动。

    至于 Docker 更高级的用法,篇幅有限,请读者留意工作中的小确幸,自行体验。

    1.4 Docker 可视化工具推荐

    命令敲烦了?命令太多记不住?没关系,Docker 可视化工具来帮你。
    本小节我们推荐两个常用的 Docker 可视化工具。

    至于更多优秀的可视化工具,篇幅有限,请读者自行发掘。

    2. Docker 下 安装 Redis

    2.1 Redis 基本概念

    本小节我们介绍 Redis 的基本概念。

    2.1.1 Redis 是什么

    Redis是一种高性能的开源内存数据库,它主要用于缓存、数据存储和消息传递。Redis的基本原理是将数据存储在内存中,以提供快速的读写操作。它使用键值对的方式存储数据,并支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。Redis还具有持久化的能力,可以根据不同的持久化策略将数据定期写入磁盘,以防止数据丢失。此外,Redis还支持发布/订阅模式,允许不同的应用程序之间进行实时消息传递。

    实际工作中,我们常用 Redis 来进行缓存。除此之外,使用 Redis 还能实现单点登录、MQ等功能,甚至可当作数据库存储数据。

    2.1.2 Redis 常见数据结构

    Redis 常见的数据结构有:

    • 字符串String:由于串的特性,字符串的访问速度非常快。常用于缓存用户名、邮箱地址等信息。
    • 列表List:Redis 的列表是有序列表,每个元素都有自己索引。常用于缓存任务队列、消息队列。
    • Set: 类似于我们常见的Set,每个元素不重复。常用于存储一些tag等非重复信息。
    • Soorted Set: 有序集合, 可以实现排序、排名等功能。
    • 哈希表Hash: 键值对,可以用它来实现灵活的数据结构。常用于缓存用户信息、物品信息等。

    至于 Redis 更深入的概念,及常见面试题,篇幅有限,请读者自行查阅。

    2.2 Docker 下安装 Redis

    有了上面一个章节的铺垫,docker 安装 Redis 就轻松了许多!本小节就当作是 docker 实战演练吧!

    Docker 拉取 Redis

    # 走流程,查看 Redis
    docker search redis
    
    # 拉取 latest 版本 Redis
    docker pull redis
    
    # 拉取完毕后查看镜像
    docker images
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以下是我个人执行的效果:

    [root@localhost ~]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    578acb154839: Already exists
    9a217a51793f: Pull complete
    07058ed9ec8f: Pull complete
    d3ba9a132495: Pull complete
    adeece162a71: Pull complete
    4f4fb700ef54: Pull complete
    7018b7448b70: Pull complete
    Digest: sha256:ac4e8dd2fed59eddba2805411db8664f5fd69a64f33303f3b8fec79abd4ff97a
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    redis        latest    e10bd12f0b2d   5 days ago    138MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Redis 配置
    这一段我们参考本文开头的参考教程来:
    这里主要的步骤是将Redis的配置文件进行挂载,以配置文件方式启动Redis容器。这里涉及一个概念挂载:将宿主机的文件和容器内部目录相关联,相互绑定。

    (1) 创建redis相关目录

    [root@localhost /]# mkdir -p /home/redis/myredis
    [root@localhost /]# cd /home
    [root@localhost home]# ls
    redis  sharry
    [root@localhost home]# cd redis
    [root@localhost redis]# ls
    myredis
    [root@localhost redis]# cd myredis/
    [root@localhost myredis]# mkdir data
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (2) 编辑/上传conf文件

    # bind 192.168.1.100 10.0.0.1
    # bind 127.0.0.1 ::1
    # bind 127.0.0.1
    
    protected-mode no
    
    port 6379
    
    tcp-backlog 511
    
    requirepass 000415
    
    timeout 0
    
    tcp-keepalive 300
    
    daemonize no
    
    supervised no
    
    pidfile /var/run/redis_6379.pid
    
    loglevel notice
    
    logfile ""
    
    databases 30
    
    always-show-logo yes
    
    save 900 1
    save 300 10
    save 60 10000
    
    stop-writes-on-bgsave-error yes
    
    rdbcompression yes
    
    rdbchecksum yes
    
    dbfilename dump.rdb
    
    dir ./
    
    replica-serve-stale-data yes
    
    replica-read-only yes
    
    repl-diskless-sync no
    
    repl-disable-tcp-nodelay no
    
    replica-priority 100
    
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    
    appendonly yes
    
    appendfilename "appendonly.aof"
    
    no-appendfsync-on-rewrite no
    
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    aof-load-truncated yes
    
    aof-use-rdb-preamble yes
    
    lua-time-limit 5000
    
    slowlog-max-len 128
    
    notify-keyspace-events ""
    
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    
    list-max-ziplist-size -2
    
    list-compress-depth 0
    
    set-max-intset-entries 512
    
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    
    hll-sparse-max-bytes 3000
    
    stream-node-max-bytes 4096
    stream-node-max-entries 100
    
    activerehashing yes
    
    hz 10
    
    dynamic-hz yes
    
    aof-rewrite-incremental-fsync yes
    
    rdb-save-incremental-fsync yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    (3) 启动容器

    docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis                -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/               redis.conf  --appendonly yes  --requirepass password
    
    • 1

    (4) 查看Redis容器状态

    docker ps -a
    docker ps -a |grep myredis
    docker exec -it myredis redis-cli
    
    • 1
    • 2
    • 3

    上述命令若有正确返回,且进入Redis容器后启动 cli 并输入密码后能正常操作,则说明成功。

    好嘞,至此我们 docker 下载并配置 redis 完成!接下来,我们可以愉快地使用了!对于初学或想快速回顾的读者,下文我还提了一些 Redis 相关概念(凑字数),欢迎继续阅读 ~

    2.3 Redis 常用命令

    以下简单介绍 Redis 常用命令。 一般情况下, Redis 的使用频次没有 SQL 多,如非面试,也无需硬记,当作字典,用到的时候再查即可。

    * SET key value:设置 key 的值为 value。 
    * GET key:获取 key 的值。 
    * INCR key:将 key 的值加 1。 
    * DECR key:将 key 的值减 1。 
    * LPUSH key value:将 value 插入到列表 key 的表头。 
    * RPUSH key value:将 value 插入到列表 key 的表尾。 
    * LRANGE key start stop:获取列表 key 中 start 至 stop 之间的元素。 
    * SADD key member:将 member 添加到集合 key 中。 
    * SMEMBERS key:获取集合 key 中的所有元素。 
    * SCARD key:获取集合 key 的元素个数。 
    * HSET key field value:将 field 的值设置为 value 。 
    * HGET key field:获取 field 的值。 
    * HKEYS key:获取 key 中所有的 field。 
    * HMGET key field1 field2 ...:获取 key 中多个 field 的值。 
    * HMSET key field1 value1 field2 value2 ...:同时设置多个 field 的值。 
    * HDEL key field1 field2 ...:删除 key 中多个 field。 
    * HLEN key:获取 key 中 field 的个数。 
    * INCRBY key increment:将 key 的值加上 increment。 
    * DECRBY key decrement:将 key 的值减去 decrement。 
    * EXPIRE key seconds:设置 key 的过期时间为 seconds 秒。 
    * TTL key:获取 key 的剩余过期时间(以秒为单位)。 
    * KEYS pattern:获取所有符合 pattern 的 key。 
    * FLUSHDB:清空当前数据库。 
    * FLUSHALL:清空所有数据库。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    至于 Redis 更高级的用法,以及常用的结合工具包,让我们在项目中可以用代码操作redis,及常见面试题,篇幅有限,请读者自行查阅。

    2.4 Redis 可视化工具推荐

    命令敲烦了?命令太多记不住?没关系,Redis 可视化工具来帮你。
    本小节我们推荐一下两个常用的 Docker 可视化工具。

    至于更多优秀的可视化工具,篇幅有限,请读者自行发掘。

    3. 总结

    本文主要介绍一次个人无意中发现了自己原来有台服务器以及安装了Docker,本着物尽其用的原则实操 Linux OS 下载Docker、 Docker 的基本使用(入门)、Docker 下安装Redis(实战)并记录成此文。

    顺便简要介绍了一下 Docker 、 Redis 这两个工作中常用工具的概念,以便快速入门或回顾。当作是买一送一,供读者参考。

  • 相关阅读:
    小马识途谈百科词条创建如何顺利通过审核?
    JS中的 typeof 针对各种类型的返回值 以及typeof历史遗留问题
    虚拟化基本知识及virtio-net初探
    暴力递归转动态规划(四)
    Vue项目流程6,登录与注册,完成获取验证码,登录跳转,利用token获取用户信息,退出登录等功能,利用导航守卫在路由跳转之间进行判断
    监听器与过滤器练习
    单文件组件:dom高亮插件、在父组件中引入子组件、App.vue代码代码写法
    因果论 —— 模型、推理和推断(概率、图及因果模型)
    第一个ALV程序2
    重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似
  • 原文地址:https://blog.csdn.net/CoderSharry/article/details/134446873