使用 Docker 创建 MySQL 容器服务
标签:
MySQL
Docker
实践
2022-11-05
5 分钟

Docker 下载

前往官网下载 Docker https://www.docker.com/

安装

docker-install

打开 Docker 后,我们需要登录账号,没有的话,注册一下就好

修改安装源

点击 设置 / Docker Engine

docker-change-registry

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "debug": true,
  "experimental": false,
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

这里我室友的阿里云的个人源地址,这还是免费的,网上还有很多国内源,自己选择就好。

修改完需要点击右下角的重启就好。

安装 MySQL

使用的 Docker Hub Image: https://hub.docker.com/_/mysql

这里安装 8.0 的版本

  1. 打开终端
🤙  ~ docker --version
Docker version 20.10.20, build 9fdeb9c

两个概念

  • images: 镜像

docker-cli-images

docker images -a

当前已创建的镜像

  • container:容器

docker-cli-containers

docker ps
dcpker ps -a

当前正在运行中的容器 当前全部的容器

docker-create-mysql-container

docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your-pwd -v mysql:/var/lib/mysql --restart unless-stopped mysql:8

Unable to find image 'mysql:8' locally 表示当前镜像再本地不存在,需要在 远程 hub 中查找,及下载

docker-pull-mysql-images

docker-pull-mysql-success

  • docker run: 运行一个容器
  • --name mysql: 容器的名称是 mysql(可以自己定义,没有限制)
  • -d: 此命令将在后台运行容器
  • -p 3306:3306: 容器服务的 3306 端口开放到宿主网络(你的系统)映射的端口是 3306(这个端口可以自己填写)
  • -e MYSQL_ROOT_PASSWORD=your-pwd: 为容器设置环境变量,名称为 MYSQL_ROOT_PASSWORD 这里会被内部使用,作为 root 用户的密码 your-pwd 可以自定义
  • --restart unless-stopped: 指示 Docker 始终可以重新启动容器,若 Docker 守护进程发生重新启动或更新后,该容器自动重启。unless-stop 表示 docker stop 停止容器时, Docker 守护进程的重启将不会影响容器
  1. 查看容器信息

看下容器运行日志 docker-logs-mysql

这里 mysql 是容器名称

docker-mysql-info

docker-ui-containers

docker-ui-images

ok,我们连接下数据库

connect-mysql

docker exec -it mysql mysql -p

docker-exec-mysql-login

  • docker exec:以执行的方式向容器传递 shell
  • -it: 以交互的方式
  • mysql: 容器名称
  • mysql -p: 在容器的 bash 下执行,以密码的方式登入 MySQL cli

docker-mysql-cli

docker-mysql-show-dbs

  1. 使用持久化数据

此时我们已经可以连接使用数据库了,但还没有配置 Docker Volumes (容器持久化卷宗)。也就是当前 MySQL 的书就是被临时挂在容器默认使用的路径上(容器 <-> 宿主路径),随着容器的删除,临时的路径也会被删除,所以我们需要持久化我们的数据。

docker stop mysql
docker rm mysql

这里的 mysql 均是容器名称

docker-cli-status

docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your-pwd -v mysql:/var/lib/mysql --restart unless-stopped mysql:8
  • -v mysql:/var/lib/mysql: 容器的关联到宿主的 /var/lib/mysql 下, mysql 为 Volumes 名称

docker-ui-volumes

docker-cli-volumes

此时我们删除容器,该卷宗依然存在

docker stop mysql
docker rm mysql

如果要删除卷宗

docker volume rm mysql

其他

使用容器网络

在上面的示例中,端口转发用于在你的主机网络上公开 MySQL 服务器。如果你只从另一个 Docker 容器(例如您的 API 服务器)连接到 MySQL,更好的方法是创建一个专用的Docker 网络。这通过限制数据库的暴露来提高安全性。

首先为您的应用程序创建一个 Docker 网络:

docker network create example-app

启动 MySQL 容器时指定此网络:

docker run --name mysql -d -e MYSQL_ROOT_PASSWORD=your-pwd -v mysql:/var/lib/mysql --network example-app mysql:8

将另一个容器连接到同一个网络:

docker run --name api-server -d -p 80:80 --network example-app example-api-server:latest

API 和 MySQL 容器现在共享一个网络。可以通过引用 MySQL 容器的主机名从 API 容器连接到 MySQL。默认情况下,这与容器的名称匹配。在这里,应用程序应连接到mysql主机上的端口 3306

MySQL 配置

官方 MySQL 镜像支持多个环境变量,您可以使用它们来配置容器的初始状态。例如,MYSQL_ROOT_PASSWORD.  使用 -e 标志 docker run 设置这些变量。它们仅在容器第一次启动时配置,此时 MySQL 数据目录为空。

  • MYSQL_DATABASE - 容器启动时要创建的数据库模式的名称。
  • MYSQL_USER-MYSQL_PASSWORD 容器启动时创建一个新的普通用户。
  • MYSQL_RANDOM_ROOT_PASSWORD - MYSQL_ROOT_PASSWORD 如果您希望 MySQL root 为您生成安全密码,请设置此选项。如果启用此设置,密码将 docker logs 在首次启动期间发送到容器的日志(可通过命令访问)。之后将无法找回密码。
© 2019 - 2024, Hehehai 晋ICP备2024032508号-1