Docker demo 演示 - wtdig/study GitHub Wiki

Docker demo

一、docker部署案例

1、部署spring boot项目

1)、编写spring boot项目

pom.xml文件编写

<modelVersion>4.0.0</modelVersion>
    <groupId>com.wt.springboot</groupId>
    <artifactId>springbootdemo4</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath />
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8
        </project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8
        </project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <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.13</version>
                <configuration>
                    <imageName>myimage</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>

spring boot入口文件

package cn.wt.springboot;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author wb-wt261136
 * @version 2017年10月23日 上午10:28:32
 */
@SpringBootApplication
@RestController
public class WtSpringBootApplication {

    @RequestMapping("/hello")
    public String home() {
        return "docker images bulid springboot";
    }

    public static void main(String[] args) {
        SpringApplication.run(WtSpringBootApplication.class, args);
    }
}

2)、编写Dockerfile文件,创建docker镜像

在该项目上创建目录src/main/docker,编写Dockerfile文件:

FROM frolvlad/alpine-oraclejdk8:slim
ADD springbootdemo4-0.0.1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

注意:springbootdemo4-0.0.1.jar的添加,要和编译的结果一致,打包方式为jar包
解释:
#基础镜像:仓库是java,标签用8u66-jdk
FROM java:8u66-jdk
#当前镜像的维护者和联系方式
MAINTAINER duqi [email protected]
#将打包好的spring程序拷贝到容器中的指定位置
ADD target/bookpub-0.0.1-SNAPSHOT.jar /opt/bookpub-0.0.1-SNAPSHOT.jar
#容器对外暴露8080端口
EXPOSE 8080
#容器启动后需要执行的命令
CMD java -Djava.security.egd=file:/dev/./urandom -jar /opt/bookpub-0.0.1-SNAPSHOT.jar
因为目前的示例程序比较简单,这个dockerfile并没有在将应用程序的数据存放在宿主机上。如果你的应用程序需要写文件系统,例如日志,最好利用VOLUME /tmp命令,这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录。

3)、执行maven的安装命令,运行eclipse中run as 的mvn install命令

4)、开启服务器远程链接,安装dokcer,执行docker version命令,检查docker是否可以使用

5)、在服务器的根目录下创建一个目录dokcertemp,将spring boot的整个工程(springbootdemo4)复制到改目录下

6)、cd springbootdemo4,进入该项目文件中,执行mvn package docker:build命令,如果没有安装maven,先安装一下,等待执行为successs

7)、执行dokcer images执行,查看该创建的镜像文件,执行该docker镜像命令:docker run -p 宿主端口:镜像端口 -t 镜像名称 比如:docker run -p 8098:8080 -t myimage ,打开浏览器,输入地址:http://服务器ip:8098/hello

二、docker的常见指令

1)、获取镜像 docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

	 举例:docker pull ubuntu:14.04      ubuntu为仓库名,14.04为标签,也就是版本号

	 备注:上面的命令中没有给出 Docker Registry 地址,因此将会从 Docker Hub 获取镜
			像。而镜像名称是 ubuntu:14.04 ,因此将会获取官方镜像 library/ubuntu
			仓库中标签为 14.04 的镜像。

2)、列出镜像 docker images 列出所有已经下载下来的镜像

	 列出中间层镜像 docker images -a  显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数

	 列出指定像	docker images 仓库名 ,例如:docker images ubuntu

3)、制作镜像 Dockerfile 

	 在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

	 mkdir mydocker

	 cd mydocker

	 touch Dockerfile

	 添加内容:

	 from 指定基础镜像

	 run 命令  RUN <命令> ,就像直接在命令行中输入的命令一样
    	 举例:
    	 	        FROM debian:jessie
			RUN buildDeps='gcc libc6-dev make' \
			&& apt-get update \
			&& apt-get install -y $buildDeps \
			&& wget -O redis.tar.gz "http://download.redis.io/releases/r
			edis-3.2.5.tar.gz" \
			&& mkdir -p /usr/src/redis \
			&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
			s=1 \
			&& make -C /usr/src/redis \
			&& make -C /usr/src/redis install \
			&& rm -rf /var/lib/apt/lists/* \
			&& rm redis.tar.gz \
			&& rm -r /usr/src/redis \
			&& apt-get purge -y --auto-remove $buildDeps
		首先,之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。因此没
		有必要建立很多层,这只是一层的事情。因此,这里没有使用很多个 RUN 对一一
		对应不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串
		联起来。将之前的 7 层,简化为了 1 层。在撰写 Dockerfile 的时候,要经常提醒自
		己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。
		并且,这里为了格式化还进行了换行。Dockerfile 支持 Shell 类的行尾添加 \ 的
		命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注
		释等,会让维护、排障更为容易,这是一个比较好的习惯。
		此外,还可以看到这一组命令的最后添加了清理工作的命令,删除了为了编译构建
		所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt 缓存文件。这
		是很重要的一步,我们之前说过,镜像是多层存储,每一层的东西并不会在下一层
		被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要
		添加的东西,任何无关的东西都应该清理掉。
		很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的
		最后一定要清理掉无关文件。

4)、构建镜像 docker build [选项] <上下文路径/URL/->  docker build -t nginx:v3 .

     比如:在mydocker下有一个Dockerfile文件,进入该命令,执行docker build -t firstDokcer:v1 .

     注意: . 代表当前目录

     docker build 还支持从 URL 构建,比如可以直接从 Gitrepo 中构建:
	 docker build https://github.com/twang2218/gitlab-ce-zh.git

三、docker常见错误:

1) 问题:docker运行容器时,出现docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. See 'docker run --help'.

解决方法:su root # 先切换到root用户, 再执行以下命令

systemctl enable docker # 开机自动启动docker

systemctl start docker # 启动docker

systemctl restart docker # 重启dokcer

二、docker制作镜像,启动一个web应用

1、创建一个文件夹 mkdir dockerDemo

2、制作镜像文件 vi Dockerfile

from tomcat
copy jpress.war /usr/local/tomcat/webapps/

解释:

from 指定基础镜像

copy 将web程序复制到tomcat的webapps目录下

制作镜像之前,先准备基础镜像,比如tomcat;

https://hub.docker.com/_/tomcat 可以从这个网站查看镜像的相关信息

docker pull tomcat 拉取tomcat镜像文件

还要,准备要运行的web应用程序,本次使用开业的博客(jpress),可以从https://github.com/JpressProjects/jpress/releases下载相应的war包;

下载jpress的war包

wget https://github.com/JpressProjects/jpress/releases/download/v1.0.3/jpress-1.0.3.war

修改名称

mv jpress-1.0.3.war jpress.war

3、构建镜像

docker build -t jpress .

-t 指定制作镜像的名称为jpress . 使用当前目录下的Dockerfile文件进行构建

4、当构建提示成功后,查看是否有镜像生成

docker images

5、运行镜像

docker run - d -p 8888:8080 jpress

-d 后台运行 -p 指定端口 8888 当前服务器端口 8080为镜像tomcat中的端口 jpress 启动容器名称

6、访问地址

www.wtdig.top:8888 tomcat页面出现

www.wtdig.top:8888/jpress 博客页面出现

7、如果需要运行mysql数据库,可以拉取mysql的镜像https://hub.docker.com/_/mysql

docker pull mysql

8、运行mysql

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=wt843518 -e MYSQL_DATABASE=jpress mysql

-e MYSQL_ROOT_PASSWORD=wt843518 用户名root 密码wt843518

-e MYSQL_DATABASE=jpress 数据库名称 jpress

注意:查看容器的运行状态 docker ps

查看网络端口占用 netstat -na|grep 3306

停止容器 docker stop 容器的id

⚠️ **GitHub.com Fallback** ⚠️