代码改变世界

Docker安装mysql 和使用docker compose安装mysql

2020-05-22 23:13  youxin  阅读(675)  评论(0编辑  收藏  举报

docker-compose创建mysql8.0最佳做法:

version: '3'

services:
  mysql:
    hostname: mysql8_0
    container_name: mysql8_0 
    image: mysql:8
    restart: unless-stopped #  指定了容器的重启策略,除了手动停止容器,其他情况都自动重启容器
    environment:
      TZ : "Asia/Shanghai" # 指定了容器的环境变量,设置容器的时区为上海时区
      LANG: "C.UTF-8" # 指定了容器的环境变量,设置容器的编码为UTF-8

      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_ROOT_HOST: '%'
      MYSQL_DATABASE: "testdb"
      # MYSQL_USER: "root"
      # MYSQL_PASSWORD: "123456"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./logs:/var/log/mysql 
      #- ./xx.sql:/docker-entrypoint-initdb.d/init.sql:ro

docker-compose -f  mysql.yml up 

查看数据库编码:

show create database testdb;

 

全局默认字符集修改
command:
- mysqld
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci

 

关于配置文件my.cnf,不同镜像不同。先创建一个容器,查找my.cnf的位置,然后用docker cp到宿主机。

然后修改volume增加

 - ./conf/my.cnf:/etc/my.cnf 
即可

WARNING: Found orphan containers (xxxxxx) for this project.
If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up

原因是 project name 命名冲突,docker-compose 默认用目录名做 project name,所以在同一台机器上启动两个不同的 compose 项目时,当目录名相同时会出现冲突

解决:

  1. 用 -p 参数指定不同的 project name
  2. 在 .env 文件里面添加 project name: COMPOSE_PROJECT_NAME=myproject
  3. 修改目录名称

参考:
docker compose orphan containers warning

事先准备

centos系统或者linux系统

安装步骤

安装基础的工具yum-utils device-mapper-persistent-data lvm2

yum install -y yum-utils device-mapper-persistent-data lvm2

添加docker-ce yum仓库

因为在阿里云的ecs机器上面,yum镜像使用的阿里云的,找不到docker的镜像,所以需要第一步的安装基础工具之后使用yum-config-manager来添加对应的yum仓库,执行如下命令

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker-ce

通过上面两个步骤我们已经建立好了docker-ce的镜像链接,接下来只需要安装docker-ce就可以了,执行如下命令,安装这个的时间会稍微有点长,需要耐心的等待大概3-5分钟

yum install docker-ce

启动、停止docker服务

systemctl start docker  #启动docker服务
systemctl stop docker  #关闭docker服务

设置开机启动Docker Daemon进程

systemctl start docker.service
systemctl enable docker.service
systemctl grep docker查看docker进程的状态
# 开机自启
sudo systemctl enable docker 
# 启动docker服务  
sudo systemctl start docker
 

安装docker-compose

安装docker-compose相对比较简单,可以直接去https://github.com/docker/com... 下载然后选择相应的版本,或者直接执行如下命令安装,安装完后docker-compose会被安装到/usr/local/bin目录下

curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

设置docker-compose可执行

sudo chmod +x /usr/local/bin/docker-compose

查看docker-compose是否安装成功

docker-compose --version

至此,安装过程已经全部完

从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。

Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。

 

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低

观察Docker图标,其实很形象的解释了什么是Docker。在没有使用集装箱的情况下,我们需要考虑不同形状、尺寸的货物怎么安放,货物与货物之间是否能堆叠,这无疑是很繁琐的事情。现在有了集装箱(容器),我们就能将不同的货物放入集装箱之内这样就能以同样的方式来存放货物,实现了标准化。

Docker采用了集装箱原理,我们将程序放入到容器中,实现“一次封装,到处运行”,只要开发环境能跑,在其他任何流行的机器上都能运行。并且将程序丢入到容器中,很好的实现了程序与程序之间的隔离,避免了类似Java开发的程序和.net开发的程序安装在一个服务器上需要很多调试,有时还会产生冲突的情况。
————————————————
版权声明:本文为CSDN博主「甲如没有乙后」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26624661/article/details/79565735

 

第一步

docker pull mysql:5.7 # 拉取 mysql 5.7 ( docker pull mysql # 拉取最新版mysql镜像 )

 第二部:

然后创建一个文件夹用来存放mysql的配置文件,日志,以及数据等(也就是所谓的挂载目录,作用就是将此目录中的文件或文件夹覆盖掉容器内部的文件或文件夹)

cd mysql:

mkdir conf logs  data

 

在conf下面建个简单的配置文件my.cnf

[mysqld]
 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
 
# 表名不区分大小写
lower_case_table_names=1 
#server-id=1
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysqlx.sock
#symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

可以在mysqld跳过 密码:

#skip-grant-tables

 

 

第三步

在上面创建的目录下使用命令启动mysql容器

 

docker run -it -d -p 3306:3306 --name mymysql \
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf \
-v $PWD/logs:/var/log/mysql  \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=d8446$@#hashPWd \
mysql:5.7

 

-d:表示后台运行,不加-d执行上面的命令你就会看到mysql启动的日志信息了

-p:表示端口映射,冒号左面的是我们的宿主机的端口,也就是我们虚拟机的端口,而右侧则表示的是mysql容器内的端口

--name:是我们给mysql容器取的名字

-v:表示挂载路径,$PWD表示当前目录下,冒号左面的表示我们宿主机的挂载目录,也就是我们虚拟机所在的文件路径,冒号右边则表是的是mysql容器在容器内部的路径,上面的命令我分别挂载了my.cnf(mysql的配置文件),如需使用配置文件的方式启动mysql,这里则需要加上,mysql的日志,还有mysql存放数据所在的目录

 
上面命令报错运行这个:
docker run -it -d -p 3306:3306 --name mysql \
-v $PWD/conf/:/etc/mysql/conf.d \
-v $PWD/logs:/var/log \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=guizhouDB19#87Db919#SS \
mysql:5.7

-v $PWD/conf/my.cnf:/etc/mysql/my.cnf \
报错换成这个:
-v $PWD/conf/:/etc/mysql/conf.d
 
windows下面:
docker run -it -d -p 3306:3306 --name mysql -v F:\Docker\dockerContainer\mysql\conf:/etc/mysql -v F:\Docker\dockerContainer\mysql\logs:/var/log/mysql   -v  F:\Docker\dockerContainer\mysql\data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  mysql:5.7

 


客户端测试

 docker exec -it mymysql bash
 
需要进入docker本地客户端设置远程访问账号
  $ mysql -uroot -p123456
mysql> grant all privileges on *.* to root@'%' identified by "password";
 
mysql 5.7修改root密码:

.用户无密码登录

mysql -uroot -p (直接点击回车,密码为空)

5.选择数据库

use mysql;

6.修改root密码

update mysql.user set authentication_string=password('123456') where user='root';

7.执行

flush privileges;

8.退出 mysql

quit

9.编辑 /etc/my.cnf

删除 skip-grant-tables 保存退出

10.重启docker容器

 

用docker装的mysql 默认是允许外网访问的。 我们外网访问不了是因为没有重启docker中的mysl,重启下就行了。

mysql 默认只允许本地的localhost访问。网上有一堆更改为允许外部访问的教程,但是由于mysql版本的原因,无一例外的都失败了。
最后在一篇文章发现了缺失的一个操作。所以现在记录一下

步骤

  1.  mysql -u root -p   登录数据库
    
    • 1
  2.  use mysql; 选择基础信息数据库
    
    • 1
  3.  select  User,authentication_string,Host from user 		查询数据库用户,在这里正常来说,应该都localhost
    
    • 1
  4.  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456'   
    
     新增一个root用户,所有地址(%)的都可以访问,并且密码为123456 。这里可以根据你的情况酌情修改
    
    • 1
    • 2
    • 3
  5.  flush privileges;  		清除缓存,重新加载权限
    
    • 1
    一般来讲如果是旧版的mysql,以上的操作,就已经让数据库可以外部访问了。但是很遗憾,在mysql5.7中,上面还不足够。
  6.  你需要修改       /etc/mysql/mysql.conf.d/mysqld.cnf 文件。将其中的
     bind-address 注释掉。然后重启数据库,搞定

 

 

https://www.jianshu.com/p/aebf6dacb051

 

https://www.runoob.com/docker/centos-docker-install.html

 

https://www.cnblogs.com/kex1n/p/6933039.html

 

 

https://www.jianshu.com/p/ca1623ac7723

https://blog.csdn.net/jianchi1117/article/details/86678486

 

GUI管理
这里推荐使用 Portainer 作为容器的 GUI 管理方案。
官方地址:https://portainer.io/install.html
安装命令:

docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
访问你的 IP:9000 即可进入容器管理页面

 

docker通过pull方式安装mysql

1.搜索镜像

命令:docker search mysql,mysql的这种安装方式和上一节我们介绍的tomcat的步骤很相似。

2.拉取下载镜像

命令:docker pull mysql:5.6,这里以5.6版本为例。

3.查看下载到的镜像

命令:docker images |grep mysql

4.运行docker容器

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.6

命令说明:

-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。-v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。5.查看启动情况

命令:docker ps

 https://www.cnblogs.com/yy-cola/p/11226924.html

 

需要进入docker本地客户端设置远程访问账号

https://www.w3cschool.cn/docker/docker-install-mysql.html

https://www.jianshu.com/p/d6febf6f95e0

 

使用 Docker Compose 部署 MySQL 8.0

version: '3.3'
services:
    mysql-db:
        container_name: mysql_8_0
        image: mysql:8.0
        command:
        # MySQL8的密码验证方式默认是 caching_sha2_password,但是很多的连接工具还不支持该方式
        # 就需要手动设置下mysql的密码认证方式为以前的 mysql_native_password 方式
          --default-authentication-plugin=mysql_native_password
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
        restart: always
        ports:
            - 3308:3306
        #容器日志大小配置
        logging:
          driver: 'json-file'
          options:
            max-size: '5g'
        environment:
          # 配置root密码
          MYSQL_ROOT_PASSWORD: 123456 # root用户的密码
          TZ: "Asia/Shanghai"
        volumes:
          # 挂载数据目录
          - ./data:/var/lib/mysql
          # 挂载配置文件目录
          - ./conf:/etc/mysql/conf.d
          - ./logs:/var/logs
~                             

 

启动容器

在命令行中,进入到你的项目目录,然后运行以下命令启动容器:

docker-compose up -d

这将会拉取 MySQL 8.0 镜像并启动一个新的容器