7.24实习培训日志-Docker-Compose
Docker-Compose
对于昨天的考试,需要
- 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像
- 项目根目录下需要docker/java/Dockerfile 文件用于构建项目镜像
- 根目录下需要有docker-compose.yml文件,用于启动mysql镜像和项目镜像
- 根目录下需要有build.sh 用于编译maven项目和构建镜像。
- 根目录下需要有start.sh启动docker-compose 容器。需要控制台运行,打印出结果。
- 数据库连接信息需要从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.sh
COPY . .
#ENTRYPOINT ["java","-jar","app.jar"]
CMD ["sh","run.sh"]
接下来我们看一下run.sh,睡眠15秒再执行jar包
#!/bin/bash
set -e
sleep 15
echo '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: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
container_name: javatest3_mysql_1
jdk:
image: java
depends_on:
- mysql
environment:
- name=root
- pwd=123456
- ip=192.168.99.100
- port=3306
- dbname=sakila
- country_id=2
- customer_id=1
container_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!
}
hello
function say {
echo $1
}
say "hello world!"
shell条件
if [expression]; then
else
fi
shell循环
while condition; do
statements
done
until condition; do
statements
done
for name [in list]
do
statements that can use $name
done
for x := 1 to 10 do
begin
statements
end
7.24实习培训日志-Docker-Compose的更多相关文章
- 7.13实习培训日志 Docker
静态博客github地址 静态博客github地址轻量版 Docker Docker镜像 Docker镜像概念 Docker镜像下载时的分层体现:一层层下载,下载过程中给出了每一层的 ID 的前 12 ...
- 7.31实习培训日志-docker sql
docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...
- 7.23实习培训日志-JDBC
总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...
- 7.12实习培训日志 Linux Docker
Linux 管理 RHEL7 的用户和组 用户的属性修改 chage -l [username] #查看用户信息 usermod --expiredate=YYYY-MM-DD [username] ...
- 7.27实习培训日志-Oracle SQL(三)
Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...
- 7.25实习培训日志-Oracle SQL(一)
Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...
- 7.30实习培训日志-SQL优化
总结 今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO), ...
- 7.29实习培训日志-Oracle题目
总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...
- 7.19实习培训日志- java进阶
java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...
随机推荐
- Python 案例一(计算人体体脂率)
#计算人体体脂率 #输入部分 #身高 personHeight = input("请输入你的身高(m):") personHeight = float(personHeight) ...
- Vim 分隔窗口
一,分隔窗口: 打开文件时在:命令模型时下面输入:split 将分隔为上下2个窗口:默认上窗口为活动窗口,可以通过CTRL-w来来回切换窗口; :close 为关闭窗口,最后一个窗口不能关闭: :on ...
- mac活动监视器闪退
输入:rm -rf ~/Library/LaunchAgents/com.apple.Yahoo.plist即可!
- Web container==Servlet container
Web container From Wikipedia, the free encyclopedia (Redirected from Servlet container) Web co ...
- Codeforces 505C Mr. Kitayuta, the Treasure Hunter:dp【考虑可用范围】
题目链接:http://codeforces.com/problemset/problem/505/C 题意: 有n个宝石,分别在位置p[i].(1 <= n,p[i] <= 30000) ...
- 各数据库连接配置与maven依赖安装
maven用的比较多,所以自己去捣鼓了一下:以下是关于数据库配置的一块,把相关的内容张贴出来,以备不时之需 //MySql 配置文件(maven):pom.xml <dependency> ...
- 模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉
Delphi的TCanvas类可以实现各种复杂的图形输出功能,基于近期项目的需求,利用它实现了一个很炫的动态折线图(模拟了资源管理器中CPU使用率的折线图),可以直观地展现出数值的实时变化情况. 这段 ...
- 初识JQuery(1)-选择器
初识jquery 在学习jquery之前,就有看过一些相关的视频,才知道它是可以写很少的代码就可以完成很多事的.记得第一写轮播图的时候,首先就百度了篇轮播图的实现,当时还不知道自己百度的其实不是原生的 ...
- Selenium-js弹窗浮层
学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性 ...
- 大数据_学习_01_Hadoop 2.x及hbase常用端口及查看方法
二.参考资料 1.Hadoop 2.x常用端口及查看方法