Linux使用Docker部署安装应用

一、Redis7.4部署安装


1、 拉取 Redis 镜像

# 拉取最新版本
docker pull redis:7.4
# 或拉取特定版本
docker pull redis:6.2.6

2、 创建挂载目录并配置 Redis

创建宿主机目录conf,data,run

mkdir -p /opt/docker/redis/{conf,data,run}
echo /opt/docker/redis/{conf,data,run}|xargs chmod 755

下载并修改 Redis 配置文件:

# 下载官方配置文件(根据版本调整 URL)
wget https://raw.githubusercontent.com/redis/redis/7.4/redis.conf -O /opt/docker/redis/conf/redis.conf

# 编辑配置文件
vim /opt/docker/redis/conf/redis.conf

关键配置修改:

bind 0.0.0.0                    # 允许远程访问
protected-mode no               # 关闭保护模式
port 6379                       # 默认端口
daemonize no                    # Docker 中禁用守护进程模式
requirepass yourpassword        # 设置访问密码(可选)
appendonly yes/no                  # 启用 AOF 持久化
dir /opt/docker/redis/data/      # 数据存储目录(容器内路径)
pidfile /tmp/redis-6379.pid #设置pid文件路径
  • 参数说明:
    appendonly yes启用AOF持久化后,/opt/docker/redis/data/目录下的 appendonlydir需要授权,目录下所有文件需支持读写
    chmod -R redis:redis /opt/docker/redis/data/appendonlydir #授权redis用户(可选)
    chmod 755 /opt/docker/redis/data/appendonlydir
    chmod 777 /opt/docker/redis/data/appendonlydir/*
    
    [root@localhost data]# ll appendonlydir/
    总用量 8
    -rwxrwxrwx 1 systemd-coredump input 88  5月 15 23:09 appendonly.aof.1.base.rdb
    -rwxrwxrwx 1 systemd-coredump input  0  5月 15 23:09 appendonly.aof.1.incr.aof
    -rwxrwxrwx 1 systemd-coredump input 88  5月 15 23:09 appendonly.aof.manifest
    [root@localhost data]# 
    

3. 启动 Redis 容器

使用 docker run 命令:

docker run -d \
   --name redis_7.5 \
   --restart=always \
   --network host \
   -v /opt/docker/redis/conf/redis.conf:/opt/docker/redis/conf/redis.conf \
   -v /opt/docker/redis/data:/opt/docker/redis/data \
   redis:7.4 \
   redis-server /opt/docker/redis/conf/redis.conf

参数说明:

参数作用
-d后台运行容器
--name redis_7.5容器名称
--restart=always开机自动重启容器
-p 6379:6379映射宿主机与容器端口
-v ...挂载配置文件和数据目录
redis-server ...指定配置文件启动 Redis

-v参数分解说明:

-v ~/docker/nginx/html:/usr/share/nginx/html:ro

  • -v:Docker 命令中用于挂载卷的标志(Volume Flag)。

  • ~/docker/nginx/html:宿主机的文件路径(源路径)。

  • ~ 代表用户主目录(如 /home/user 或 C:\Users\user)。

  • /usr/share/nginx/html:容器内的文件路径(目标路径)。
    Nginx 默认将此路径作为 Web 服务器的根目录(即访问 http://localhost 时返回的内容)。

  • :ro:可选参数,表示只读模式(Read-Only)。

    容器只能读取该目录,无法修改,确保宿主机文件安全。


4. 验证安装

检查容器状态:

[root@eulerzy data]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                   CREATED         STATUS         PORTS     NAMES
eff5289195f6   redis:7.4   "docker-entrypoint.s…"   6 seconds ago   Up 6 seconds             redis_7.5

STATUS参数说明:

参数实例作用
Up Up 2 minutes容器正在运行中。时间表示容器已持续运行的时长。
ExitedExited (0) 5 minutes ago容器已正常停止(退出码为 0)或异常停止(退出码非 0,如 1、137 等);退出码 0:通常表示容器内的主进程正常结束。其他退出码:表示异常退出,例如进程崩溃、被信号终止(如 137 表示被 SIGKILL 终止)。
CreatedCreated 10 seconds ago容器已创建但尚未启动(例如,使用 docker create 创建后未执行 docker start,需要启动)
RestartingRestarting (1) 2 seconds ago容器正在重启中。通常与 restart policy(如 --restart=always)相关,表示容器因故障退出后正在自动重启。
PausedUp 1 hour (Paused)容器已被暂停。使用 docker pause 命令可以暂停容器内的所有进程,暂停后容器仍存在但不运行。
Dead-容器处于异常状态,无法正常启动或停止,可能需要手动清理:docker rm -f,清理全部:docker container prune

进入容器测试连接:

docker exec -it redis redis-cli
127.0.0.1:6379> auth abc123456 #配置文件设置的密码
OK
127.0.0.1:6379> ping
PONG

5.使用Dockerfile 构建镜像部署

  • 在redis.conf文件目录创建Dockerfile文件
    touch /opt/docker/redis/conf/Dockerfile
    chmod 777 /opt/docker/redis/conf/Dockerfile
    
    # 使用官方 Redis 镜像作为基础镜像
    FROM redis:7.4
    
    # 如果有自定义的 Redis 配置文件,可以将其复制到容器中
    COPY ./redis.conf /opt/docker/redis/conf/redis.conf
    # VOLUME ["/opt/docker/redis/data","/opt/docker/redis/run"]
    CMD ["redis-server", "/opt/docker/redis/conf/redis.conf"]
    
    # 暴露 Redis 默认端口
    EXPOSE 6379
    
  • 在Dockerfile文件目录下构建名为my-redis镜像
    [root@eulerzy conf]# docker build -t my-redis .
    [+] Building 0.3s (7/7) FINISHED                                        
     => [internal] load build definition from Dockerfile                    
     => => transferring dockerfile: 439B                                    
     => [internal] load metadata for docker.io/library/redis:7.4            
     => [internal] load .dockerignore                                       
     => => transferring context: 2B                                         
     => [internal] load build context                                       
     => => transferring context: 109.10kB                                   
     => CACHED [1/2] FROM docker.io/library/redis:7.4                       
     => [2/2] COPY ./redis.conf /opt/docker/redis/conf/redis.conf           
     => exporting to image                                                  
     => => exporting layers                                                 
     => => writing image sha256:744dab7fd097e0d9d3d6ded3a105fa97f494780f4d9c
     => => naming to docker.io/library/my-redis                             
    [root@eulerzy conf]# 
    
  • 启动容器
    [root@eulerzy ~]# docker run -d \
      --name redis_7.4 \
      --restart always \
      --network bridge \
      -p 6379:6379 \
      my-redis
    
  • 查看容器和测试验证
    [root@eulerzy conf]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS                                         NAMES
    763025d50956   my-redis   "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp   redis_7.4
    [root@eulerzy conf]#
    [root@eulerzy conf]# docker logs redis_7.4 
    1:C 15 May 2025 03:21:10.789 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1:C 15 May 2025 03:21:10.789 * Redis version=7.4.3, bits=64, commit=00000000, modified=0, pid=1, just started
    1:C 15 May 2025 03:21:10.789 * Configuration loaded
    1:M 15 May 2025 03:21:10.789 * monotonic clock: POSIX clock_gettime
    1:M 15 May 2025 03:21:10.790 * Running mode=standalone, port=6379.
    1:M 15 May 2025 03:21:10.791 * Server initialized
    1:M 15 May 2025 03:21:10.791 * Reading RDB base file on AOF loading...
    1:M 15 May 2025 03:21:10.791 * Loading RDB produced by version 7.4.3
    1:M 15 May 2025 03:21:10.791 * RDB age 165945 seconds
    1:M 15 May 2025 03:21:10.791 * RDB memory usage when created 0.90 Mb
    1:M 15 May 2025 03:21:10.791 * RDB is base AOF
    1:M 15 May 2025 03:21:10.791 * Done loading RDB, keys loaded: 0, keys expired: 0.
    1:M 15 May 2025 03:21:10.791 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
    1:M 15 May 2025 03:21:10.791 * DB loaded from append only file: 0.000 seconds
    1:M 15 May 2025 03:21:10.791 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
    1:M 15 May 2025 03:21:10.791 * Ready to accept connections tcp
    [root@eulerzy conf]#
    [root@eulerzy conf]# docker exec -it redis_7.4 redis-cli -a abc123456 ping
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    PONG
    [root@eulerzy conf]# 
    

6. 使用 Docker Compose 部署(推荐,先完成上述1-2步骤)

(1) 下载Docker Compose(二进制文件)
# 下载指定版本的 docker-compose(替换为你需要的版本)-o :保存下载文件到指定目录
sudo curl -L "https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/redis7-4-dockercompose/docker-compose
(2) 赋予可执行授权docker-compose文件
sudo chmod +x /usr/local/bin/redis7-4-dockercompose/docker-compose

(3) 创建符号链接

该命令的作用是在/usr/bin/目录下创建一个指向/usr/local/bin/docker-compose的符号链接,使得系统能够在任何位置通过docker-compose命令调用该程序:

sudo ln -s /usr/local/bin/redis7-4-dockercompose/docker-compose /usr/bin/docker-compose

工作原理:

  • 符号链接类似于 Windows 系统中的快捷方式,它指向原始文件或目录。
  • 当系统执行docker-compose命令时,会自动解析链接并执行实际程序。
  • 修改或删除符号链接不会影响原始文件,但删除原始文件会导致链接失效。
  • /usr/local/bin是系统默认的用户安装软件目录,但某些环境可能未将其包含在 PATH 变量中
  • /usr/bin是系统默认的可执行文件目录,所有用户都能直接访问
  • 通过创建符号链接,可以确保docker-compose命令在任何目录下都能被调用

检查是否安装成功

docker-compose -v
(4)配置docker-compose.yml 文件
  • 创建 docker-compose.yml 文件,并赋予读写授权、写入配置:
    touch /usr/local/bin/redis7-4-dockercompose/docker-compose.yml
    chmod 777 /usr/local/bin/redis7-4-dockercompose/docker-compose.yml 
    ln -s /usr/local/bin/redis7-4-dockercompose/docker-compose.yml /usr/bin/docker-compose.yml
    
  • 写入配置–docker compose 配置文件指令详解:12
    #version: '3.8' #后续版本不需要说明版本号,会自动识别 
    
    services:
      redis:
        image: redis:7.4
        container_name: redis_7.4
        restart: always
        network_mode: host
        ports:
          - "6379:6379"
        volumes:
          - /opt/docker/redis/conf/redis.conf:/opt/docker/redis/conf/redis.conf:ro
          - /opt/docker/redis/data/:/opt/docker/redis/data/
          # pid绑定关联容器可写路径/tmp
          - /opt/docker/redis/run:/tmp
        environment:
          # 通过环境变量设置密码(优先级高于配置文件)
          - REDIS_PASSWORD=abc123456
        command: ["redis-server", "/opt/docker/redis/conf/redis.conf"]
    
(5)配置文件/etc/sysctl.conf
  • 更改redis在系统内存提交策略,防止Redis 在高负载的情况下可能会崩溃。
    vm.overcommit_memory = 1
    
  • 策略立即生效
    sudo sysctl -p
    
(6)配置全局模式使用docker-compose
  • /usr/local/bin/redis7-4-dockercompose/目录下启动容器:

    docker-compose up -d #或者:docker-compose ps -a
    
  • vi ~/.bashrc在该配置文件末尾添加docker-compose文件和docker-compose.yml文件路径:

    export COMPOSE_PROJECT_NAME=redis7-4-dockercompose
    export COMPOSE_CONFIG=/usr/local/bin/redis7-4-dockercompose/docker-compose.yml
    export COMPOSE_FILE=/usr/local/bin/redis7-4-dockercompose/docker-compose
    export COMPOSE_LOG_LEVEL=DEBUG
    
    
  • 重新加载~/.bashrc文件配置

    source ~/.bashrc
    
    常用命令作用
    awk '{print NR,$0}' ~/.bashrc显示行号
    gawk -i inplace 'NR>=14 && NR<=17 {sub(/^#/, "")}1' ~/.bashrc取消14-17行的 # 号
    gawk -i inplace 'NR>=14 && NR<=17 {sub(/^/, "#")}1' ~/.bashrc增加14-17行的 # 号
  • 查看容器启动状况:

    [root@eulerzy ~]# docker-compose ps -a 
    CONTAINER ID   IMAGE       COMMAND                   CREATED       STATUS          PORTS     NAMES
    dd6095b86e99   redis:7.4   "docker-entrypoint.s…"   3 hours ago   Up 45 minutes             redis_7.4
    
  • 检验容器:

    docker exec -it redis_7.4 redis-cli -a abc123456 ping
    
    [root@eulerzy bin]# docker exec -it redis_7.4 redis-cli -a abc123456 ping
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    PONG
    [root@eulerzy bin]#
    
  • 查看docker运行redis容器的日志:

    docker-compose logs redis #或者:docker logs redis
    
       redis_7.4  | 1:signal-handler (1747123034) Received SIGTERM scheduling shutdown...
    redis_7.4  | 1:M 13 May 2025 07:57:14.012 * User requested shutdown...
    redis_7.4  | 1:M 13 May 2025 07:57:14.012 * Calling fsync() on the AOF file.
    redis_7.4  | 1:M 13 May 2025 07:57:14.013 * Saving the final RDB snapshot before exiting.
    redis_7.4  | 1:M 13 May 2025 07:57:14.020 * DB saved on disk
    redis_7.4  | 1:M 13 May 2025 07:57:14.021 * Removing the pid file.
    redis_7.4  | 1:M 13 May 2025 07:57:14.021 # Redis is now ready to exit, bye bye...
    redis_7.4  | 1:C 13 May 2025 07:59:42.346 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    redis_7.4  | 1:C 13 May 2025 07:59:42.346 * Redis version=7.4.3, bits=64, commit=00000000, modified=0, pid=1, just started
    redis_7.4  | 1:C 13 May 2025 07:59:42.346 * Configuration loaded
    redis_7.4  | 1:M 13 May 2025 07:59:42.346 * monotonic clock: POSIX clock_gettime
    redis_7.4  | 1:M 13 May 2025 07:59:42.347 * Running mode=standalone, port=6379.
    redis_7.4  | 1:M 13 May 2025 07:59:42.347 * Server initialized
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * Reading RDB base file on AOF loading...
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * Loading RDB produced by version 7.4.3
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * RDB age 9857 seconds
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * RDB memory usage when created 0.90 Mb
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * RDB is base AOF
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * Done loading RDB, keys loaded: 0, keys expired: 0.
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * DB loaded from append only file: 0.000 seconds
    redis_7.4  | 1:M 13 May 2025 07:59:42.348 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
    
    
    

7.容器应用-卸载清理

(1)选择要卸载的容器
[root@eulerzy bin]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                   CREATED        STATUS                     PORTS     NAMES
dd6095b86e99   redis:7.4   "docker-entrypoint.s…"   20 hours ago   Exited (0) 3 minutes ago             redis_7.4
[root@eulerzy bin]# 
(2)卸载指定容器,并检查
[root@eulerzy bin]# docker rm redis_7.4 
redis_7.4
[root@eulerzy bin]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@eulerzy bin]# 

(3)清理容器缓存
	[root@eulerzy bin]# docker container prune
	WARNING! This will remove all stopped containers.
	Are you sure you want to continue? [y/N] y
	Total reclaimed space: 0B
	[root@eulerzy bin]# 

(4)清除指定docker拉取的镜像
docker rmi [-f] [images_name/images_id] #-f:表示强制删除

  • 删除所有 Redis 镜像(批量操作)
    docker images -q redis | xargs docker rmi -f
    
    -q:只输出镜像 ID
    xargs:将前一个命令的输出作为参数传递给docker rmi
    -f:强制删除

8. 常见问题与注意事项

(1) 无法远程访问 Redis

  • 检查防火墙规则,开放 6379 端口。
  • 确保 bind 0.0.0.0protected-mode no 已配置。

(2) 数据持久化失败

  • 确认挂载目录权限:
    chmod -R 777 /opt/docker/redis/data
    
  • 检查 dir /dataappendonly yes 是否启用。

(3) 版本差异问题

  • Redis 7.x 默认配置路径可能为 /usr/local/etc/redis/redis.conf,需通过 docker exec 确认。

(4) 内存管理

  • 在配置文件中设置最大内存策略(如 maxmemory 2gbmaxmemory-policy allkeys-lru)。

9. 安全建议

  • 密码保护:始终设置 requirepass
  • 网络隔离:在生产环境中使用 Docker 自定义网络,限制 Redis 暴露范围。
  • TLS 加密:若需加密通信,启用 tls-port 并配置证书(适用于 Redis 6.x+)。

10. 总结

在当前的软件开发和部署实践中,Dockerfiles 和 Docker Compose 都被广泛使用,但它们通常用于不同的场景。

(1) Dockerfile
用途:
  • Dockerfile 是一个文本文件,包含了一系列指令,用于定义如何构建一个 Docker 镜像。每个指令创建镜像的一个层。
  • 它主要用于描述应用环境的初始化过程,包括安装依赖、设置环境变量、复制文件等操作。
优势与特点:
  • 精确控制:可以精确地控制容器内的操作系统、软件包版本和其他配置。
  • 可重复性:通过 Dockerfile 构建的镜像可以在任何支持 Docker 的环境中一致地运行。
  • 自动化:集成到 CI/CD 流水线中,自动化构建和测试流程。
  • 轻量级:仅包含必要的组件和服务,减少资源占用。
(2)Docker Compose
用途:
  • Docker Compose 通常用于定义和运行多容器 Docker 应用程序。通过一个 docker-compose.yml 文件来配置应用程序的服务。
  • 它允许您在一个命令中启动、停止和管理多个相互关联的容器。
优势与特点:
  • 多服务管理:简化了多容器应用的管理和部署,比如数据库、缓存、前端和后端服务等。
  • 快速原型设计:对于开发和测试来说非常方便,能够快速搭建起复杂的应用环境。
  • 环境一致性:确保不同环境(如开发、测试、生产)之间的一致性。
  • 简化网络配置:内置了简单的网络配置,使得服务间通信更加便捷。
区别与选择
  • 单一 vs 复杂应用:如果只需要部署一个单独的服务或应用,Dockerfile 就足够了;如果的应用由多个服务组成(例如微服务架构),那么 Docker Compose 更加合适。
  • 手动 vs 自动化部署:Dockerfile 更适合于需要高度定制化的场景,而 Docker Compose 更适合快速启动和关闭一组服务,尤其是在开发阶段。
  • 学习曲线:Dockerfile 相对简单直接,易于学习;Docker Compose 则需要理解更多的概念,如服务依赖关系、网络配置等。

经常一起使用:首先使用 Dockerfile 来定义单个服务的镜像,然后使用 Docker Compose 来编排这些服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值