前言:
docker目前已经在实际的生产活动中应用非常广泛了,但在生产方面,我们使用docker需要考虑的地方就需要比测试更多了,比如,时区问题,CPU亲和度问题,服务依赖关系问题,网络配置和管理问题,数据持久化问题,日志管理问题。
以上问题产生的根本原因是由于docker自身的架构和设计所产生的。
比如,时区问题,是由于我们使用的镜像基本都是由国外的docker官方网站所制作的,当然了,基础镜像也就会使用国外的时区啦,而我们要在本地使用,需要进行适当的本地化改造,将时区统一到东八区啦。
CPU亲和度问题和内存限制问题,是由于docker设计的时候就是可以无限抢占宿主机资源,如果容器内的服务疯狂抢占宿主机资源,将会导致宿主机出现一系列问题。
如果生产中使用docker部署项目,或者某个集群,那么,一般是有启动的先后顺序,也就是容器的启动先后顺序是有规定的,比如,WordPress这种项目就必须先启动数据库,在启动WordPress服务,由此,我们势必需要根据各个服务的依赖关系编排docker容器。
并且docker设计之初对于网络的配置和管理是十分弱的,并定义了容器之间默认是相互隔离的,因此,我们需要对原有的默认的网络根据自己的需求进行改造。
服务并不是一成不变的,我们也有升级服务的需求,改变服务的需求,这些需要docker的持久化支持,也就是volume数据外接挂载。
docker默认是不会对日志做任何限制的,因此,我们需要对日志的大小做一定的限制,防止日志过大撑爆宿主机。
实验目的:
贴近实战,使用一个MySQL的docker镜像,通过docker-compose对其进行编排,关于时区问题,数据持久化问题,日志问题详细介绍。
实验环境:
vm虚拟机,虚拟机配置如下:
8G内存,8CPU,硬盘大小为100G。操作系统为centos7.7.1908
实验步骤:
一,docker环境搭建
docker环境搭建没什么好说的,请看我的博客:docker的离线安装以及本地化配置_zsk_john的博客-CSDN博客
docker的版本是:
[root@hdp-1 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.5
API version: 1.41
Go version: go1.13.15
Git commit: 55c4c88
Built: Tue Mar 2 20:14:11 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.5
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 363e9a8
Built: Tue Mar 2 20:18:31 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.4.3
GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker-compose的版本是:
[root@hdp-1 ~]# docker-compose -verison
docker-compose version 1.25.1, build a82fef07
二,MySQL的镜像文件
链接:https://pan.baidu.com/s/1xWhp4r7Sy4UgLk0ep45k7w
提取码:mysq
MySQL的版本为5.7.22
三,镜像文件导入docker环境内
将上述镜像文件放入虚拟机内,执行以下命令:
docker load < mysql-Docker.tar
cdb3f9544e4c: Loading layer [==================================================>] 58.44MB/58.44MB
6f8d38b0e2b6: Loading layer [==================================================>] 338.4kB/338.4kB
aae63f31dee9: Loading layer [==================================================>] 10.43MB/10.43MB
4801a487d51a: Loading layer [==================================================>] 4.471MB/4.471MB
c0c26734fb83: Loading layer [==================================================>] 1.536kB/1.536kB
94f8d8f5acbf: Loading layer [==================================================>] 46.11MB/46.11MB
8aeebb3964c1: Loading layer [==================================================>] 28.16kB/28.16kB
22b402e93939: Loading layer [==================================================>] 3.584kB/3.584kB
489bddb9c55e: Loading layer [==================================================>] 257.2MB/257.2MB
f8cb294d5d80: Loading layer [==================================================>] 9.728kB/9.728kB
a968f24d4187: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image: mysql:5.7.22
执行查看镜像命令,应该有如下输出:
[root@hdp-1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.22 6bb891430fb6 3 years ago 372MB
四,编写docker-compose 的编排文件,文件可放在任意位置,文件名也任意,但后缀必须是yaml或者yml。文件内容如下(本文定义文件名为MySQL.yaml):
version: '3'
services:
mysql:
container_name: mysql-5.7.22
image: mysql:5.7.22
restart: always
environment:
MYSQL_USER: admin
MYSQL_PASSWORD: admins
MYSQL_DATABASE: database
MYSQL_ROOT_PASSWORD: admin
TZ: Asia/Shanghai
volumes:
- /usr/local/mysql/data:/var/lib/mysql
ports:
- 3306:3306
network_mode: host
那么,这个yaml文件里写的都是什么意思呢?
(1)version这里申明docker服务的大体版本,我使用的版本是docker-ce-20.10.5版本,因此,这里version的值至少应该是3,取值范围是3到3.7,如果修改成3.8,那么结果是这样的:
[root@hdp-1 ~]# docker-compose -f mysql.yaml stop mysql
ERROR: Version in "./mysql.yaml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
(2) container_name
此行定义容器的名称,写在这个文件里的好处显而易见,便于管理。容器的各类操作都和名称是密切相关的。
(3)environment 容器的环境变量
这里就有点意思了,首先,有一个问题 ,这里定义了一个MySQL用户,和该用户的密码,以及该用户的数据库名称,那么,可否定义多个用户,多个数据库名称呢?
经我测试,答案是可以有多个定义,以MYSQL_USER,MYSQL_PASSWORD,MYSQL_PASSWORD三个标签为一组,可定义多组。当然,MYSQL_ROOT_PASSWORD是定义root密码的,这个只能定义一个。
例如:
version: '3.7'
services:
mysql:
container_name: mysql-5.7.22
image: mysql:5.7.22
restart: always
environment:
MYSQL_USER: admin
MYSQL_PASSWORD: admins
MYSQL_DATABASE: database
MYSQL_USER: zsk
MYSQL_PASSWORD: zsk1
MYSQL_DATABASE: zsk
MYSQL_ROOT_PASSWORD: admins
MYSQL_ROOT_PASSWORD: admins123
TZ: Asia/Shanghai
volumes:
- /usr/local/mysql/data:/var/lib/mysql
ports:
- 3306:3306
network_mode: host
此时,进入容器内,登录MySQL,两个root密码只有最后一个密码可登录。
[root@hdp-1 ~]# docker exec -it 1e292 /bin/bash
root@hdp-1:/# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uroot -padmins123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uroot -padmins
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uroot -padmins
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uroot -padmins123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uzsk -pzsk1
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'zsk'@'localhost' (using password: YES)
root@hdp-1:/# mysql -uzsk -p
Enter password:
ERROR 1045 (28000): Access denied for user 'zsk'@'localhost' (using password: YES)
因此,docker下的MySQL容器,使用docker-compose编排,一般最多只能定义两个用户,一个普通用户和它的密码,一个root用户和root用户的密码。
docker-compose编排文件内的变量定义有两种方式,一种是变量定义方式(=号赋值),一种是键值对方式,比如以下示例,两种定义变量都可以,但不可混用:
environment:
- "MYSQL_USER=huiqing"
- "MYSQL_PASSWORD=Huiqing^*^O3799"
- "MYSQL_DATABASE=database"
- "MYSQL_ROOT_PASSWORD=R349_&^#@e]"
- "TZ=Asia/Shanghai"
environment:
MYSQL_USER: admin
MYSQL_PASSWORD: admins
MYSQL_DATABASE: database
MYSQL_USER: zsk
MYSQL_ROOT_PASSWORD: admins
TZ: Asia/Shanghai
有两个地方需要特别注意,MySQL容器可以不使用配置文件,如果没有特殊的需求,想定制MySQL数据库的话,另一个是容器启动后是默认开启3306的端口,因此,在编排文件内,一定要注意,宿主机所开端口可以根据自己需求随意定义一个没有被占用过的端口,容器端口写3306,这里是固定不变的哦。也就是如下所示,:
ports:
- 42706:3306
综合以上介绍,那么,一个合格的,可用于生产环境的docker-compose 编排MySQL服务应该是具有以下这样的示例的所有元素:
version: '3'
services:
mysql:
container_name: mysql
image: mysql:5.7.22
restart: always
logging:
driver: "json-file"
options:
max-size: "1g"
environment:
- "MYSQL_USER=huiqing"
- "MYSQL_PASSWORD=Huiqing^*^O3799"
- "MYSQL_ROOT_PASSWORD=R349_&^#@e]"
- "TZ=Asia/Shanghai"
volumes:
- /data/soft/software/mysql/data:/var/lib/mysql
- /data/soft/software/mysql/conf/:/etc/mysql/conf.d
- /data/soft/software/mysql/source:/docker-entrypoint-initdb.d
ports:
- 42706:3306