MySQL服务的创建

一 下载mysql镜像
从Docker Hub上的下载mysql镜像。
二 使用镜像
找到需要的镜像后,就可以使用docker的run命令创建一个容器了。
使用默认配置的方法:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
其中:
-p 3306:3306:将容器的3306端口映射到主机的3306端口。
-e 指定环境变量,其中MYSQL_ROOT_PASSWORD=root,即初始化root用户的密码为root。
-name 即命名容器的名称为mysql。
-d: 后台运行容器,并返回容器ID。
最后的mysql表明使用最新的mysql镜像,如果要指定版本,和pull命令一样,冒号:加版本号。
上面的命令如果本地不存在mysql镜像的话,也会先pull操作的。
这样就启动了一个运行mysql的docker容器。要连接的话,可以先查下启动容器的ip地址就好。
使用inspect命令,加上容器名称或者id即可:
docker inspect mysql
可以看到我的容器ip地址为:172.17.0.2。
这时就可以使用mysql的客户端连接工具连接了。
这样,一个基本的mysql服务就搭建好了。
sudo docker ps
可以看看容器的启动情况
整个实践过程如下:
三 环境变量
除了上面的MYSQL_ROOT_PASSWORD这个强制填写的环境变量外,mysql容器还可以指定其他的可选环境变量。
1 MYSQL_USER, MYSQL_PASSWORD:创建一个新用户并设置该用户的密码。
需要注意的是,不要使用此机制来创建根超级用户,该用户默认使用由MYSQL_ROOT_PASSWORD变量指定的密码创建。
2 MYSQL_DATABASE:指定在容器启动时要创建的数据库的名称。
如果提供了用户/密码,那么该用户将被授予对该数据库的超级用户访问(对应于GRANT ALL)。
3 MYSQL_ALLOW_EMPTY_PASSWORD:设置为yes以允许为root用户使用空密码启动容器。不建议设置为yes。
4 MYSQL_RANDOM_ROOT_PASSWORD:设置为yes时将为root用户生成随机初始密码(使用pwgen)。
生成的root密码将被打印到标准输出(如:GENERATED ROOT PASSWORD:…..)
5 MYSQL_ONETIME_PASSWORD:一旦init完成,将root用户设置为过期,强制在第一次登录时更改密码。
需要注意的是:该功能仅在MySQL 5.6+上受支持。在MySQL 5.5上使用这个选项会在初始化时引发一个适当的错误。

四 配置文件
如果不想使用镜像默认的mysql配置文件,可以通过run命令的-v参数,指定文件挂载。这样也可以自己定义数据文件的存放位置。
比如:
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf
-v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs
-v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql,这个文件默认情况下为mysql的数据文件存放位置

五 通过 Dockerfile构建
除了使用官方提供的镜像,docker镜像也可以自己通过Dockerfile构建。
这里给出docker hub上5.7版本的Dockerfile。
可以通过docker build构建操作。
源码位置:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
# add gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
    && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
    && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
    && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true \
    && apt-get purge -y --auto-remove ca-certificates wget
RUN mkdir /docker-entrypoint-initdb.d
RUN apt-get update && apt-get install -y --no-install-recommends \
# for MYSQL_RANDOM_ROOT_PASSWORD
        pwgen \
# for mysql_ssl_rsa_setup
        openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
        perl \
    && rm -rf /var/lib/apt/lists/*
RUN set -ex; \
# gpg: key 5072E1F5: public key "MySQL Release Engineering <[email protected]>" imported
    key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
    export GNUPGHOME="$(mktemp -d)"; \
    gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    gpg --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
    rm -r "$GNUPGHOME"; \
    apt-key list > /dev/null
ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.20-1debian8
RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list
# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
        echo mysql-community-server mysql-community-server/data-dir select ''; \
        echo mysql-community-server mysql-community-server/root-pass password ''; \
        echo mysql-community-server mysql-community-server/re-root-pass password ''; \
        echo mysql-community-server mysql-community-server/remove-test-db select false; \
    } | debconf-set-selections \
    && apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
    && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
    && chmod 777 /var/run/mysqld \
# comment out a few problematic configuration values
    && find /etc/mysql/ -name '*.cnf' -print0 \
        | xargs -0 grep -lZE '^(bind-address|log)' \
        | xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \
# don't reverse lookup hostnames, they are usually another container
    && echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
六 Docker编排方式
1 简介
Docker在1.12版的引擎中内置编排能力,也就是 Swarm Mode,在容器之上引入了服务(service)的概念,推出了应用栈(stack)来支持多服务应用的部署管理。
在2017年1月发布的 Docker 1.13版本中,Swarm mode迅速成熟,相应的工具支持也进一步完善。 Docker Compose v3 规范,已经全面支持 Swarm mode 概念。从 1.13 开始,Docker 命令行工具支持直接使用 v3 版本的 docker-compose.yml 文件来进行应用栈(stack)部署管理,这大大简化了容器编排使用的复杂性。
2 相关命令
docker stack deploy
docker-compose
3 yaml文件
编写mysql.yml文件
定义了一个mysql数据库,默认root密码为123456,服务异常始终自动重启。
定义了一个web管理数据库工具,映射到主机8080端口。
version: '3.1'
services:
    db:
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 123456
    adminer:
        image: adminer
        restart: always
        ports:
            - 8080:8080
4 启动和查看状态
docker swarm init
docker stack deploy -c mysql.yml mysql
或者
docker-compose -f mysql.yml up
docker stack services mysql
5 测试

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/80246341
今日推荐