项目踩坑--ubuntu18.x在docker中安装mysql修改字符集问题(my.cnf配置文件)

本文主要介绍了在ubuntu18.x的docker环境下,如何解决mysql5.7默认字符集为latin1的问题,强调了要使字符集修改为utf8并保持重启有效,需修改my.cnf配置文件。由于在docker容器中找不到my.cnf,因此需要手动创建并编辑该文件,确保配置正确后重启mysql服务,最终成功将字符集更改为utf8。

关于ubuntu18.x下在docker中安装mysql5.7字符集问题

先进入docker容器中(指的是mysql容器)
命令:

docker exec -it mysql bash

上面命令写mysql的位置 是你mysql容器的名字,我的容器名字是mysql,不知道自己容器名字的可以用 docker images查看

然后成功进入容器内,和之前终端控制台使用mysql一样,输入:

mysql -uroot -p

进入mysql界面,再输入:

show variable like 'char%';

可以看到docker中安装的mysql5.7默认字符集是latin1:
在这里插入图片描述

划重点:想要让mysql的字符集改变成utf8,并且重启仍然有效,就要修改mysql的配置文件

那么重点来了,网上很多方法都是让修改那个神秘的my.cnf配置文件,可是当我们进入到docker容器中,去/etc/m

<think>我们参考用户的问题和提供的引用内容,用户想要在Ubuntu系统上使用DockerDocker Compose部署MySQL和Redis。 根据引用[2]和引用[4],我们可以分别创建MySQL和Redis的docker-compose配置文件,并创建必要的目录。 步骤: 1. 创建目录结构 2. 编写docker-compose-mysql.yml和docker-compose-redis.yml(或者也可以合并到一个文件,但用户要求两个服务,我们可以分开部署,也可以一起部署。这里为了管理方便,我们分开部署,用户也可以选择合并) 3. 启动服务 注意:用户要求安装MySQL和Redis,所以我们需要两个docker-compose文件,或者一个同时包含两者的文件。但引用中提供了单独的配置示例。 我们选择分开部署,这样更灵活,可以单独启停。 但是,用户也可以选择在一个docker-compose文件中定义两个服务(mysql和redis),这样只需要一个命令就可以同时启动。这里我们提供两种方式,并推荐分开部署以便管理。 由于用户没有明确要求,我们按照引用中的方式分别创建配置文件。 步骤详细说明: 方式一:分开部署(两个独立的docker-compose文件) 1. 创建MySQL所需的目录和配置文件 2. 创建Redis所需的目录和配置文件 3. 分别编写docker-compose文件并启动 方式二:合并部署(一个docker-compose文件同时包含mysql和redis) 这里我们分别给出两种方式的示例,并按照引用中的配置进行。 由于引用中提供的MySQL配置没有具体的docker-compose文件内容,引用[2]只提到了目录创建,引用[3]有一个Dockerfile用于构建MySQL镜像(但用户可能不需要构建,可以直接使用官方镜像)。而引用[4]提供了redis的docker-compose配置。 因此,我们结合官方镜像和引用中的配置来编写。 我们选择分开部署的方式,因为这样更清晰,并且用户可以根据需要单独启停。 具体步骤: 步骤1:创建目录 在系统上选择一个目录,比如/docker(需要root权限,或者用户可以选择在用户目录下,比如~/docker)。这里我们按照引用[2]在根目录下创建,但实际中建议在用户目录下以避免权限问题。 如果用户使用root权限,可以: ``` sudo mkdir -p /docker/mysql/{data,conf,log} sudo mkdir -p /docker/redis/{conf,data} ``` 如果用户想避免使用root,可以在用户目录下创建,例如: ``` mkdir -p ~/docker/mysql/{data,conf,log} mkdir -p ~/docker/redis/{conf,data} ``` 步骤2:编写配置文件 对于MySQL,我们需要一个基本的配置文件my.cnf),但也可以不使用配置文件,直接通过环境变量配置。这里我们提供一个简单的配置文件示例。 在mysql的conf目录下创建my.cnf: ``` [mysqld] user=mysql character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 ``` 对于Redis,我们需要一个redis.conf配置文件,可以从官网获取,或者使用一个简单的配置。在redis的conf目录下创建redis.conf,内容如下(示例): ``` bind 0.0.0.0 protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 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 ./ requirepass yourpassword # 设置密码,可选 ``` 步骤3:编写docker-compose文件 在~/docker目录下(或者/docker)创建docker-compose-mysql.yml和docker-compose-redis.yml。 docker-compose-mysql.yml(参考引用[3]使用mysql:8镜像,但注意引用[3]中使用了Dockerfile,我们这里直接使用环境变量和配置文件): ``` version: '3' services: mysql: image: mysql:8 container_name: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: your_mysql_root_password # 设置root密码 TZ: Asia/Shanghai volumes: - ~/docker/mysql/data:/var/lib/mysql - ~/docker/mysql/conf:/etc/mysql/conf.d - ~/docker/mysql/log:/var/log/mysql command: --default-authentication-plugin=mysql_native_password # 如果使用旧版认证方式需要 restart: always ``` 注意:volumes中我们将本地的conf目录挂载到容器的/etc/mysql/conf.d,这样容器会读取该目录下的配置文件。我们之前创建的my.cnf文件需要放在~/docker/mysql/conf目录下。 docker-compose-redis.yml(参考引用[4]): ``` version: '3' services: redis: image: redis:6.2.7 container_name: redis ports: - "6379:6379" environment: TZ: Asia/Shanghai volumes: - ~/docker/redis/conf:/redis/config # 注意:引用[4]中挂载到/redis/config,但redis默认配置路径是/etc/redis/redis.conf,所以我们需要在command中指定配置文件 - ~/docker/redis/data:/redis/data command: "redis-server /redis/config/redis.conf" # 使用我们挂载的配置文件 restart: always ``` 步骤4:启动服务 进入存放docker-compose文件的目录(比如~/docker),然后分别启动: ``` docker-compose -f docker-compose-mysql.yml up -d docker-compose -f docker-compose-redis.yml up -d ``` 停止服务: ``` docker-compose -f docker-compose-mysql.yml down docker-compose -f docker-compose-redis.yml down ``` 方式二:合并部署(一个文件) 如果用户希望一个文件同时启动两个服务,可以创建一个docker-compose.yml文件,内容如下: ``` version: '3' services: mysql: image: mysql:8 container_name: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: your_mysql_root_password TZ: Asia/Shanghai volumes: - ~/docker/mysql/data:/var/lib/mysql - ~/docker/mysql/conf:/etc/mysql/conf.d - ~/docker/mysql/log:/var/log/mysql command: --default-authentication-plugin=mysql_native_password restart: always redis: image: redis:6.2.7 container_name: redis ports: - "6379:6379" environment: TZ: Asia/Shanghai volumes: - ~/docker/redis/conf:/redis/config - ~/docker/redis/data:/redis/data command: "redis-server /redis/config/redis.conf" restart: always ``` 然后启动: ``` docker-compose up -d ``` 停止: ``` docker-compose down ``` 注意:合并部署时,两个服务会在同一个网络下,可以直接通过服务名互相访问(比如在应用中连接mysql,可以使用mysql作为主机名,连接redis使用redis作为主机名)。而分开部署时,默认情况下两个服务不在同一个网络,需要额外配置网络或者使用host网络。 但是,在分开部署的情况下,我们也可以为两个compose文件指定相同的网络(需要先创建网络),或者使用host网络(直接使用宿主机的localhost)。这里为了简单,我们在compose文件中使用了默认的网络(bridge),所以分开部署时,服务之间不能直接通过服务名访问。 如果用户希望分开部署的服务能够互相访问,可以考虑使用host网络(在服务配置中添加`network_mode: "host"`,但这样端口就直接绑定到宿主机,且端口冲突需要注意)或者创建一个外部网络并让两个服务都加入。 由于用户问题中没有提到服务间通信,我们暂时按照最简单的方式(使用bridge网络,通过宿主机IP访问)来部署。 总结:用户可以根据需要选择分开部署或合并部署。我们提供了两种方式的配置示例。 注意:配置文件中的路径(volumes)需要根据实际创建的目录调整,密码也要替换为实际的强密码。 最后,我们生成相关问题。</think>### 在 Ubuntu 上使用 Docker Compose 部署 MySQL 和 Redis #### 步骤 1:安装 DockerDocker Compose ```bash # 安装 Docker sudo apt update sudo apt install docker.io -y sudo systemctl enable --now docker # 安装 Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ``` #### 步骤 2:创建项目目录结构 ```bash mkdir -p ~/docker-app/{mysql,redis} cd ~/docker-app ``` #### 步骤 3:配置 MySQL 服务 创建 `docker-compose-mysql.yml`: ```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: your_root_password # 替换为你的密码 TZ: Asia/Shanghai volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d - ./mysql/log:/var/log/mysql restart: always command: --default-authentication-plugin=mysql_native_password ``` #### 步骤 4:配置 Redis 服务 创建 `docker-compose-redis.yml`: ```yaml version: '3.8' services: redis: image: redis:6.2 container_name: redis ports: - "6379:6379" environment: TZ: Asia/Shanghai volumes: - ./redis/data:/data - ./redis/conf:/usr/local/etc/redis command: redis-server /usr/local/etc/redis/redis.conf restart: always ``` #### 步骤 5:启动服务 ```bash # 启动 MySQL docker-compose -f docker-compose-mysql.yml up -d # 启动 Redis docker-compose -f docker-compose-redis.yml up -d ``` #### 步骤 6:验证服务状态 ```bash docker ps -a | grep -E 'mysql|redis' ``` 应显示两个状态为 `Up` 的容器。 #### 常用管理命令 | 操作 | 命令 | |------|------| | 停止 MySQL | `docker-compose -f docker-compose-mysql.yml down` | | 停止 Redis | `docker-compose -f docker-compose-redis.yml down` | | 查看日志 | `docker logs mysql` 或 `docker logs redis` | | 进入容器 | `docker exec -it mysql bash` | > **注意**: > 1. 将 `your_root_password` 替换为实际密码 > 2. 数据持久化在 `~/docker-app/mysql/data` 和 `~/docker-app/redis/data` 目录 > 3. 配置文件目录 `conf` 可自定义配置[^4][^2] --- ### 相关问题 1. **如何修改 MySQL默认字符集为 utf8mb4?** > 在 `mysql/conf` 目录创建 `my.cnf` 文件,添加: > ``` > [mysqld] > character-set-server=utf8mb4 > collation-server=utf8mb4_unicode_ci > ``` 2. **Redis 如何设置访问密码?** > 在 `redis/conf/redis.conf` 中添加: > ``` > requirepass your_redis_password > ``` 3. **如何备份 Docker 中的 MySQL 数据?** > 使用命令: > ```bash > docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql > ``` 4. **容器无法启动时如何排查问题?** > 查看日志: > ```bash > docker logs mysql --tail 50 > ``` 5. **如何将多个服务合并到一个 docker-compose 文件?** > 创建 `docker-compose.yml` 合并两个服务的配置,然后运行: > ```bash > docker-compose up -d > ``` [^1]: 通过 Docker Compose 实现服务容器化部署 [^2]: 使用 Docker Compose 管理 MySQL 服务的最佳实践 [^3]: Docker 容器MySQL 的初始化配置方法 [^4]: Redis 容器化部署的配置文件管理
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值