首页
在线工具
搜索
1
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
2
ShardingSphere使用中的重点问题剖析
3
Flowable工作流引擎源码深度解析
4
用AI生成的原型设计稿效果还可以
5
如何将Virtualbox和VMware虚拟机相互转换
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
6
篇与
的结果
2017-04-27
Docker Compose学习笔记
Docker Compose学习笔记 如果需要指定额外的编译镜像的 Dockefile 文件,可以通过该指令来指定。 例如 dockerfile: Dockerfile-alternate 注意,该指令不能跟 image 同时使用,否则 Compose 将不知道根据哪个指令来生成最终的服务镜像。 extends 基于其它模板文件进行扩展。 例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 common.yml。 # common.yml webapp: build: ./webapp environment: - DEBUG=false - SEND_EMAILS=false 再编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 # development.yml web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db environment: - DEBUG=true db: image: postgres 使用 extends 需要注意: 要避免出现循环依赖,例如 A 依赖 B,B 依赖 C,C 反过来依赖 A 的情况。 extends 不会继承 links 和 volumes_from 中定义的容器和数据卷资源。
2017年04月27日
2017-04-26
如何用 Docker 构建、运行、发布来一个 spring Boot 应用
如何用 Docker 构建、运行、发布来一个 spring Boot 应用。 Docker 简介 Docker 是一个 Linux 容器管理工具包,具备“社交”方面,允许用户发布容器的 image (镜像),并使用别人发布的 image。Docker image 是用于运行容器化进程的方案,在本文中,我们将构建一个简单的 Spring Boot 应用程序。 有关 Docker 的详细介绍,可以移步至 《简述 Docker》 前置条件 JDK 1.8+ Maven 3.0+ Docker 最新版。有关 Docker 在的安装,可以参阅 《Docker 在 CentOS 下的安装、使用》。 如果你的电脑不是 Linux 系统,最好装个虚拟机,在虚拟机里面装个 Linux ,因为 Docker 的依赖 Linux。 用 Maven 构建项目 创建目录结构 项目的目录结构因符合 Maven 的约定。 在 *nix 系统下执行 mkdir -p src/main/Java/docker_spring_boot ,生产如下结构 : └── src └── main └── java └── com └── lzh └── docker_spring_boot 创建 pom.xml 文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lzh</groupId> <artifactId>docker-spring-boot</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <name>docker-spring-boot</name> <description>Getting started with Spring Boot and Docker</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- tag::plugin[] --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.3</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- end::plugin[] --> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <docker.image.prefix>lzh</docker.image.prefix> <spring.boot.version>1.3.3.RELEASE</spring.boot.version> </properties> </project> Spring Boot Maven plugin 提供了很多方便的功能: 它收集的类路径上所有 jar 文件,并构建成一个单一的、可运行的“über-jar”,这使得它更方便地执行和传输服务。 它搜索的 public static void main() 方法来标记为可运行的类。 它提供了一个内置的依赖解析器,用于设置版本号以匹配 Spring Boot 的依赖。您可以覆盖任何你想要的版本,但它会默认选择的 Boot 的版本集。 Spotify 的 docker-maven-plugin 插件是用于构建 Maven 的 Docker Image imageName指定了镜像的名字,本例为 lzh/docker-spring-boot dockerDirectory指定 Dockerfile 的位置 resources是指那些需要和 Dockerfile 放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入。本例,只需一个 jar 文件。 编写 Spring Boot 应用 编写一个简单的 Spring Boot 应用 : src/main/java/com/lzh/docker_spring_boot/Application.java: package com.lzh.docker_spring_boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 主应用入口 * @author lzh * @date 2017年3月19日 */ @SpringBootApplication @RestController public class Application { @RequestMapping("/") public String home() { return "Hello Docker World." + "<br />Welcome to SpringBoot</li>"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 解释下上面的代码: 类用 @SpringBootApplication @RestController 标识,可用 Spring MVC 来处理 Web 请求。 @RequestMapping 将 / 映射到 home() ,并将”Hello Docker World” 文本作为响应。 main() 方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用。 运行程序 使用 Maven 编译: mvn package 运行: java -jar target/docker-spring-boot-1.0.0.jar 访问项目 如果程序正确运行,浏览器访问 http://localhost:8080/,可以看到页面 “Hello Docker World.” 字样。 将项目容器化 Docker 使用 Dockerfile 文件格式来指定 image 层, 创建文件 src/main/docker/Dockerfile: FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD docker-spring-boot-1.0.0.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 解释下这个配置文件: VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录 项目的 jar 文件作为 “app.jar” 添加到容器的 ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source 构建 Docker Image 执行构建成为 docker image: mvn package docker:build 运行 运行 Docker Image docker run -p 8080:8080 -t lzh/docker-spring-boot [root@lzh spring-boot]# docker run -p 8080:8080 -t lzh/docker-spring-boot . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.3.RELEASE) 2016-03-20 08:45:51.276 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : Starting Application v1.0.0 on 048fb623038f with PID 1 (/app.jar started by root in /) 2016-03-20 08:45:51.289 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : No active profile set, falling back to default profiles: default 2016-03-20 08:45:51.722 INFO 1 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy 2016-03-20 08:45:54.874 INFO 1 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 2016-03-20 08:45:57.893 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2016-03-20 08:45:57.982 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2016-03-20 08:45:57.984 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.32 2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 6877 ms 2016-03-20 08:45:59.672 INFO 1 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2016-03-20 08:45:59.695 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2016-03-20 08:45:59.701 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:'requestContextFilter' to: [/*] 2016-03-20 08:46:00.862 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy 2016-03-20 08:46:01.166 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String com.lzh.docker_spring_boot.Application.home() 2016-03-20 08:46:01.189 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2016-03-20 08:46:01.190 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.438 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.833 INFO 1 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-03-20 08:46:02.332 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2016-03-20 08:46:02.343 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : Started Application in 13.194 seconds (JVM running for 15.828) 推送 image 到 Docker Hub 首先,你在 Docker Hub 要有注册账号,且创建了相应的库; 其次,docker 推送前,先要登录,否则报unauthorized: access to the requested resource is not authorized的错误 执行: docker login [root@lzhspring-boot]# docker login Username: root Password: Email: idinu@gmail.com WARNING: login credentials saved in /root/.docker/config.json Login Succeeded - 执行推送 docker push lzh/docker-spring-boot [root@lzhspring-boot]# docker push lzh/docker-spring-boot The push refers to a repository [docker.io/lzh/docker-spring-boot] 751d29eef02e: Layer already exists 4da3741f39c7: Pushed 5f70bf18a086: Layer already exists 7e4d0cb13643: Layer already exists 8f045733649f: Layer already exists latest: digest: sha256:eb4d5308ba1bb27489d808279e74784bda6761b3
2017年04月26日
2016-10-10
Docker给运行中的容器添加映射端口
Docker给运行中的容器添加映射端口 在Docker的使用场景中,有时需要为正在运行的容器添加映射端口,以便外部可以访问容器内的服务。以下为您介绍两种常见的方法: 方法1 1、获得容器IP 使用docker inspect命令来获取容器的详细信息,从中筛选出IP地址。在实际操作时,需要将container_name替换为您实际环境中的容器名,具体命令如下: docker inspect `container_name` | grep IPAddress 2、iptable转发端口 利用iptables工具进行端口转发设置,实现将容器的指定端口映射到Docker主机的另一个端口。例如,将容器的8000端口映射到Docker主机的8001端口,可使用以下命令: iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 在上述命令中,-t nat指定了使用nat表,用于网络地址转换;-A DOCKER表示在DOCKER链中添加一条规则;-p tcp指定协议为TCP;--dport 8001表明目标端口是8001;-j DNAT表示执行目的网络地址转换操作;--to-destination 172.17.0.19:8000则指定了要转换到的目标地址和端口,即容器的IP地址172.17.0.19和端口8000 。 方法2 1.提交一个运行中的容器为镜像 通过docker commit命令把正在运行的容器提交为一个新的镜像。其中,containerid为要提交的容器的ID,foo/live是自定义的镜像名称和标签,具体命令如下: docker commit containerid foo/live 2.运行镜像并添加端口 使用docker run命令来运行新创建的镜像,并通过-p参数指定端口映射关系。例如,将容器内部的80端口映射到主机的8000端口,命令如下: docker run -d -p 8000:80 foo/live /bin/bash 在该命令里,-d表示以守护进程模式在后台运行容器;-p 8000:80指定了端口映射,即把主机的8000端口映射到容器的80端口;foo/live是要运行的镜像名称;/bin/bash是容器启动时执行的命令,这里表示启动一个交互式的bash shell 。
2016年10月10日
2016-10-10
使用nsenter进入Docker容器
使用nsenter进入Docker容器 Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。 我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器? 浏览了Docker的文档,我没有找到答案。还是要求助于无所不能的Google,万能的Google告诉我用nsenter吧。 在大多数Linux发行版中,util-linux包中含有nsenter.如果没有,你需要安装它. cd /tmp curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz \ | tar -zxf- cd util-linux-2.24 ./configure --without-ncurses make nsenter cp nsenter /usr/local/bin 使用shell脚本 docker-enter,将如下代码保存为docker-enter, chmod +x docker-enter #!/bin/sh if [ -e $(dirname "$0")/nsenter ]; then # with boot2docker, nsenter is not in the PATH but it is in the same folder NSENTER=$(dirname "$0")/nsenter else NSENTER=nsenter fi if [ -z "$1" ]; then echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]" echo "" echo "Enters the Docker CONTAINER and executes the specified COMMAND." echo "If COMMAND is not specified, runs an interactive shell in CONTAINER." else PID=$(docker inspect --format "{{.State.Pid}}" "$1") if [ -z "$PID" ]; then exit 1 fi shift OPTS="--target $PID --mount --uts --ipc --net --pid --" if [ -z "$1" ]; then # No command given. # Use su to clear all host environment variables except for TERM, # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH, # and start a login shell. "$NSENTER" $OPTS su - root else # Use env to clear all host environment variables. "$NSENTER" $OPTS env --ignore-environment -- "$@" fi fi 运行 docker-enter <container id> ,这样就进入到指定的容器中 退出 exit
2016年10月10日
2016-08-11
Docker 基本语法与选项
Docker 基本语法与选项 基本语法 docker [OPTIONS] COMMAND [arg...] 选项 选项 描述 `-D=true false` -H, --host=[unix:///var/run/docker.sock] 在daemon模式下绑定的socket,通过一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd 来指定。 `--api-enable-cors=true false` -b="" 将容器挂载到一个已存在的网桥上。指定为'none'时则禁用容器的网络。 --bip="" 让动态创建的docker0采用给定的CIDR地址; 与-b选项互斥。 `-d=true false` --dns="" 让Docker使用给定的DNS服务器。 -g="" 指定Docker运行时的root路径。缺省为/var/lib/docker。 `--icc=true false` --ip="" 绑定端口时候的默认IP地址。缺省为0.0.0.0。 `--iptables=true false` --mtu=VALUE 指定容器网络的MTU。缺省为1500。 -p="" 指定daemon的PID文件路径。缺省为/var/run/docker.pid。 -s="" 强制Docker运行时使用给定的存储驱动。 `-v=true false` `--selinux-enabled=true false` 命令 Docker的命令可以采用docker-CMD或者docker CMD的方式执行。两者一致。 容器操作 docker attach 依附到一个正在运行的容器中。 docker cp 从容器中复制文件到宿主系统中。 docker diff 检查一个容器文件系统的修改。 docker exec 在运行中的容器内执行命令。 docker kill 关闭一个运行中的容器 (包括进程和所有资源)。 docker pause 暂停一个容器中的所有进程。 docker port 查找一个NAT到一个私有网口的公共口。 docker ps 列出容器。 docker restart 重启一个运行中的容器。 docker rm 删除给定的若干个容器。 docker start 启动一个容器。 docker stop 终止一个运行中的容器。 docker top 查看一个容器中的正在运行的进程信息。 docker unpause 将一个容器内所有的进程从暂停状态中恢复。 docker wait 阻塞直到一个容器终止,然后输出它的退出符。 镜像操作 docker build 从一个Dockerfile创建一个image。 docker commit 从一个容器的修改中创建一个新的image。 docker export 导出容器内容为一个tar包。 docker history 显示一个image的历史。 docker images 列出存在的image。 docker import 导入一个tar包来创建一个image。 docker load 从一个tar包中加载一个image。 docker pull 从一个Docker的注册服务器下拉一个image或仓库。 docker push 将一个image或者仓库推送到一个Docker的注册服务器。 docker rmi 删除给定的若干个image。 docker save 保存一个image为tar包文件。 docker tag 为一个image打标签。 其他命令 docker events 从服务端获取实时的事件。 docker info 显示一些相关的系统信息。 docker inspect 显示一个容器的底层具体信息。 docker logs 获取容器的log信息。 docker version 输出Docker的版本信息。 docker login 注册或登录到一个Docker的仓库服务器。 docker logout 从Docker的仓库服务器登出。 docker search 在Docker index中搜索一个image。
2016年08月11日
1
2