docker安装启动redis、nginx、mysql8详解

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)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值