以下是一个mysql的nomad job文件mysql.nomad,在此文件路径执行nomad run mysql.nomad文件名,即可
job "MySQL:5.7"{ //jobID
datacenters=[
"default"
]
type="service"
namespace="Mars-dev"
constraint{
attribute="${meta.app_id}"
value="2"
}
constraint{
attribute="${meta.env}"
value="dev"
}
meta{
_time="0"
}
update{
max_parallel=1
min_healthy_time="10s"
healthy_deadline="3m"
auto_revert=true
canary=0
}
group "MySQL"{
count=1
restart{
attempts=10
interval="5m"
delay="25s"
mode="delay"
}
ephemeral_disk{
migrate = true
size=300
sticky = true
}
task "mars-dev"{
driver="docker"
env{
MYSQL_ROOT_PASSWORD="123456" //必须设置,管理员用户root的密码
}
config{
image="hub.skyinno.com/google_containers/mysql:5.7.20"
force_pull=true
port_map{
db = 3306
}
volumes = [
"docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/",
]
}
template {
data = <<EOH
CREATE DATABASE dbwebappdb;
CREATE USER 'dbwebapp'@'%' IDENTIFIED BY 'dbwebapp';
GRANT ALL PRIVILEGES ON dbwebappdb.* TO 'dbwebapp'@'%';
EOH
destination = "/docker-entrypoint-initdb.d/db.sql"
}
logs{
max_files=10
max_file_size=15
}
resources{
cpu=500
memory=512
network{
mbits=100
port "db" {}
}
}
}
}
}
以上版本有一个需要说明的地方:
volumes = [
"docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/",
]
这是mysql dockerfile里规定的路径映射目录,后面的template会EOH一段sql脚本,并指定destination到这个目录下,作用就是当mysql镜像启动完毕后,会执行这个脚本,这里的例子是创建一个数据库dbwebappdb,并创建用户dbwebapp,密码为dbwebapp,并授权。
详情见官网说明https://hub.docker.com/_/mysql/
其实,还有一种更简单的方式也可以创建数据库和用户名密码,在模板的env里,必须设置MYSQL_ROOT_PASSWORD="123456" ,否则容器启动报错;同时还可以设置MYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD,即初始数据库,用户名,密码,而在template里就只用创建一些数据库表等操作
env{
MYSQL_ROOT_PASSWORD="123456"
MYSQL_DATABASE="wordpress"
MYSQL_USER="wordpress"
MYSQL_PASSWORD="wordpress"
}
注意:mysql docker的数据文件存放有2种方式,一种是默认的,在docker容器内,由docker来管理,缺点是路径不好找,有些数据库管理工具可能不方便使用,而且一旦docker容器删除,数据就丢失了;还有一种方式,通过-v,将宿主机器目录映射到docker内部目录,mysql数据文件存放到宿主机器目录下,这样数据不会丢失,设置方式如下:
volumes = [
"docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/",
"/mysql/mars-dev:/var/lib/mysql"
]
"/mysql/mars-dev:/var/lib/mysql"即将宿主机器目录/mysql/mars-dev映射到docker内部目录/var/lib/mysql,宿主机目录/mysql/mars-dev如果不存在,则会自动生成;而docker内部目录/var/lib/mysql是mysql docker提供的默认写数据文件的目录。
当然,如果使用了宿主目录映射,上面的template,MYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD都不会生效。
参考资料:https://hub.docker.com/_/mysql/
https://mysqlrelease.com/2017/12/hashicorp-nomad-and-app-deployment-with-mysql/