docker安装启动redis、nginx、mysql8和mysql5等的配置
虽然安装这些服务没什么技术含量,但对于新手来说很容易在细节上出一些问题,这篇文章中的命令都是通过个人实践可行的,记录下来再下次使用时就不至于在小问题上浪费半天时间。
docker安装启动redis
1、拉取redis镜像
docker pull redis
这样拉下来是最新的redis 如果想要特定的版本可在redis后加上版本号
docker pull redis:[版本号]
#例
docker pull redis:6.2.3
如果想要知道redis有哪些版本号可以直接去docker hub上找
https://hub.docker.com/_/redis?tab=tags
镜像拉下后可以用 docker images 查看
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0 c2c45d506085 6 weeks ago 133MB
redis 6.0.10 eb0ab2d55fdf 3 months ago 104MB
mysql 8.0.22 d4c3cafb11d5 4 months ago 545MB
2、docker启动redis
docker 启动redis有两种启动方式 一种是直接启动,一种是用配置文件启动
2.1直接启动
docker run -p 6379:6379 \
--network smpe-net --network-alias redis-net \
-v /root/redis/data:/data \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
--name redis -d redis \
redis-server /etc/redis/redis.conf --appendonly yes
参数说明:
-d表示后台运行redis,不至于shutdown就直接退出redis进程了
–name 可以随意取名,就是你开启的这个docker容器的名字,但不能与其他docker容器重名
-p 6379:6379 暴露端口,做一个端口映射,映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
–network [网络名] 将docker容器加入到自定义的网桥中
2.2 通过外部配置文件redis.conf启动redis
安装redis的时候可以用配置文件来启动,也可以不用。但用配置文件启动可以更好的更改,持久化储存配置。
因为docker安装的redis默认是没有配置文件的,我们需从redis官网下一个。版本用稳定版的
redis中文官方网站:http://www.redis.cn/download.html
官网下的很慢 可以用
https://codechina.csdn.net/mirrors/redis/redis
这个是redis github仓库的镜像仓库,可以直接下载里面的redis.conf
下载好后解压会有一个redis.conf 这个就是官方的redis配置文件
也可以使用wget直接下载到linux上
$ wget http://download.redis.io/releases/redis-6.0.6.tar.gz
$ tar xzf redis-6.0.6.tar.gz
$ cd redis-6.0.6
$ make
下载好后我们需要修改一些配置(可根据需求自己修改)
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no#默认no,意为是否以守护进程方式启动,可后台运行,不要改为yes 否则可能redis会启动失败
appendonly yes #redis持久化(可选)
requirepass 123456 设置redis密码。
然后我们将redis配置文件上传到linux服务器上。
使用xftp或者rz命令,这里就不再赘述
创建目录
mkdir -p /root/redis/conf
把redis配置文件放到/root/redis/conf下
[root@VM-12-14-centos conf]# pwd
/root/redis/conf
[root@VM-12-14-centos conf]# ls
redis.conf
接下来用配置文件启动redis
docker run -p 6379:6379 --name myredis -v /root/redis/conf/redis.conf:/etc/redis/redis.conf -v /root/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
参数解释:
之前解释过的就不再解释了
-v /root/redis/conf/redis.conf:/etc/redis/redis.conf: 将宿主机的redis.conf 挂载到 docker内的redis.conf
redis-server /usr/local/etc/redis/redis.conf:以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的录/root/redis/conf/redis.conf
docker 安装启动mysql5.7和mysql8
mysql5和mysql8的配置稍微有些不一样,一不小心就会弄错,所以这里这两个都写
之前用过的命令就不再介绍了
1、拉取mysql镜像
docker pull mysql:8
docker pull mysql:5.7
2、 运行mysql容器
2.1 运行mysql5.7
先创建挂载目录
mkdir -p /root/mysql5.7/conf
mkdir -p /root/mysql5.7/data
mkdir -p /root/mysql5.7/logs
docker run -it \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=<your password> \
-v /root/mysql5.7/conf:/etc/mysql/conf.d \
-v /root/mysql5.7/data:/var/lib/mysql \
-v /root/mysql5.7/logs:/var/log/mysql \
-d --restart=always mysql:5.7
2.2 运行mysql8
mkdir -p /root/mysql8/conf
mkdir -p /root/mysql8/data
mkdir -p /root/mysql8/logs
# /etc/localtime:/etc/localtime:ro是将主机的时间与容器中的时间同步一致
# --lower-case-table-names=1关闭mysql8的大小写敏感
# 设置字符集为utf8mb4
docker run -p 3306:3306 --name mysql8 --restart always \
-v /usr/local/mysql8/conf.d:/etc/mysql/conf.d \
-v /usr/local/mysql8/logs:/var/log \
-v /usr/local/mysql8/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=<your password> -d mysql:8 --lower-case-table-names=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
更改加密规则
mysql8需要更改下加密规则
如果不改的话老版本的navicat是连接不上远程mysql数据库的
出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password
进入容器
docker exec -it mysql8 bash
输入账户密码
mysql -uroot -p[你的密码]
例
mysql -uroot -p123456
# 修改数据库
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
# 重新修改密码
alter user 'root'@'%' identified by '123456';
#刷新数据库
mysql> flush privileges;
docker安装nginx
1.拉取nginx镜像
docker pull nginx
2. 运行nginx容器
2.1在宿主机创建要挂载的目录
mkdir -p /root/nginx/conf
mkdir -p /root/nginx/logs
挂载这里有一个需要注意的点,如果宿主机不存在的文件是不允许挂载到容器内已存在的文件的。
还有一点就是宿主机的文件是会完全覆盖容器内原有的文件。
所以我们先获得一个nginx.conf
我这里的方式是先不挂载启动一个nginx服务器,然后将里面的nginx配置cp一份出来
2.2 按之前的方式端口映射启动nginx
docker run -p 88:80 --name nginx -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx -d nginx
像这样正常安装nginx,宿主机和容器映射端口,指定目录挂载文件,在后续会带来很多的问题,存在很多的缺点:
- 运行容器时就已经确定映射端口,但之后项目反向代理的端口确是不确定的,这样就不能反向代理其他端口
- 宿主机与容器的挂载目录定死,在宿主机中基本只能操作/etc/nginx/nginx.conf,如果项目很多很多的话,那么这个文件当中,将会有大量的Server配置,不方便项目管理。
所以可以采用容器共享宿主机端口,只挂载一个目录,以后再容器中建立软连接,让宿主机可以操作或者共享容器文件(类似于win10的桌面快捷方式思想),具有动态性。
共享宿主机端口,动态映射式运行nginx容器
运行容器命令
docker run -it --name nginx --net host -v /root/project:/var/www/html -v /root/nginx:/nginx_conf -d nginx
命令详解:
-d后台运行
–name容器名
-v宿主机目录与容器目录进行挂载(可以共享)
-v /root/project:/var/www/html是将宿主机/root/project与容器/var/www/html关联,以后所有的项目都建立在/root/project下,因为关联在/var/www/html,所以容器可以访问到外部的项目,方便在nginx.conf反向代理到项目(一般如果是前端项目就可代理到:/var/www/html/项目名/index.html)
-v /root/nginx:/nginx_conf是/root/nginx放置所有的配置文件,可以在nginx容器根目录下的/nginx_conf共享
在解释为什么这么配置前我们先了解一些东西。
nginx在启动时默认使用配置文件是 /etc/nginx/nginx.conf
我们先看下默认的nginx.conf写的是什么
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
最后一行我们可以看到include /etc/nginx/conf.d/*.conf;
这句话的含义是引用 /etc/nginx/conf.d/ 下的所有conf文件。而这个目录下有一个默认的defalut.conf文件
我们看下这个文件写得是什么
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
可以看到这个就是nginx需要代理的server的配置,所以我们在部署项目时,就可以把每个项目的nginx配置文件都放到这个目录下。更好的管理conf。
现在再回到我们之前的命令,我们把 宿主机的 /root/nginx 目录 与容器内的 /nginx_conf 目录挂载在一起,但我们需要操作的其实是 /root/nginx/conf.d 下的配置文件。 怎样让宿主机能够访问conf.d目录呢
我们可能想到用软连接将conf.d连接到/root/nginx目录下,,,但这样做其实是错误的。
我们在宿主机访问conf.d文件夹会发现我们打不开。这是因为软连接其实储存的是链接文件夹/文件所在的目录,就相当于快捷方式,在宿主机上我们当然访问不到。
我们可以采用曲线救国,将 /etc/nginx/conf.d 移动到 /nginx_conf ,在 /nginx_conf/conf.d 建立与 /etc/nginx 的软连接,这样宿主机挂载的是就是真实的文件,而在容器内软连接又可以访问到conf.d文件。这样就没问题了。
代码:
mv /etc/nginx/conf.d /nginx_conf
ln -s /nginx_conf/conf.d /etc/nginx
我们还可以把nginx.conf也移动到nginx_conf下,同样建立 /nginx_conf/nginx.conf 与 /etc/nginx/ 的软连接。
mv /etc/nginx/nginx.conf /nginx_conf
ln -s /nginx_conf/nginx.conf /etc/nginx
这样做还有一个好处,如果在未来我们还需要宿主机挂载容器内的其他文件,我们可以不重新开容器。只需要将我们想要挂载的文件或文件夹移动到nginx_conf下,然后再建立对应的软连接即可。
总结
我们再总结下我们做的操作
1. 拉取nginx镜像
docker pull nginx
2. 运行容器
docker run nginx --net host -v /root/nginx:/nginx_conf -v /root/project:/var/www/html --name nginx -d nginx
3. 进入容器 移动conf.d nginx.conf并创建软连接
docker exec -it nginx bash
# 建立/nginx_conf/conf.d 与 /etc/nginx的软连接
mv /etc/nginx/conf.d /nginx_conf
ln -s /nginx_conf/conf.d /etc/nginx
# 建立/etc/nginx/nginx.conf与/nginx_conf的软连接
mv /etc/nginx/nginx.conf /nginx_conf
ln -s /nginx_conf/nginx.conf /etc/nginx
重启nginx
执行nginx -t命令,测试配置文件是否有问题
下图这样,说明没有问题:
如果配置文件问题(尤其是conf.d下的文件),会在这里显示异常
执行nginx -s reload重启nginx服务
成功如下图
如果遇到线程问题,启动失败,可参看:docker 中使用nginx容器无法正常启动,报错signal process started和kili(3255,1) failed (3: No such process)