使用docker安装常见软件

阅读数:289 评论数:0

跳转到新版页面

分类

应用软件

正文

一、安装redis

1、运行命令

docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:latest

2、持久化配置

如果需要持久化 Redis 数据:

docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /path/to/redis/data:/data \
  redis:latest \
  redis-server --appendonly yes
  • /path/to/redis/data 是主机上的数据存储路径。

3、修改redis配置

如设置密码

(1)方式一,直接在运行容器时使用环境变量配置

docker run -d \
  --name redis \
  -p 6379:6379 \
  redis:latest \
  redis-server --requirepass yourpassword
  • --requirepass yourpassword 设置 Redis 的访问密码。

(2)方式二,将自定义的redis.conf文件挂载到容器中,以替代默认的配置文件

  • 在宿主机上创建一个 Redis 配置文件 redis.conf
requirepass yourpassword
appendonly yes
  • 将文件挂载到容器中:
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf \
  redis:latest \
  redis-server /usr/local/etc/redis/redis.conf

这个方式,暂时没有成功

  • /path/to/redis.conf 是宿主机上的配置文件路径。
  • redis-server /usr/local/etc/redis/redis.conf 命令指定 Redis 使用自定义配置文件。

(3)方式三,使用dockerfile构建镜像

通过自定义 Dockerfile 构建包含修改配置的 Redis 镜像。

  • 创建dockerfile
FROM redis:latest

# 添加自定义配置文件
COPY redis.conf /usr/local/etc/redis/redis.conf

# 启动 Redis 并加载配置文件
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
  • 构建镜像
docker build -t custom-redis .
  • 运行容器
docker run -d \
  --name redis \
  -p 6379:6379 \
  custom-redis

(4)方式四,使用cli动态修改配置

在容器运行后,可以通过 redis-cli 动态修改配置。此方法修改的配置只在当前运行时有效。

  • 设置密码
docker exec -it redis redis-cli
> CONFIG SET requirepass "yourpassword"
  • 持久化到配置文件
> CONFIG REWRITE

4、验证redis是否启动成功

(1)查看容器状态

docker ps

确保输出中包含redis容器

(2)进入容器并使用redis cli

docker exec -it redis-6.2.0 redis-cli

执行后,可以在redis cli中输入命令,比如

ping

二、安装mysql

1、运行命令

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=root_password \
  -p 3306:3306 \
  mysql:latest

2、持久化配置

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=root_password \
  -p 3306:3306 \
  -v /path/to/mysql/data:/var/lib/mysql \
  mysql:latest
  • /path/to/mysql/data 是主机上的数据存储路径。

(1)默认情况(没有指定数据存储路径)

如果没有指定数据存储路径,MySQL 会将数据保存在容器的内部文件系统中,通常是 /var/lib/mysql

在这种情况下,MySQL 会将数据存储在容器内的 /var/lib/mysql 目录中。这意味着:容器重启时,会丢失数据

(2)使用数据卷

为了持久化数据,推荐使用 Docker 数据卷。数据卷允许你将容器的数据存储在宿主机的指定位置,甚至在容器删除后,数据仍然保留。可以通过 -v--mount 参数将容器的 /var/lib/mysql 目录挂载到宿主机目录或 Docker 数据卷。

3、导入数据库表和存储过程

如果你有一个 SQL 脚本(例如 import.sql),可以通过以下命令将它导入到 MySQL 容器中。

docker exec -i mysql-container mysql -u root -p'root_password' < /path/to/import.sql

确保你的 import.sql 文件包含了所有需要的数据库表、存储过程、以及其他配置。

导入sql文件到指定数据库

docker exec -i mysql-container mysql -u root -p'root_password' database_name < /path/to/import.sql

如果没有数据库,可以先创建数据库

docker exec -i <container_name> mysql -u<username> -p<password> -e "create database <database>"

4、配置用户和密码

如果你需要在数据库中创建新用户,并授权,可以通过 MySQL 命令行执行以下 SQL 语句:

CREATE USER 'new_user'@'%' IDENTIFIED BY 'new_password';
GRANT ALL PRIVILEGES ON database_name.* TO 'new_user'@'%';
FLUSH PRIVILEGES;

或者,你也可以将这些语句写入一个 SQL 文件(如 setup_user.sql),然后通过 docker exec 导入:

docker exec -i mysql-container mysql -u root -p'root_password' < /path/to/setup_user.sql

5、将当前容器保存为新的docker镜像

完成所有配置后,你可以将当前的容器保存为一个新的 Docker 镜像。首先,使用以下命令停止并提交容器:

docker commit mysql-container your_mysql_image_name:tag

例如,如果你希望新镜像的名称为 my_custom_mysql:1.0,可以这样做:

docker commit mysql-container my_custom_mysql:1.0

这会将当前 MySQL 容器的状态保存为一个新的镜像。

docker commit mysql数据丢失

mysql数据库中的数据默认是存放在/var/lib/mysql目录下的,而mysql容器通常是将容器内的/var/lib/mysql作为volume挂载,当你使用commit命令把容器打包成镜像时,commit操作并不会包含容器内挂载的volume中的数据变化,所以会发现数据都不在了。

解决方法:

#在根目录下创建work目录

mkdir /work

#然后复制/var/lib/mysql下的数据到/work下

cp -r /var/lib/mysql /work

#修改数据库配置文件

vim /etc/mysql.conf.d/mysqld.cnf

#修改 [mysqld]下的datadir目录,将数据修改为刚才创建的目录

datadir = /work/mysql
(1)运行新的docker镜像

最后,使用新的镜像来启动一个新的容器:

docker run --name new-mysql-container -d my_custom_mysql:1.0

新的容器会使用你已经配置好的数据库、表、存储过程、用户名和密码。

(2)将镜像推送到docker hub或其他镜像仓库

如果你想将新镜像推送到 Docker Hub 或其他容器镜像仓库,可以使用以下命令:

docker login
docker tag my_custom_mysql:1.0 your_dockerhub_username/my_custom_mysql:1.0
docker push your_dockerhub_username/my_custom_mysql:1.0

这样,你就可以在其他机器上使用这个镜像,或者与他人共享。

三、安装zookeeper

1、运行命令

docker run -d \
  --name zookeeper \
  -p 2181:2181 \
  zookeeper:latest

2、持久化配置

docker run -d \
  --name zookeeper \
  -p 2181:2181 \
  -v /path/to/zookeeper/data:/data \
  -v /path/to/zookeeper/datalog:/datalog \
  zookeeper:latest

 

  • /path/to/zookeeper/data 是主机上的数据存储路径。
  • /path/to/zookeeper/datalog 是数据日志存储路径。

四、安装minio

1、运行命令

docker pull minio/minio
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin" \
  quay.io/minio/minio server /data --console-address ":9001"

2、持久化配置

docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin" \
  -v /path/to/minio/data:/data \
  minio/minio server /data --console-address ":9001"
  • /path/to/minio/data 是主机上的数据存储路径。
  • 访问 MinIO 控制台:http://localhost:9001

五、安装vsftp

1、运行命令

docker pull fauria/vsftpd

docker run -d \
  --name vsftp \
  -p 21:21 \
  -p 21000-21010:21000-21010 \
  -v /path/to/vsftp:/home/vsftpd \
  -e FTP_USER=user \
  -e FTP_PASS=password \
  fauria/vsftpd
  • /path/to/vsftp 是主机上的数据存储路径。
  • FTP_USERFTP_PASS 设置 FTP 用户名和密码。
  • 被动模式: 确保防火墙允许 21 和 21000-21010 端口的访问。

如果拉取vsftpd时超时,可以配置自己的代理,例如创建一个简单的脚本docker-pull-proxy.sh

#!/bin/bash
HTTP_PROXY="http://proxy.example.com:8080" \
HTTPS_PROXY="http://proxy.example.com:8080" \
docker pull "$@"

然后执行

docker ./docker-pull-proxy.sh docker.io/fauria/vsftpd

2、自定义配置

如果需要修改 vsftpd.conf 配置文件,可通过挂载一个自定义配置文件:

# 编辑本地 vsftpd.conf
nano /home/ftpdata/vsftpd.conf

# 示例配置内容:
write_enable=YES
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES

# 挂载自定义配置文件
docker run -d \
  --name vsftpd \
  -p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
  -v /home/ftpdata:/home/vsftpd \
  -v /path/to/vsftpd.conf:/etc/vsftpd/vsftpd.conf \
  --restart=always \
  fauria/vsftpd

3、使用host网络模式

如果你希望容器完全共享宿主机的网络栈(包括端口),可以使用 --network host 参数来指定容器使用宿主机的网络模式。

docker run --network host -d fauria/vsftpd

--network host 会让容器完全共享宿主机的网络,容器内的进程可以直接访问宿主机的网络,存在一定的安全风险。在生产环境中,通常建议使用端口映射(-p)来保持一定的隔离。

六、docker compose

通过 Docker Compose 可以同时启动上述所有服务。以下是一个示例 docker-compose.yml 文件:

version: '3.8'
services:
  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    command: redis-server --appendonly yes

  mysql:
    image: mysql:latest
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - ./mysql/data:/var/lib/mysql

  zookeeper:
    image: zookeeper:latest
    container_name: zookeeper
    ports:
      - "2181:2181"
    volumes:
      - ./zookeeper/data:/data
      - ./zookeeper/datalog:/datalog

  minio:
    image: quay.io/minio/minio
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - ./minio/data:/data
    command: server /data --console-address ":9001"

  vsftp:
    image: fauria/vsftpd
    container_name: vsftp
    ports:
      - "21:21"
      - "21000-21010:21000-21010"
    environment:
      FTP_USER: user
      FTP_PASS: password
    volumes:
      - ./vsftp:/home/vsftpd

启动服务

docker-compose up -d



相关推荐

一、redis-cli redis-cli,这个命令将打开redis终端。输入ping命令,如果有pong响应,说明正常启动。 用法:redis-cli [OPTIONS] [cmd [arg [ar

protected-mode是为了禁止公网访问redis,加强redis安全的。它启用的条件,有两个: (1)没有bind IP (2)没有设置访问密码。 <

一、单机模式 1、优点 (1)部署简单 (2)成本低 (3)高性能,因为不需要同步数据 2、缺点 (1)可靠性差 二、主从复制模式 主从模式配置很简单,只需要在从节点配置主节点的ip和端口号即可。

前置知识 1、requirepass验证客户端,对登录权限做限制,redis每个节点的requirepass可以是独立、不同的。 <p

在集群模式下,redis在接收到键任何命令时会先计算该键所在的槽,如果改键所在的槽位于当前节点,则直接执行命令,如果改键位于其它节点,则不执行该命令,返回重定向信息。比如hello这

1、sentinel不会存储数据。 2、客户端不会直接从redis中获取信息,而是从sentinel获取信息。 3、sentinel的默认端口是26379 <

redis-cli keys "s*" | xargs redis-cli del 另外还可以用-n指定操作的数据库编号 redis-cli -n 2 keys "s*" | xargs redis-

psubscribe pattern [pattern] 与subscribe一样,只是可以使用*匹配符匹配多个channel

ZSCORE key member 如果member元素不是有序集key的成员,或key不存在,返回nil

1、官方文档 The timeout will only be cleared by commands that delete or overwrite the contents of the key