经过上面的三个步骤,一个可以使用的应用系统镜像就制作完成了,使用下面的命令来启动容器:
docker run -d --name loginService -p 8800:80 -p 9090:8080 -v myappdata:/home/admin/logs myorg/login:20190108-d 参数表示让容器在后台运行。
--name 参数指定容器的名称。
-p 参数指定端口映射关系。命令中的关系为将宿主机 8800 端口映射到容器中的 80 端口,将宿主机 9090 端口映射到容器中的 8080 端口。
-v 参数指定挂载点对应数据卷的名称。需要特别说明的是,挂载点也可以指定一个宿主机目录去挂载,这样 Docker 将不会创建数据卷。比如使用宿主机的 /data/appdata 目录去挂载,参数值修改为 -v /data/appdata:/home/admin/logs。挂载前宿主机目录必须存在,Docker 不会自动创建,并且要保证具有读写权限。
修改镜像对于常用如 MySQL、Kafka、Redis 等中间件,官方已经为我们提供了经过测试的镜像,我们可以直接拿来使用。但是由于业务的具体需求等原因,我们通常需要对这些镜像进行修改。所谓修改镜像,其实就是基于这些官方镜像制作出新的镜像。在下面的这个例子中,我们将一步步把官方的 mysql:5.7 镜像进行修改。
第一步,修改时区很多官方镜像都使用的零时区,这显然不符合国情,所以 通常我们都需要把官方镜像的时区调整为东八区。调整时区需要安装 tzdata 这个软件,所以我们需要事先确定官方镜像是基于哪种 Linux 发行版进行构建的,否则我们将不知道该使用什么软件安装命令。你可以登录 Docker Hub 搜索对应的镜像,然后查看官方放置在 GitHub 上的 Dockerfile 文件来确定相关信息。
编写 Dockerfile FROM mysql:5.7 ENV TZ=Asia/Shanghai COPY customer.cnf /etc/mysql/conf.d/ RUN apt-get update \ && apt-get install -y tzdata \ && ln -s -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && rm -rf /var/lib/apt/lists/*修改时区的同时我们通过增加自定义 MySQL 配置文件来调整 MySQL 字符集、时区、连接数等配置,内容如下:
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-client-handshake=FALSE character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci max_connections=1000 default-time_zone='+8:00'需要注意的是我们并没有使用 CMD 指令或 ENTRYPOINT 指令来指点容器启动后要执行的操作,因为在很多情况下,除非我们查阅官方镜像的 Dockerfile 文件,否则我们无法获知原本的启动操作是什么。所以只要我们变更的操作不影响启动流程,那么就可以不指定启动操作,让镜像默认使用基础镜像的启动操作。
构建镜像这一步我们将镜像命名为 myorg/mysql:5.7_bjtime_utf8mb4,执行构建命令:
docker build -t myorg/mysql:5.7_bjtime_utf8mb4 . 第二步,自动建库在系统部署情况下,我们系统 MySQL 容器启动后就能将所需要的数据库建立好,这样可以避免我们再手动去建库。
编写 Dockerfile FROM myorg/mysql:5.7_bjtime_utf8mb4 COPY db_login.sql /sqls/db_login.sql COPY privileges.sql /sqls/privileges.sql COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENV MYSQL_ALLOW_EMPTY_PASSWORD yes ENTRYPOINT ["sh", "/entrypoint.sh"]本次构建基于上一步的镜像继续构建,db_login.sql 是建库建表的 SQL 脚本,privileges.sql 是添加数据库用户信息的脚本, entrypoint.sh 是容器启动后要执行的脚本。
privileges.sql 中主要是修改了 ROOT 用户的密码并允许远程登录,内容如下:
update mysql.user set authentication_string=password("123456") where user = "root"; create user 'root'@'%' identified by '123456'; grant all privileges on *.* to 'root'@'%'; flush privileges;entrypoint.sh 脚本负责启动 MySQL Server 并执行 db_login.sql 和 privileges.sql,内容如下:
#! /bin/sh service mysql start sleep 3 mysql < /sqls/db_login.sql mysql < /sqls/privileges.sql tail -f /dev/null最后的 tail -f /dev/null 是为了让进城挂起,禁止容器退出。
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes 表示允许容器启动时 MySQL ROOT 用户没有密码。官方默认要求启动时必须设置 ROOT 用户密码,否则容器无法启动。
构建镜像至此,一个启动即建库并支持 utf8mb4 和东八区的 MySQL 镜像就修改完成了,这个镜像中关于 MySQL 安装和配置部分完全是复用的官方镜像,我们只做了定制化的修改。最后,我们将镜像命名为 myorg/mysql:5.7_login_20190108。
docker build -t myorg/mysql:5.7_login_20190108 . 使用镜像 docker run -d --name login_db -p 3306:3306 -v /data/mysqldata:/var/lib/mysql myorg/mysql:5.7_login_20190108 官方镜像