lj-zhu / blog Goto Github PK
View Code? Open in Web Editor NEW点点滴滴的记录
点点滴滴的记录
常用docker命令
http://blog.csdn.net/wsscy2004/article/details/25878363
1、查看docker服务信息
docker info
2、查看正在运行的容器
docker ps
docker ps -a 为查看所有的容器,包括已经停止的。
3、查看容器日志
docker logs -f <容器名orID>
4、删除单个容器
docker rm <容器名orID>
5、删除所有容器
docker rm $(docker ps -a -q)
6、停止、启动、杀死一个容器
docker stop <容器名orID>
docker start <容器名orID>
docker kill <容器名orID>
7、查看所有镜像
docker images
8、删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
9、运行一个新容器,同时为它命名、端口映射、文件夹映射。以redmine镜像为例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
10、进入到docker容器终端
docker exec -it pms-web /bin/sh
11、一个容器连接到另一个容器
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server
sonar
容器连接到mmysql容器,并将mmysql容器重命名为db。这样,sonar容器就可以使用db的相关的环境变量了。
12、拉取镜像
docker pull <镜像名:tag>
如 docker pull sameersbn/redmine:latest
13、当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
机器a
docker save busybox-1 > /home/save.tar
使用scp将save.tar拷到机器b上,然后:
docker load < /home/save.tar
14、构建自己的镜像
docker build -t <镜像名> <Dockerfile路径>
15、重新查看container的stdout
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355560k used, 18012k free, 27872k buffers
Swap: 786428k total, 0k used, 786428k free, 221740k cached
^C$
$ sudo docker stop $ID
16、后台运行(-d)、并暴露端口(-p)
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
17、从Container中拷贝文件出来
sudo docker cp 7bb0e258aefe:/etc/debian_version .
拷贝7bb0e258aefe中的/etc/debian_version到当前目录下。
注意:只要7bb0e258aefe没有被删除,文件命名空间就还在,可以放心的把exit状态的container的文件拷贝出来
18、依附到运行中的容器
sudo docker attach ac4c (ac4c 是容器号)
退出,一定不要用ctrl+c,那样就是让docker容器停止了。
要用如下快捷键:先按,ctrl+p;再按,ctrl+q
19、查看端口映射
docker port ac4c (ac4c 是容器号)
public interface Group<T> {
boolean isSameGroup(T current, T next);
}
public static <T> List<List<T>> groupList(List<T> list, Group<T> groupBy) {
// 结果
List<List<T>> groupResult = new ArrayList<>();
if (list == null || list.isEmpty()) {
return groupResult;
}
int len = list.size();
// 当前元素
T currentItem = list.get(0);
// 分组的开始下标
int start = 0;
for (int i=1; i<len; i++) {
// 取下一个元素
T nextItem = list.get(i);
// 当前元素和一下元素不同分组
if(!groupBy.isSameGroup(currentItem, nextItem)) {
// 保存分组
groupResult.add(list.subList(start, i));
// 重置当前元素
currentItem = nextItem;
// 保存新分组的开始下标
start = i;
}
}
if(start == 0) {
groupResult.add(list);
} else {
// 保存余的元素
groupResult.add(list.subList(start, len));
}
return groupResult;
}
public static void main(String[] args) {
Group<Integer> groupBy = new Group<Integer>() {
@Override
public boolean isSameGroup(Integer current, Integer next) {
return current.equals(next);
}
};
List<Integer> list = new ArrayList<>();
List<List<Integer>> groupResult = groupList(list, groupBy);
System.out.println(groupResult);
list.add(1);
list.add(1);
groupResult = groupList(list, groupBy);
System.out.println(groupResult);
list.add(2);
groupResult = groupList(list, groupBy);
System.out.println(groupResult);
list.add(4);
list.add(4);
list.add(4);
groupResult = groupList(list, groupBy);
System.out.println(groupResult);
list.add(7);
groupResult = groupList(list, groupBy);
System.out.println(groupResult);
list.add(8);
list.add(8);
list.add(8);
groupResult = groupList(list, groupBy);
System.out.println(groupResult);
}
[]
[[1, 1]]
[[1, 1], [2]]
[[1, 1], [2], [4, 4, 4]]
[[1, 1], [2], [4, 4, 4], [7]]
[[1, 1], [2], [4, 4, 4], [7], [8, 8, 8]]
在struts2、springMVC的web应用中,不推荐直接使用request,response对象。而登录相关的一些信息一般会放到session中,在action或controller中有时需要用户的一些信息,这时就可以使用拦截器把session中的一些用户信息放到ThreadLocal中,在action或controller中就可以很容易的取到。
struts2中ServletActionContext.getRequest()就是利用这个机制通过静态方法获取request对象的。
/**
* Gets the HTTP servlet request object.
*
* @return the HTTP servlet request object.
*/
public static HttpServletRequest getRequest() {
return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);
}
requestp实际存放到ActionContext.java 中的类变量actionContext中
static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();
我们的Web应用中或多或少的都会用到一些定时任务。但任务量又不大,还不需要单独跑定时任务的应用。但是应用是部署是又是至少两台对外服务(负载均衡, 不中断服务发布),如果多台机器同时跑定时任务时可能会导致1.重复执行相同的任务,2造成数据混乱。
利用Servlet 3中的ServletContainerInitializer类,可以很容易实现Web应用启动时动态做一些设置。
Spring-web中的SpringServletContainerInitializer实现了这个接口,在应用启动时会调用所有实现了WebApplicationInitializer接口的类。
应用中只要实现这个接口,在onStartup中做些初始化的操作。
我们就是利用这个接口,根据一些环境变量和profile做些特殊处理。
@order(1)
public class WebAppInitializer implements WebApplicationInitializer {
private static final Logger logger = LoggerFactory.getLogger(WebAppInitializer.class);
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
logger.info("--------------------WebAppInitializer------------------------");
try {
String hosteName = SystemInfoUtil.getHostName();
if(!ConfigUtil.isOnline() || (hosteName != null && hosteName.toUpperCase().contains("MASTER"))) {
servletContext.setInitParameter("spring.profiles.active", "schedule");
logger.info("spring.profiles.active=schedule");
}
} catch (Exception e) {
logger.error("WebAppInitializerError", e);
}
}
}
在信息管理系统中,导出Excel或CSV是一个很常用的功能。导出一般需要有三个步骤:一写表头,二获取数据,一行行的写入文件,三通过浏览器下载到本地查看。获取什么数据,每条数据需要怎么处理,每个导出都是不一样的,这部分交给具体的导出功能来实现。像控制取数据代码,写入文件的功能抽取出来,封装成一个工具类,用于简化导出。
/**
* 取数据的接口
*/
public interface DataExporter<T>{
/**
* 获取数据
* @return
*/
List<T> getDatas(int start, int maxSize);
/**
* 表头数据
* @return
*/
List<String> getTitle();
/**
* 每行数据
* @param object
* @return
*/
List getExportData(T rowData);
/**
* 统计�数据
* @param object
* @return
*/
List getExportTotalData();
}
导出数据可以是Excel也可以是CSV文件,除了如何把一行数据写入文件中不一样,其余的控制代码是一样的,这样就可以设计一个abstract类
public abstract class Exportor<T> {
private static final int PAGE_SIZE = 500;
public void export(DataExporter<T> exporter) throws IOException {
//表头
List<String> titles = exporter.getTitle();
if (titles != null) {
writeTitle(titles);
}
try {
int pageIndex = 1;
int startIndex = 0;
List<T> list = null;
do {
// 取数据
list = exporter.getDatas(startIndex, PAGE_SIZE);
if(list != null) {
// 导出数据
for (T t : list) {
List rowdata = exporter.getExportData(t);
writeRowData(rowdata);
}
}
startIndex = pageIndex * PAGE_SIZE;
pageIndex++;
} while (list.size() == PAGE_SIZE);
// 导出总计结果
List<T> totalData = exporter.getExportTotalData();
if(totalData != null && totalData.size() > 0){
writeRowData(totalData);
}
} finally {
this.close();
}
}
/**
* 写一行数据
* @param rowData
*/
protected abstract void writeRowData(List rowData) throws IOException;
/**
* 写表头
* @param title
*/
protected abstract void writeTitle(List<String> title) throws IOException;
/**
* 清理工作
*/
protected abstract void close() throws IOException;
}
写入Excel实现:
public class ExcelExportor extends Exportor {
private ExcelWriter excelWriter = null;
private OutputStream outputStream = null;
public ExcelExportor(OutputStream outputStream) {
super();
this.excelWriter = new ExcelWriter();
this.outputStream = outputStream;
}
@Override
protected void writeRowData(List rowData) {
excelWriter.writeRowData(rowData);
}
@Override
protected void writeTitle(List<String> title) {
excelWriter.writeRowData(title);
}
@Override
protected void close() {
excelWriter.writeFile(outputStream);
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
导出到CSV文件的实现:
public class CSVExportor extends Exportor {
private CSVWriter csvWriter = null;
public CSVExportor(Writer writer) {
super();
csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR);
}
protected void writeTitle(List<String> title) {
csvWriter.writeNext(title.toArray(new String[title.size()]));
}
protected void writeRowData(List rowData) {
String[] rowArray = new String[rowData.size()];
rowData.toArray(rowArray);
csvWriter.writeNext(rowArray);
}
@Override
protected void close() {
try {
csvWriter.flush();
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在struts2中结合自定义一个导出Excel的Result
public class ExcelResult<T> implements Result {
private static final Logger logger = LoggerFactory.getLogger(ExcelResult.class);
private String fileName = "export.xls";
private DataExporter<T> exporter;
public ExcelResult(){
super();
}
public ExcelResult(DataExporter<T> exporter){
this(null, exporter);
}
public ExcelResult(String fileName, DataExporter<T> exporter){
super();
if(fileName != null) {
try {
this.fileName = new String(fileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
this.exporter = exporter;
}
@Override
public void execute(ActionInvocation invocation) throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
ServletOutputStream outputStream = response.getOutputStream();
try {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Content-Disposition","attachment;filename=" + fileName + DateUtil.date2String(new Date(), "_yyyyMMddHHmmss") + ".xls");
response.setContentType("application/vnd.ms-excel;charset=gbk");
Exportor<T> export = new ExcelExportor<>(outputStream);
export.export(exporter);
} catch(Exception e) {
logger.error("导出Excel时出错了", e);
}
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setExporter(DataExporter<T> exporter) {
this.exporter = exporter;
}
}
具体使用方法:
public ExcelResult<Reservation> exportResvs() {
final Map params = _buildQueryParams();
ExcelResult<Reservation> result = new ExcelResult<>("订单列表", new DataExporter<Reservation>(){
@Override
public List<Reservation> getDatas(int start, int maxSize) {
return reservationService.getReservations(params, start, maxSize);
}
@Override
public List<String> getTitle() {
List<String> titles = new ArrayList<String>();
titles.add("订单号");
titles.add("渠道");
titles.add("卖价");
titles.add("创建时间");
return titles;
}
@Override
public List getExportData(Reservation resv) {
List<Object> rowData = new ArrayList<Object>();
rowData.add(resv.getReservationId());
rowData.add(resv.getChannelName());
rowData.add(resv.getTotalMoney());
rowData.add(DateUtil.date2String(resv.getCreateDatetime(), DateUtil.DATE_FORMAT_DATE_TIME));
return rowData;
}
@Override
public List getExportTotalData() {
return null;
}
});
return result;
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.