阿里云下docker安装mysql 整体过程和问题解析

阿里云安装Docker+MySQL教程

阿黄我看最近大家都在热衷于docker。 

那我们今天就来看看全新阿里云下面安装docker+mysql教程


1.从官方给的步骤

  1. 添加yum源。

     
      
    1. # yum install epel-release –y
    2. # yum clean all
    3. # yum list
  2. 安装并运行Docker。(社区群众自行安装社区版)

     
      
    1. # yum install docker-io –y
<think>我们已经在之前的回答中详细说明了获取连接信息的方法,现在用户希望直接用Shell脚本获取这些信息并输出。 目标:编写一个Shell脚本,自动获取以下信息并输出: - 服务器的公网IP(用于连接) - MySQL容器映射的端口(宿主机端口) - 数据库用户名(默认为root,但也可以考虑其他用户,不过用户可能更关注root) - 密码(这个比较麻烦,因为密码在启动容器时设置,脚本无法直接获取,除非用户提供或从环境变量中提取) 但是,我们需要注意的是: 1. 公网IP:可以通过外部服务(如ifconfig.me)获取,但要注意如果服务器没有公网IP或者有多个IP的情况?用户明确在阿里云服务器,所以一般有公网IP。 2. 端口:通过`docker ps`命令获取容器的端口映射,但需要找到是哪个容器(可能运行了多个MySQL容器?)。我们可以通过容器名称或者镜像名称来过滤。用户没有指定容器名称,我们可以假设用户只有一个MySQL容器,或者通过镜像名称(mysql)来查找。 3. 用户名:默认是root,但用户也可能创建了其他用户。这里我们主要获取root用户,因为可视化工具连接通常先用root。如果用户需要其他用户,则需要另外指定。 4. 密码:脚本无法直接获取密码,因为密码是在容器启动时通过环境变量设置的,或者在容器内部修改过。我们可以尝试从启动命令中提取(如果用户是用`docker run`命令启动的,并且我们能够获取到历史命令?),但这并不可靠。另一个方法是要求用户在运行脚本时输入容器名称或ID,然后我们进入容器内部查看?但这会使得脚本变得复杂且需要交互。 考虑到以上难点,我们可以这样设计脚本: - 获取公网IP:使用`curl ifconfig.me`,如果失败可以尝试其他方式(如`curl icanhazip.com`)。 - 获取容器映射端口:通过`docker ps`过滤mysql镜像的容器,然后解析端口映射。 - 获取用户名:默认输出root,同时提示用户可以使用其他用户。 - 获取密码:无法直接获取,所以脚本中我们给出提示,让用户回忆密码是如何设置的(比如启动时的环境变量,或者重置密码的方法)。 另外,我们还可以考虑从容器环境变量中获取密码(如果容器是通过`-e MYSQL_ROOT_PASSWORD`设置的),我们可以通过`docker inspect`来获取环境变量。 步骤: 1. 获取公网IP。 2. 查找MySQL容器(按镜像名称过滤,比如包含'mysql'的镜像)。 3. 获取该容器的端口映射(宿主机的端口)。 4. 获取该容器的环境变量,并从中提取MYSQL_ROOT_PASSWORD(如果有的话)。 5. 如果找不到密码,则提示用户。 注意:可能有多个MySQL容器,我们只取第一个?或者让用户指定容器名称? 为了健壮性,我们可以让用户输入容器名称(如果只有一个则直接使用,否则提示用户选择)。 但是,用户希望完全通过shell工具自动获取,所以我们先尝试自动获取第一个运行的MySQL容器。 脚本设计: 首先,我们尝试获取MySQL容器的ID或名称: `docker ps --filter "ancestor=mysql" --format "{{.ID}}"` (注意:镜像名称可能不完全是mysql,可能是mysql:tag,或者用户自定义的镜像,所以我们可以放宽条件,比如使用`--filter "name=mysql"`?但容器名称也不一定包含mysql) 更通用的方法:我们可以通过环境变量来标识(但用户可能没有设置),或者我们提示用户输入容器名称的一部分,或者列出所有容器让用户选择?这样就需要交互。 为了简单,我们假设用户只有一个正在运行的MySQL容器,且镜像名称包含'mysql'。 我们使用: `container_id=$(docker ps --filter "ancestor=mysql" --format "{{.ID}}" | head -n 1)` 如果找不到,我们再尝试用容器名称包含'mysql'的: `container_id=$(docker ps --filter "name=mysql" --format "{{.ID}}" | head -n 1)` 如果还找不到,则报错。 然后,通过容器ID获取端口映射: `docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $container_id` 但是,这个输出可能包含多行(多个端口),我们只关心3306/tcp映射的宿主机端口。 我们可以解析: `docker port $container_id 3306/tcp | cut -d ':' -f 2` 获取环境变量中的密码: `docker inspect $container_id --format '{{range .Config.Env}}{{println .}}{{end}}' | grep MYSQL_ROOT_PASSWORD= | cut -d '=' -f 2` 但是,请注意,用户可能没有设置MYSQL_ROOT_PASSWORD,而是通过其他方式(如MYSQL_RANDOM_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORD等)或者使用了其他用户。 脚本输出: 公网IP: xxx 端口: xxx 用户名: root 密码: xxx (如果找到) 或者 提示“无法从环境变量获取密码,请检查容器启动时的密码设置” 另外,如果用户没有设置公网IP(比如服务器只有内网IP),那么我们需要获取内网IP?但可视化工具通常需要公网IP才能远程连接。所以脚本只获取公网IP,如果获取不到公网IP,则获取内网IP作为备用。 获取内网IP:`hostname -I | awk '{print $1}'` 编写脚本: 注意:由于阿里云服务器可能有多个网卡,内网IP可以用`hostname -I`取第一个。公网IP用外部服务获取。 脚本内容如下: </think>### 在阿里云服务器Shell中获取DockerMySQL容器连接信息 以下是自动化脚本方案,通过Shell命令获取MySQL容器的连接信息(IP、端口、用户密码): ```bash #!/bin/bash # 1. 获取公网IP(阿里云服务器) PUBLIC_IP=$(curl -s ifconfig.me) echo "[公网IP] $PUBLIC_IP" # 2. 获取MySQL容器映射端口 MYSQL_CONTAINER=$(docker ps --filter "ancestor=mysql" --format "{{.ID}}" | head -n1) if [ -z "$MYSQL_CONTAINER" ]; then echo "未找到运行的MySQL容器" exit 1 fi MAPPED_PORT=$(docker inspect $MYSQL_CONTAINER \ --format='{{range $p, $conf := .HostConfig.PortBindings}}{{$p}}{{"->"}}{{(index $conf 0).HostPort}}{{"\n"}}{{end}}' \ | grep 3306/tcp | awk -F'->' '{print $2}') echo "[容器端口] $MAPPED_PORT" # 3. 获取数据库用户密码 PASSWORD=$(docker inspect $MYSQL_CONTAINER \ --format='{{range .Config.Env}}{{println .}}{{end}}' \ | grep MYSQL_ROOT_PASSWORD= | cut -d'=' -f2) if [ -z "$PASSWORD" ]; then echo "[警告] 未找到ROOT密码,请检查启动参数" else echo "[用户名] root" echo "[密码] $PASSWORD" fi # 4. 安全组验证提示 echo "请确保阿里云安全组已开放 $MAPPED_PORT 端口 [^1]" ``` #### 输出示例: ```plaintext [公网IP] 120.xx.xx.xx [容器端口] 3307 [用户名] root [密码] MySecurePass123 请确保阿里云安全组已开放 3307 端口 [^1] ``` #### 关键步骤说明: 1. **公网IP获取** 使用`curl ifconfig.me`获取阿里云公网IP,这是外部连接地址[^1]。 2. **容器端口提取** ```bash docker inspect --format='{{range $p, $conf := .HostConfig.PortBindings}}{{$p}}{{"->"}}{{(index $conf 0).HostPort}}{{end}}' <容器ID> ``` 解析容器启动时的`-p`参数映射关系(如`-p 3307:3306`) 3. **密码获取原理** 通过解析容器环境变量获取密码: ```bash docker inspect --format='{{range .Config.Env}}{{.}}{{"\n"}}{{end}}' <容器ID> ``` 过滤`MYSQL_ROOT_PASSWORD`变量值 #### 常见问题处理: 1. **端口未找到** 检查容器是否使用非标准端口映射: ```bash docker inspect <容器ID> | jq '.[0].NetworkSettings.Ports' ``` 2. **密码获取失败** 当容器未通过环境变量设置密码时: ```bash # 进入容器查看用户表 docker exec -it <容器ID> mysql -uroot -p -e "SELECT user, host FROM mysql.user;" ``` 3. **安全组配置** 必须通过阿里云控制台添加安全组规则: ``` 方向:入方向 协议类型:MySQL(3306) 端口范围:容器映射端口(如3307) 授权对象:0.0.0.0/0(或您的IP) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值