Docker(四)创建centos、mysql、nacos、redis容器及理解

目录

零:准备

一:创建centos容器

1.1:命令

1.2:说明

二:创建mysql容器

2.1:命令

2.2:说明

 2.3:问题及感想

三:创建nacos容器

3.1:命令

3.2:说明

3.3:问题

四:创建redis容器

4.0:说在前面

4.1:命令

4.2:配套命令

五:心得

5.1:redis


零:准备

        提前下载了nacos 2.0.4、mysql 5.7、centos 7 这几个版本的镜像。这些镜像会在下面创建容器时用到。下载方法和地址,以及一些常用参数请见我上一篇帖子 Docker(一) 简介与基础操作

         此外,下面的几个容器的创建过程中,都会先给出创建命令,然后加以说明,最后附上我遇到的一些问题和理解。

Docker(四)创建centos、mysql、nacos、redis容器及理解_第1张图片

一:创建centos容器

1.1:命令

[root@docker01 conf]# docker run -id \
/** 容器名称 **/
--name=CentosVolumn02 \
/**  随手写的两个数据卷路径,因为与容器中的任何系统文件系统的路径都没有交集,因此不会对容器产生影响
  mysql的创建容器的命令中,我会举例如何对容器内容产生影响 **/
-v /data/CentosVolumn02:/docker_data/docker_CentosVolumn02 \
-v /data/CentosVolumn03:/docker_data/docker_CentosVolumn03 \
/** 使用到的镜像名称和版本号 **/
centos:7

1.2:说明

        一般我们不太会单纯创建一个centos的容器来使用,大部分是将这样的容器作为其他软件的载体出现。比如在这样的centos容器中调用宿主机的jdk后,部署springboot工程,进而做成微服务提供者来使用。所以这里仅演示centos容器的简单安装。

二:创建mysql容器

2.1:命令

[root@docker01 MySql571]#  docker run -id \
/** 将mysql容器3306端口映射为宿主机的13306 **/
-p 13306:3306 \
/** 为容器起名 **/
--name=MySql57 \
/** 参数 $PWD 即当前路径的意思。如果想使用这个参数,首先用cd命令进入到一个理想的目录后,再执行。
    下面三行是为mysql的 conf.d logs  **/
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
/** 设置mysql登录密码 **/
-e MYSQL_ROOT_PASSWORD=xxxx \
mysql:5.7

2.2:说明

        MySQL的一些重要文件所属的路径可以放在数据卷中。我这里只放了如上图命令中的那三个路径到数据卷中。MySQL其他的重要配置文件和路径的位置,可以参考下面的两段内容来确认。

/** 记录 mysql 重要的配置文件的配置文件路径 **/
/etc/mysql/mysql.cnf

/** 其内容如下 **/
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
/** mysqld 的相关配置信息文件其路径如下所示 **/
/etc/mysql/mysql.conf.d/mysqld.cnf

/** 其内容如下
    记录进程id的文件路径 **/
pid-file        = /var/run/mysqld/mysqld.pid
/** 客户端与MySQL服务端连接的socket通道。当MySQL守护进程启动之后创建此文件。 **/
socket          = /var/run/mysqld/mysqld.sock
/** MySQL数据文件存放路径 **/
datadir         = /var/lib/mysql
/** 日志存放路径 **/
log-error      = /var/log/mysql/error.log
/** 允许访问本数据库的ip地址。多个地址间用空格分割。如果注释掉本条,则允许所有地址访问 **/
bind-address   = 127.0.0.1
symbolic-links=0

 2.3:问题及感想

        一般来说,我认为数据库没必要使用docker来创建。原因有以下几方面
       

    1:容器层面

    docker对宿主机的资源隔离方面做的不如虚拟机。docker只能限制资源消耗的最大值,而不能限制容器间资源的争抢。即使宿主机上安装的是同版本同类型的数据库,那些拥有热点数据的数据库也会占用其他数据库的资源而导致其他数据库的性能下降,进而影响系统性能。

    2:数据安全层面
    
    受制于docker容器的存储机制,我们需要使用数据卷,将容器运行时产生的数据留痕。但数据卷本身缺乏良好的保护措施,可能会被其他误操作而导致数据丢失或其他安全问题。

三:创建nacos容器

3.1:命令

        下面的命令我是换行写的。注意换行的时候要加上 “\” 这个符号。

[root@docker01 conf]# docker run -id \
/** 将容器中的8848映射到宿主机的18848端口上 **/
-p 18848:8848 \
/** nacos启动模式,单机模式。 **/
--env MODE=standalone \
/** 为docker容器起的名字 **/
--name=nacos204 \
/** nacos使用 mysql数据库存储配置信息 **/
--env SPRING_DATASOURCE_PLATFORM=mysql \
/** mysql数据库的地址。如果数据库和nacos在同一个宿主机上,可以使用127.0.0.1 **/
--env MYSQL_SERVICE_HOST=192.168.122.3 \
/** mysql的端口 **/
--env MYSQL_SERVICE_PORT=13306 \
/** mysql数据库名称 **/
--env MYSQL_SERVICE_DB_NAME=nacos_config \
/** mysql登录账号 **/
--env MYSQL_SERVICE_USER=root \
/** mysql登录密码 **/
--env MYSQL_SERVICE_PASSWORD=xxxx \
/** nacos日志文件数据卷 **/
-v /data/Nacos/204/8848/logs:/home/nacos/logs  \
/** nacosdata路径数据卷 **/
-v /data/Nacos/204/8848/data:/home/nacos/data  \
/** 使用的nacos的容器名称和版本号 **/
nacos/nacos-server:v2.0.4-slim

3.2:说明

        下面的内容出自于nacos的容器的/home/nacos/conf 路径下的 application.properties文件。对比上面的命令和下面的文件,能方便理解上面命令中的env参数的取值来源。如下面文件中以   “${}”括起来的内容所示。因此,如果我们需要自己指定一些其他参数,可以模仿着写在创建容器命令的环境变量中即可。

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}


### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}

### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

3.3:问题

        务必要保证宿主机的selinux先行关闭(前提是在实验环境)否则端口在访问时会有很多问题

四:创建redis容器

4.0:说在前面

        因为使用docker方式安装的redis是没有配置文件的,要想用个性化的配置文件来使用redis,因此需要先从 redis官网下载链接 下载后,在创建docker容器时显式指定,以实现目的。

        redis官网有很多版本,所以选择的原则就与你要使用的docker中的redis的版本有关。比如我在  docker官网上找到的镜像  是 6.0.6,那么也尽量在redis官网上找对应版本来使用。如下两图

Docker(四)创建centos、mysql、nacos、redis容器及理解_第2张图片

Docker(四)创建centos、mysql、nacos、redis容器及理解_第3张图片

         然后从下载的redis包中找到redis.conf配置文件,传到redis容器将要使用的数据卷中以备使用即可。

4.1:命令

[root@docker01 conf]# docker run \
/** 开启虚机和docker后自动启动 **/
--restart=always \
/** log-opt 即设置日志配置项。这里分别使用了设置日志最大大小和日志数量 这两个配置项 **/
--log-opt max-size=100m \
--log-opt max-file=2 \
/** 将redis容器中的6379端口映射到宿主机的16379端口上 **/
-p 16379:6379 \
/** redis容器名称 **/
--name=RedisWithPswd \
/** -v 命令是在宿主机上创建redis映射路径,以便挂载数据卷。
    进入到宿主机的这一映射路径后,就可以使用 $PWD 变量,来代表执行当前命令时所处宿主机目录。
    这里指定了配置文件和数据文件的路径
**/
-v $PWD/conf/redis.conf:/etc/redis/conf/redis.conf \
-v $PWD/data:/data \
/** 使用的redis的容器名称和版本号 **/
-d redis:6.0.6 \
/** 使用的redis容器中这一路径下的配置文件来启动redis **/
redis-server \
/etc/redis/conf/redis.conf \
/** 打开redis持久化 **/
--appendonly yes \
/** 使用的nacos的容器名称和版本号 **/
--requirepass xxxx_1234

为了方便使用,下面给出一个精简版的可执行命令样例

docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=2 \
-p 16379:6379 \
--name=RedisWithPswd \
-v $PWD/conf/redis.conf:/etc/redis/conf/redis.conf \
-v $PWD/data:/data \
-d redis:6.0.6 \
redis-server \
/etc/redis/conf/redis.conf \
--appendonly yes \
--requirepass xxxx_1234

如果使用了自定义的配置文件启动,且配置文件中指定了密码、持久化方式等内容,那么上述创建命令其实还可以进一步的省略。 如下所示

docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=2 \
-p 16379:6379 \
--name=RedisWithPswd \
-d redis:6.0.6 \
redis-server \
/etc/redis/conf/redis.conf \

4.2:配套命令

        因为上面的命令中设置了redis的密码(xxxx_1234)且尚未授权,此时我们无法用redis可是界面登录redis。首先让我们在redis服务端对对这个新密码进行授权。

Docker(四)创建centos、mysql、nacos、redis容器及理解_第4张图片

         授权之后就可以使用诸如 “Another Redis Desktop Manager”这样的工具,做好相关的ip和端口、登录密码等信息后登录了。

Docker(四)创建centos、mysql、nacos、redis容器及理解_第5张图片

五:心得

5.1:redis

        若你要使用自定义的redis.conf配置文件启动,那么在定义数据卷路径的时候,应该精确到配置文件名称,而不能仅仅到配置文件所属路径级别。那样在后面启动时会一直提示你“容器正在重启中”。这点需要注意。

你可能感兴趣的:(docker)