安装 Mysql

docker-compose安装Mysql

  • 首先创建个目录用来存放docker-compse文件

    1
    2
    [root@node1 ~]# mkdir /usr/docker/env -p
    [root@node1 ~]# cd /usr/docker/env/
  • 编写docker-compose

    1
    2
    3
    [root@node1 ~]# mkdir /usr/docker/env/mysql -p
    [root@node1 ~]# cd /usr/docker/env/mysql
    [root@node1 ~]# vim docker-compose.yml
  • yaml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    version : '3'
    services:
    mysql57:
    # 容器名(以后的控制都通过这个)
    container_name: mysql57
    # 重启策略
    restart: always
    image: mysql:5.7
    ports:
    - "3306:3306"
    volumes:
    # 挂挂载配置文件
    # - ./db/:/docker-entrypoint-initdb.d
    # 挂挂载配置文件
    - ./conf:/etc/mysql/conf.d
    # 挂载日志
    - ./logs:/logs
    # 挂载数据
    - ./data:/var/lib/mysql
    command: [
    'mysqld',
    '--innodb-buffer-pool-size=80M',
    '--character-set-server=utf8mb4',
    '--collation-server=utf8mb4_unicode_ci',
    '--default-time-zone=+8:00',
    '--lower-case-table-names=1'
    ]
    environment:
    # root 密码
    MYSQL_ROOT_PASSWORD: 123456
  • 启动

    1
    docker-compose up -d mysql57

安装 mysql 5.7 版本

  1. 拉取镜像

    1
    $ docker pull mysql:5.7
  2. 新建需要挂载文件夹

    1
    2
    $ mkdir -p /docker-data/mysql/data
    $ mkdir -p /docker-data/mysql/conf.d
  3. conf.d目录创建my.cnf

    1
    2
    3
    4
    5
    6
    $ vi /docker-data/mysql/conf.d/my.cnf
    [mysqld]
    # skip-grant-tables作为启动参数的作用: MYSQL服务器不加载权限判断,任何用户都能访问数据库。
    skip-grant-tables
    # 设置北京时区
    default-time_zone = '+8:00'
  4. 运行并挂载在本机

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ docker run --name mysql5.7 -p 3306:3306 \
    --restart=always --privileged=true \
    -v /docker-data/mysql/data:/var/lib/mysql \
    -v /docker-data/mysql/conf.d:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

    # -v: 主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
    # --restart=always: 当Docker 重启时,容器会自动启动。
    # --privileged=true: 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
  5. 修改密码为空

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker exec -it mysql5.7 bash
    $ mysql -uroot -p
    # 不用输密码直接回车,进入mysql命令
    mysql> use mysql
    mysql> select user,authentication_string,host from user; # 查看账号、密码、可连接的host
    #修改密码
    mysql> update user set authentication_string='123456' where user='root'; #修改密码
    mysql> flush privileges; #刷新权限
    1
    2
    3
    > mysql> select user,authentication_string,host from user; # 查看账号、密码、可连接的host
    > root需要有两个host -- localhost、% 并且密码不为空,没有 % 的话无法外网访问
    > mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456'; # 没有的话进行新建
  6. 注释掉my.cnf中,文件中的skip-grant-tables,重启mysql服务

    1
    2
    3
    $ docker ps
    $ docker stop CONTAINER ID
    $ docker start CONTAINER ID
  7. 修改root密码

    1
    2
    3
    4
    mysql> use mysql
    mysql> alter user 'root'@'localhost' IDENTIFIED BY '123456';
    mysql> alter user 'root'@'%' IDENTIFIED BY '123456';
    mysql> flush privileges;

安装 mysql 8 版本

步骤与mysql 5.7的流程相似

  1. 拉取镜像

    1
    $ docker pull mysql:latest
  2. 新建需要挂载文件夹

    1
    $ mkdir -p /docker-data/mysql8/data /docker-data/mysql8/conf.d
  3. conf.d目录创建my.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $ vi /docker-data/mysql8/conf.d/my.cnf
    [mysqld]
    port = 3306
    # 设置mysql的安装目录
    #basedir=C:/dev/mysql-5.7.38
    # 设置mysql数据库的数据的存放目录(自动生成,不然可能报错)
    #datadir=C:/dev/mysql-5.7.38/data
    # 允许最大连接数
    max_connections=10000
    # 允许最大连接人数
    #max_user_connections=1000
    # 服务端使用的字符集默认为8比特编码的latin1字符集
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 连接时间
    wait_timeout=31536000
    interactive_timeout=31536000
    log_bin_trust_function_creators=1
    transaction_isolation=READ-COMMITTED
    sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
    lower_case_table_names=1
    group_concat_max_len=102400
    innodb_buffer_pool_size=500M
    [client]
    user=root
    port = 3306
    # 设置mysql客户端默认字符集
    default-character-set=utf8
  4. 运行并挂载在本机

    1
    2
    3
    4
    5
    $ docker run --name mysql8 -p 3306:3306 \
    --restart=always --privileged=true \
    -v /docker-data/mysql8/data:/var/lib/mysql \
    -v /docker-data/mysql8/conf.d:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
  5. 修改密码为空

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker exec -it mysql8 bash
    $ mysql -uroot -p
    # 不用输密码直接回车,进入mysql命令
    mysql> use mysql
    mysql> select user,authentication_string,host from user; # 查看账号、密码、可连接的host
    mysql> update user set authentication_string='' where user='root'; #修改密码
    mysql> flush privileges; #刷新权限

  6. 注释掉my.cnf中,文件中的skip-grant-tables,重启mysql服务

    1
    2
    3
    $ docker ps
    $ docker stop mysql8
    $ docker start mysql8
    1
    2
    3
    4
    > MYSQL 8.0内新增加`mysql_native_password`函数,通过更改这个函数密码来进行`远程连接`。
    > mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    > 没有 `root - %` 添加即可。
    > mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456';
  7. 修改root密码

    1
    2
    3
    4
    mysql> use mysql
    mysql> alter user 'root'@'localhost' IDENTIFIED BY '123456';
    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    mysql> flush privileges;

连接到mysql

  1. 进入docker本地连接mysql客户端

    1
    2
    3
    4
    5
    6
    7
    [sun@fulsun ~]$ docker exec -it mysql bash
    root@3363dbdeeb55:/# mysql -uroot -p12345

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql>

  2. 安装Navicat远程连接mysql

  3. 使用远程连接软件时,容器的3306端口和主机的3306端口映射到一起,所以我们应该访问:

    1
    2
    3
    4
    host: 127.0.0.1
    port: 3306
    user: root
    password: 123456

  4. 如果你的容器运行正常,但是无法访问到MySQL,一般有以下几个可能的原因:

    • Linux下可能是防火墙阻拦

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 开放端口:
      $ systemctl status firewalld
      $ firewall-cmd --zone=public --add-port=3306/tcp -permanent
      $ firewall-cmd --reload
      # 临时关闭防火墙:
      $ sudo systemctl stop firewalld
      # 关闭防火墙开机启动:
      $ sudo systemctl disable firewalld

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

      1
      2
      3
      4
      $ sudo docker exec -it mysql bash
      $ mysql -uroot -p123456
      mysql> grant all privileges on *.* to root@'%' identified by "password";

      原理:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      # mysql使用mysql数据库中的user表来管理权限,修改user表就可以修改权限(只有root账号可以修改)

      mysql> use mysql;
      Database changed

      mysql> select host,user,authentication_string from user;
      +-----------+---------------+-------------------------------------------+
      | host | user | authentication_string |
      +-----------+---------------+-------------------------------------------+
      | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
      | localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
      | localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
      | % | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
      +-----------+---------------+-------------------------------------------+
      4 rows in set (0.00 sec)

      # *.* 赋予全局层级权限
      mysql> grant all privileges on *.* to root@'%' identified by "password";
      Query OK, 0 rows affected (0.00 sec)

      mysql> flush privileges;
      Query OK, 0 rows affected (0.00 sec)


安装 redis

  1. 拉取官方的redis镜像指定版本

    1
    $ docker pull redis:5.0.5
  2. 新建文件夹用于redis外部挂载

    1
    $ mkdir -p /docker-data/redis/data  /docker-data/redis/conf
  3. 修改启动默认配置,官方 redis.conf 配置文件
    注意需要修改四个地方:

    1
    2
    3
    4
    5
    6
    sudo wget -P /docker-data/redis/conf http://download.redis.io/redis-stable/redis.conf
    # vim /docker-data/redis/conf/redis.conf
    bind 127.0.0.1 #注释掉这部分,用来限制redis只能本地访问
    protected-mode no #默认yes表示开启保护模式,用来限制redis只能本地访问
    appendonly yes #持久化
    requirepass password #密码
  4. 启动redis

    1
    2
    3
    4
    5
    $ docker run --name redis -d -p 6379:6379 \
    --restart=always --privileged=true \
    -v /docker-data/redis/conf/redis.conf:/etc/redis/redis.conf \
    -v /docker-data/redis/data:/data \
    redis redis-server /etc/redis/redis.conf
  5. 查看redis是否正常启动,如果没有问题就可以使用远程连接redis

    1
    2
    3
    4
    $ docker ps
    $ docker exec -it redis redis-cli
    # auth passoword
    # select index

安装Minio

  • 单机部署
    1
    2
    $ mkdir -p /docker-data/minio/data  /docker-data/minio/conf
    $ docker run -p 9000:9000 --name minio -v /docker-data/minio/data:/data -v /docker-data/minio/conf:/root/.minio minio/minio server /data
  • 存在问题: 浏览器无法访问minio控制台,因为没有对外暴露控制台端口,对外暴露minio控制台的端口,通过–console-address “:5000”指定控制台端口为静态端口:
    1
    docker run -p 9000:9000 -p 50000:50000 --name minio  -v /docker-data/minio/data:/data -v /docker-data/minio/conf:/root/.minio minio/minio server --console-address ":50000" /data
  • Minio自定义用户名密码:
    1
    2
    3
    4
    5
    6
    docker run -d -p 9000:9000 -p 50000:50000 --name minio \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=12345678" \
    -v /docker-data/minio/data:/data \
    -v /docker-data/minio/conf:/root/.minio \
    minio/minio server --console-address ":50000" /data

RabbitMQ

  • 拉取镜像:

    1
    docker pull rabbitmq:management
  • 启动rabbitMQ

    1
    docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
  • 复杂版(设置账户密码,hostname)

    1
    docker run -d -p 15672:15672  -p  5672:5672  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone  rabbitmq:management

Dokcer安装ELK

准备

首先安装 DockerDocker-Compose 相关的组件,我们这里直接使用准备好的 ELK 镜像,执行以下命令从 Dockerhub 上拉取指定版本的镜像,在本例当中我使用的是 7.40 版本。

1
docker pull sebp/elk:740

配置

为其编写 docker-compose.yaml 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Copyversion: "3.7"
services:
nginx:
image: nginx
container_name: nginx
ports:
- 80:80
- 443:443
networks:
- internal-network
volumes:
- /root/Volumes/Nginx/nginx.conf:/etc/nginx/nginx.conf
- /root/Volumes/Nginx/Configs:/etc/nginx/conf.d
restart: always
elk:
image: sebp/elk:740
container_name: elk
ports:
- 9200:9200
- 5044:5044
- 5601:5601
expose:
- 5601
networks:
- internal-network
volumes:
- /opt/elk-data:/var/lib/elasticsearch
- /etc/localtime:/etc/localtime
depends_on:
- nginx
ulimits:
nproc: 262144
nofile:
soft: 262144
hard: 262144
memlock: 9223372036854775807
restart: always

networks:
internal-network:
external: true

上面的 Yaml 文件内容大概意思就是开放 ELK 的 9200 与 5400 端口,然后使用 Nginx 代理 Kibana Dashboard,并且将相关的数据卷挂载了出来。

这里需要注意的是,我配置了 ulimits 节,这是因为 ELK 在启动的时候会检测相关内核参数,除了在 Yaml 编写还不够,还得变更宿主机的相关参数。关于这些参数的内容变更,请参考以下内容:

变更 /etc/security/limits.conf 文件,为其追加以下内容:

1
2
3
4
5
6
7
* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800

* soft memlock unlimited
* hard memlock unlimited

跳转到 /etc/security/limits.d 目录下,修改相应的 conf 文件,为其追加以下内容:

1
2
* soft nproc unlimited
* hard nproc unlimited

最后重启服务器,以上内容都是基于 CentOS 7.x 进行编写。

运行

安装好 docker-compose 工具以后,直接在 Yaml 文件的根目录运行 docker-compose up -d 即可。如果正常的话,访问对应的机器即可。

遇到的问题

Network internal-network declared as external

1
2
3
4
5
6
7
8
fl@fulsundeMacBook-Pro:~/Desktop$ docker-compose up
ERROR: Network internal-network declared as external, but could not be found. Please create the network manually using `docker network create internal-network` and try again.
fl@fulsundeMacBook-Pro:~/Desktop$ docker network ls
NETWORK ID NAME DRIVER SCOPE
babdd8df43cc bridge bridge local
991c54d95e61 host host local
c8e3bf25bb02 none null local

解决docker network create internal-network

1
2
3
4
5
6
7
8
fl@fulsundeMacBook-Pro:~/Desktop$ docker network create internal-network
a12e1441969e7fd1bb619fb1aaa3be3fdfb656dff99df6da8fd840d363b6074f
fl@fulsundeMacBook-Pro:~/Desktop$ docker network ls
NETWORK ID NAME DRIVER SCOPE
babdd8df43cc bridge bridge local
991c54d95e61 host host local
a12e1441969e internal-network bridge local
c8e3bf25bb02 none null local

挂载的时候出错

  1. Nginx

    • 问题如下

      1
      2
      3
      4
      5
      6
      7
      ERROR: for nginx  Cannot start service nginx:
      OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58:
      mounting \\\"/Volumes/data/docker/images/Nginx/nginx.conf\\\" to rootfs
      \\\"/var/lib/docker/overlay2/4330aaae9c62f8a8796bc1ea5df0d56b8e95e8a9137b5aa784e0ddcb4029d0ee/merged\\\" at \\\"/var/lib/docker/overlay2/4330aaae9c62f8a8796bc1ea5df0d56b8e95e8a9137b5aa784e0ddcb4029d0ee/merged/etc/nginx/nginx.conf\\\"
      caused \\\"not a directory\\\"\"": unknown:
      Are you trying to mount a directory onto a file (or vice-versa)?
      Check if the specified host path exists and is the expected type
    • 解决

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      fl@fulsundeMacBook-Pro:~/Desktop$ docker rm $(docker ps -a -q) -f

      fl@fulsundeMacBook-Pro:~/Desktop$ docker run -d -p 80:80 --name nginx nginx
      bcd59b19f418087a465aeb77b2bffcd8a6e30a25fe852f7f4d286614ca525073
      fl@fulsundeMacBook-Pro:~/Desktop$ docker exec -it nginx /bin/bash
      root@bcd59b19f418:/# exit
      exit
      fl@fulsundeMacBook-Pro:~/Desktop$ docker ps
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      bcd59b19f418 nginx "nginx -g 'daemon of…" 33 seconds ago Up 32 seconds 0.0.0.0:80->80/tcp nginx
      fl@fulsundeMacBook-Pro:~/Desktop$ docker cp bcd59b19f418:/etc/nginx/nginx.conf /Volumes/data/docker/images/Nginx/nginx.conf
  2. ELK

    • 问题如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      fl@fulsundeMacBook-Pro:~/Desktop$ docker-compose up
      Creating nginx ... done
      Creating elk ... error

      ERROR: for elk Cannot start service elk: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58:
      mounting \\\"/Volumes/data/docker/images/elk/localtime\\\" to rootfs \\\"/var/lib/docker/overlay2/94630dea70be2522ffd5d0ee80ba550f7f86df9bf141378558697b3405b5416e/merged\\\" at
      \\\"/var/lib/docker/overlay2/94630dea70be2522ffd5d0ee80ba550f7f86df9bf141378558697b3405b5416e/merged/usr/share/zoneinfo/UCT\\\"
      caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)?
      Check if the specified host path exists and is the expected type

    • 解决

      1
      fl@fulsundeMacBook-Pro:~$ cp /etc/localtime /Volumes/data/docker/images/elk/