Docker-Compose

对于昨天的考试,需要

  1. 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像
  2. 项目根目录下需要docker/java/Dockerfile 文件用于构建项目镜像
  3. 根目录下需要有docker-compose.yml文件,用于启动mysql镜像和项目镜像
  4. 根目录下需要有build.sh 用于编译maven项目和构建镜像。
  5. 根目录下需要有start.sh启动docker-compose 容器。需要控制台运行,打印出结果。
  6. 数据库连接信息需要从java 的环境变量中读取

build.sh

首先我们应该有一个可运行的实际的项目(项目名为JavaTest3,子项目为Exam1),然后我们将在根目录下建一个build.sh文件,用于项目的编译和将jar包cp到/docker/mysql下,我们将用assembly将第三方依赖库打入一个独立jar包,下面有docker build指令,所以我们接下来将会去看一下这些Dockerfile文件将是怎么构建的。

cd Exam1;
mvn clean;
mvn assembly:assembly;
cp target/app-jar-with-dependencies.jar ../docker/java/app.jar
cd ../docker/mysql;
docker build -t mysql .;
cd ../java;
docker build -t java .;

docker/mysql/用于mysql的构建目录,里面有Dockerfile用于构建镜像,sakila-schema.sql建表sql,sakila-data.sql导入数据sql,setup.sh用于整个项目的运行,privileges.sql设置权限sql

首先看Dockerfile,可以看出我们用可一个mysql5.6基础镜像,然后copy一些文件到容器中,因为在Docker镜像构建中,每多一个COPY会多一层镜像,会占用空间,我们优化了一下代码,只用一个COPY,然后用sh /mysql/setup.sh进行启动,我将会在setup.sh中进行一些sql数据导入,权限设置等操作。

FROM registry.saas.hand-china.com/tools/mysql:5.6#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes#将所需文件放到容器中
#COPY setup.sh /mysql/setup.sh
#COPY sakila-schema.sql /mysql/sakila-schema.sql
#COPY sakila-data.sql /mysql/sakila-data.sql
#COPY privileges.sql /mysql/privileges.sql
COPY . /mysql/#设置容器启动时执行的命令
CMD ["sh", "/mysql/setup.sh"]

接下来看一下setup.sh我到底做了什么.首先在里面启动mysql服务,导入数据,修改权限,最后用tail -f /dev/null接受输入信息但是什么都不做,不加这个mysql会停止运行,这样我们可以让mysql一直运行,模拟后台运行的效果。

#!/bin/bash
#告诉bash如果任何语句的执行结果不是true则应该退出防止错误像滚雪球般变大导致一个致命的错误
set -e#查看mysql服务的状态,方便调试,这条语句可以删除
echo `service mysql status`echo '1.start mysql....'
#启动mysql
service mysql start
sleep 3
echo `service mysql status`echo '2.start import data....'
#导入数据
mysql < /mysql/sakila-schema.sql
mysql < /mysql/sakila-data.sql
echo '3.import data complete....'sleep 3
echo `service mysql status`#重新设置mysql密码
echo '4.start modify password....'
mysql < /mysql/privileges.sql
echo '5.modify password complete....'#sleep 3
echo `service mysql status`
echo 'mysql is running'#可以接受输入信息但是什么都不做,不加这个mysql会停止运行
tail -f /dev/null

sakila-schema.sql sakila-data.sql主要是sql数据,我们不再分析。

接下来是privileges.sql设置权限,因为我们在setup.sh设置了无密码登录,这是不对的,我们在这里面将为mysql设置权限,新建一个用户为用户授权,记得root@'%'是除localhost之外的所有网授权,.是对任意数据库的任意表搜权。

use mysql;
select host, user from user;
-- 因为mysql版本是5.7,因此新建用户为如下命令:
create user root identified by '123456';
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
grant all on *.* to root@'%' identified by '123456' with grant option;
-- 这一条命令一定要有:
flush privileges;

接下来,我们去看一下/docker/java中我们项目镜像怎么构建的,这个目录下有Dockerfile用于构建镜像,app.jar是我们在build.sh中cp过来的,我们将在docker中运行这个jar包,我们不会通过ENTRYPOINT ["java","-jar","app.jar"]直接启动项目,因为我们的mysql导入数据需要时间,怎么办呢,我们将在run.sh中延迟20s运行jar包这样就没有问题了。

FROM registry.saas.hand-china.com/hap-cloud/base:latest#COPY app-jar-with-dependencies.jar app.jar
#COPY run.sh run.shCOPY . .#ENTRYPOINT ["java","-jar","app.jar"]
CMD ["sh","run.sh"]

接下来我们看一下run.sh,睡眠15秒再执行jar包

#!/bin/bash
set -esleep 15echo 'start run app.jar'
java -jar app.jar#tail -f /dev/null

start.sh

以上通过指令通过build.sh会自动执行构建操作,结果是两个可运行的docker镜像,接下来我们通过docker-compose.yml运行我们的项目,然后我们用sh start.sh就可以完整显示结果

在docker-compose.yml文件中,我们配置了mysql的属性,项目镜像的属性和环境变量

version: '2'
services:mysql:image: mysqlports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=123456container_name: javatest3_mysql_1jdk:image: javadepends_on:- mysqlenvironment:- name=root- pwd=123456- ip=192.168.99.100- port=3306- dbname=sakila- country_id=2- customer_id=1container_name: javatest3_jdk_1

在start.sh中首相我们以后台方式启动docker-compose,不然命令行会被占用,不能敲其他命令,因为我们数据有延迟导入,我们的日志要等20s才打印,这样的日志才是完全的。

docker-compose up -d;
echo ---------------------mysqllog------------------------------
echo please wait 20s,we are importing data to mysql,we will print complete mysql log after 20s.
sleep 20
docker logs javatest3_mysql_1;
echo --------------------jdklog------------------------------------
#echo please wait 30s,because we are importing data to mysql,jdk will don,t connect to data server.
#sleep 30
docker logs javatest3_jdk_1;

然后你可以看你的结果,如果想关闭这个项目,有clear.sh,清除不需要的容器和镜像

docker stop javatest3_mysql_1
docker stop javatest3_jdk_1
docker rm javatest3_mysql_1
docker rm javatest3_jdk_1
docker rmi mysql
docker rmi java
docker rmi $(docker images -q -f dangling=true)

shell 编程

#!/bin/bash任何脚本中的这一行来确定脚本的执行能力,如独立的可执行文件,而不是在终端中预先键入sh,bash等。

shell变量

str="hello world"
echo $str   # hello world

shell数组

array[0] = val
array[1] = val
array[2] = val
array=([2]=val [0]=val [1]=val)
array(val val val)

shell函数

#!/bin/bash
function hello {echo world!
}
hellofunction say {echo $1
}
say "hello world!"

shell条件

if [expression]; then
else
fi

shell循环

while condition; dostatements
doneuntil condition; dostatements
donefor name [in list]
dostatements that can use $name
donefor x := 1 to 10 do
beginstatements
end

shell教程

转载于:https://www.cnblogs.com/sufferingStriver/p/9403449.html

7.24实习培训日志-Docker-Compose相关推荐

  1. docker compose 停止_Docker-Compose 基础与实战,看这一篇就够啦

    作者 | 飘渺Jam 责编 | 屠敏 出品 | CSDN 博客 what & why Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.使用前 ...

  2. Docker(八):Docker Compose

    Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务.然 ...

  3. 从零开始学习docker(十二)介绍Docker Compose基本使用

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 默认情况下在mac或者Windows安装docker的时候会自动安装docker-compose.对于Linux ...

  4. 使用Docker Compose管理多个容器

    使用Docker Compose管理多个容器 Docker Compose是一个用来定义和运行复杂应用的Docker工具.使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启 ...

  5. 基于Docker Compose搭建的Mysql8.0主从复制(1主3从,多主机)

    系统环境 CentOs 7 mysql 8.0.19 docker 18.09.9-ce docker-compose 1.26.1-rc3 安装docker-compose环境 docker-com ...

  6. docker compose dns 缓存_Docker深入浅出 | Docker Compose多容器实战

    Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方 ...

  7. 【云原生|Docker系列6】Docker Compose的命令使用详解

    前言 本文主要学习Docker Compose 的命令操作方法. 本文主要以docker-compose 版本1.29.2为例. Docker Compose的命令说明 对于 Compose 来说,⼤ ...

  8. Docker容器化实战第七课 容器编排Docker Compose、Docker Swarm 和 Kubernetes

    19 如何使用 Docker Compoe 解决开发环境的依赖? 前两个模块,我们从 Docker 的基本操作到 Docker 的实现原理,为你一步一步揭开了 Docker 神秘的面纱.然而目前为止, ...

  9. Docker三剑客——Docker Compose

    目录 一.概述 二.Docker Compose工作流程 三.安装Docker Compose 四.Docker Compose管理命令 (1)docker-compose build (2)dock ...

  10. Docker - 使用Docker Compose部署应用

    简介 Docker Compose是一个基于Docker Engine进行安装的Python工具.该工具使得用户可以在一个声明式的配置文件中定义一个多容器的应用,在Docker节点上,以单引擎模式(S ...

最新文章

  1. python3.7.2怎么用不了pillow_python 3.7.0 下pillow安装方法
  2. AbstractFactory抽象工厂模式
  3. 在C#代码中应用Log4Net(一)简单使用Log4Net
  4. seaborn 画堆叠柱状图_Seaborn-基于matplotlib的更强力制图库
  5. MySQL搭建主从复制架构实战
  6. ARM, MIPS, Power PC
  7. 攻防世界 CRYPTO 新手练习区 答题(1-12题解)
  8. 如何批量从Excel文件中导入数据到数据库(二)
  9. 学习scratch3.0第2章
  10. java field 赋值_Java Field.set()向对象的这个Field属性设置新值value
  11. 牛客补题 树 dsu on tree
  12. 计算机的复数形式英语,名词的复数形式大全
  13. 春来夏往,秋收冬藏,我们来日方长(第一章)
  14. MacOS获取辅助功能权限控制鼠标点击事件
  15. Linux如何在文件中新建一行,linux – 如何使用sed将文本插入文件的第一行?
  16. HTML5表单新特征简介与举例
  17. CSS复合选择器,元素的显示模式,CSS背景设置
  18. python基础教程网易云_Python爬虫教程:网易云音乐歌词
  19. Python制作牛奶冻
  20. ubuntu18.04安装详解

热门文章

  1. 动态规划(Dynamic Programming)理论篇
  2. 如何在fedora安装Telegram
  3. UITableView+UITableViewStyleGrouped 处理section之间间隙
  4. 《你的灯亮着吗》读书笔记2
  5. Servlet线程安全性
  6. Git提交代码相关命令
  7. [JNI] 开发基础(6)字符串相关操作
  8. vue+webpack实现一个todolist
  9. nginx做下载文件服务器
  10. 2只老虎c语言课程设计,中班两只老虎教案