Docker常用软件安装
安装 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.ymlyaml文件
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
30version : '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
docker pull mysql:5.7
新建需要
挂载
文件夹1
2mkdir -p /docker-data/mysql/data
mkdir -p /docker-data/mysql/conf.d在
conf.d
目录创建my.cnf1
2
3
4
5
6vi /docker-data/mysql/conf.d/my.cnf
[mysqld]
skip-grant-tables作为启动参数的作用: MYSQL服务器不加载权限判断,任何用户都能访问数据库。
skip-grant-tables
设置北京时区
default-time_zone = '+8:00'运行并挂载在本机
1
2
3
4
5
6
7
8
9docker 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只是外部普通用户权限修改密码为空
1
2
3
4
5
6
7
8docker exec -it mysql5.7 bash
mysql -uroot -p
不用输密码直接回车,进入mysql命令
use mysql
select user,authentication_string,host from user; # 查看账号、密码、可连接的host
修改密码
update user set authentication_string='123456' where user='root'; #修改密码
flush privileges; #刷新权限1
2
3mysql> select user,authentication_string,host from user; # 查看账号、密码、可连接的host
root需要有两个host -- localhost、% 并且密码不为空,没有 % 的话无法外网访问
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456'; # 没有的话进行新建注释掉
my.cnf
中,文件中的skip-grant-tables
,重启mysql
服务1
2
3docker ps
docker stop CONTAINER ID
docker start CONTAINER ID修改root密码
1
2
3
4use mysql
alter user 'root'@'localhost' IDENTIFIED BY '123456';
alter user 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
安装 mysql 8 版本
步骤与mysql 5.7的流程相似
拉取镜像
1
docker pull mysql:latest
新建需要
挂载
文件夹1
mkdir -p /docker-data/mysql8/data /docker-data/mysql8/conf.d
在
conf.d
目录创建my.cnf1
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
29vi /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运行并挂载在本机
1
2
3
4
5docker 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修改密码为空
1
2
3
4
5
6
7
8docker exec -it mysql8 bash
mysql -uroot -p
不用输密码直接回车,进入mysql命令
use mysql
select user,authentication_string,host from user; # 查看账号、密码、可连接的host
update user set authentication_string='' where user='root'; #修改密码
flush privileges; #刷新权限注释掉
my.cnf
中,文件中的skip-grant-tables
,重启mysql
服务1
2
3docker ps
docker stop mysql8
docker start mysql81
2
3
4MYSQL 8.0内新增加`mysql_native_password`函数,通过更改这个函数密码来进行`远程连接`。
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
没有 `root - %` 添加即可。
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456';修改root密码
1
2
3
4use mysql
alter user 'root'@'localhost' IDENTIFIED BY '123456';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
连接到mysql
进入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.安装Navicat远程连接mysql
使用远程连接软件时,容器的3306端口和主机的3306端口映射到一起,所以我们应该访问:
1
2
3
4host: 127.0.0.1
port: 3306
user: root
password: 123456如果你的容器运行正常,但是无法访问到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
4sudo docker exec -it mysql bash
mysql -uroot -p123456
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
24mysql使用mysql数据库中的user表来管理权限,修改user表就可以修改权限(只有root账号可以修改)
use mysql;
Database changed
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)
*.* 赋予全局层级权限
grant all privileges on *.* to root@'%' identified by "password";
Query OK, 0 rows affected (0.00 sec)
flush privileges;
Query OK, 0 rows affected (0.00 sec)
安装 redis
拉取官方的redis镜像指定版本
1
$ docker pull redis:5.0.5
新建文件夹用于
redis
外部挂载1
$ mkdir -p /docker-data/redis/data /docker-data/redis/conf
修改启动默认配置,官方 redis.conf 配置文件
注意需要修改四个地方:
1
2
3
4
5
6sudo 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 #密码启动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查看redis是否正常启动,如果没有问题就可以使用
远程
连接redis1
2
3
4docker 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
6docker 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
准备
首先安装 Docker 与 Docker-Compose 相关的组件,我们这里直接使用准备好的 ELK 镜像,执行以下命令从 Dockerhub 上拉取指定版本的镜像,在本例当中我使用的是 7.40 版本。
1 | docker pull sebp/elk:740 |
配置
为其编写 docker-compose.yaml
文件,内容如下:
1 | Copyversion: "3.7" |
上面的 Yaml 文件内容大概意思就是开放 ELK 的 9200 与 5400 端口,然后使用 Nginx 代理 Kibana Dashboard,并且将相关的数据卷挂载了出来。
这里需要注意的是,我配置了 ulimits
节,这是因为 ELK 在启动的时候会检测相关内核参数,除了在 Yaml 编写还不够,还得变更宿主机的相关参数。关于这些参数的内容变更,请参考以下内容:
变更 /etc/security/limits.conf
文件,为其追加以下内容:
1 | * soft nofile 204800 |
跳转到 /etc/security/limits.d
目录下,修改相应的 conf
文件,为其追加以下内容:
1 | * soft nproc unlimited |
最后重启服务器,以上内容都是基于 CentOS 7.x 进行编写。
运行
安装好 docker-compose 工具以后,直接在 Yaml 文件的根目录运行 docker-compose up -d
即可。如果正常的话,访问对应的机器即可。
遇到的问题
Network internal-network declared as external
1 | fl@fulsundeMacBook-Pro:~/Desktop$ docker-compose up |
解决
docker network create internal-network
1 | fl@fulsundeMacBook-Pro:~/Desktop$ docker network create internal-network |
挂载的时候出错
Nginx
问题如下
1
2
3
4
5
6
7ERROR: 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
11fl@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
ELK
问题如下
1
2
3
4
5
6
7
8
9
10fl@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/