dockerfile 是一个文本文件,其中包含了若干条指令
- 创建 文件 Dockerfile
FROM nginx
RUN echo '<h1>spring cloud yu docker ha ha </h1>' > /usr/share/nginx/html/index.html
-
构建并且运行
docker build -t nginx:my . docker run -d -p 92:80 nginx:my
http://192.168.43.201:92/ 即可访问
dockerfile常用指令
ADD 复制文件
add src … dest
add [“src”,…“desc”]
src目录文件,desc容器
src可以是Dockerfile所在目录的相对路径,url,压缩包
ADD eureka.jar aap.jar
ARG 构建参数,类似于ENV,只不过在容器运行时,不存在这些参数的
ARG user1=someuser
CMD 容器启动指令
每个Dockerfile只有一个CMD命令
CMD [“executable”,“param1”,“param2”]
CMD [“param1”,“param2”]
CMD command param1 param2 在shell中执行
例子:CMD echo “This is a test” | wc -
COPY 复制文件
COPY src … desc 通add
和 ADD类似,只是 不支持 RUL 和 压缩包
ENTRYPOINT entrypoint 入口点
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2 在shell中执行
和 CMD 一样,都是 docker 容器启动时执行的命令
ENV 设置环境变量
ENV key value
ENV key=value
ENV JAVA_HOME /path/to/java
EXPOSE 声明暴露的端口
运行时,容器提供服务的端口
EXPOSE port
EXPOSE prot1 #端口示例
docker run -p port1 image #运行
docker run -p image #或者-P image
EXPOSE prot1 prot2 #端口示例
docker run -p port1 -p port2 image #运行
docker run -p host_port1:port1 -p host_port2:port2 image #运行
FROM 指定基础镜像
像extends关键字
FROM必须指定,切需要写在其他指令之前
FROM
FROM :
FROM @
LABEL 为镜像添加元数据
LABEL = =
“” 转义 \ 换行
LABEL version=“1.0”
LABEL “com.exaple”=“Incorporated”
MAINTAINER main tainer 指定维护者的信息
为 Dockerfile署名
MAINTAINER 周立eacdy0000@126.com
RUN 执行
RUN command
在shell终端运行
linux /bin/sh -c
windows cmd /s /c
RUN [“executable”,“param1”,“param2”] 使用exec执行,类似于函数调用
RUN ["/bin/bash","-c",“echo hello”]
USER 设置用户
启动镜像时的用户 或者 UID
USER 用户名
USER deamon
VOLUME 指定挂载点 volume
使用容器的一个目录,具有持续化存储的功能,可被容器本身使用或共享给其他容器
VOLUME /data
WORKDIR workdir 指定工作目录
WORKDIR /path/to/workdir
该指令后的 RUN CMD ENTRYPOINT 都将该目录作为当前目录
使用Dockerfile构建 镜像
mvn clean package
编写docker file
FROM java:8
VOLUME /tmp #本地文件夹挂载到当前容器
# 复制文件到容器
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761 # 声明需要暴露的端口
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] # 配置容器启动后执行的命令,java -jar /app.jar
可以使用"-Djava.security.egd=file:/dev/./urandom"加快随机数产生过程。
解决阿里云的tomcat启动慢的问题: Djava.security.egd=file:/dev/./urandom
后台启动并打印日志 nohup java -jar项目名.jarDjava.security.egd=file:/dev/./urandom > 日志.log 2>&1 &
docker build -t itmuch/microservice-discovery-eureka-0.0.1 . 打包
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka-0.0.1
http://localhost:8761/
[root@CentOS1rr 桌面]# docker build -t itmuch/microservice-discovery-eureka-0.0.1 .
Sending build context to Docker daemon 282.2MB
Step 1/6 : FROM java:8
8: Pulling from library/java #pull下来java 8
5040bd298390: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
---> Running in e59982b4f158
Removing intermediate container e59982b4f158
---> dd0ce5eeff83
Step 3/6 : ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar #复制到 app.jar
---> 77cb6bb3326f
Step 4/6 : RUN bash -c 'touch /app.jar' #运行
---> Running in 7791e50b5f5a
Removing intermediate container 7791e50b5f5a
---> 304a49be92c3
Step 5/6 : EXPOSE 8761 #端口为8761
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in a52d73f32edd
Removing intermediate container a52d73f32edd
---> 627b3990da2a
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] #后续的执行
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in d5b2ac655200
Removing intermediate container d5b2ac655200
---> 2548e842daa3
Successfully built 2548e842daa3
Successfully tagged itmuch/microservice-discovery-eureka-0.0.1:latest #构建成功
docker registry管理 docker镜像
docker hub 是 docker官方维护的 docker registry。上面有很多优秀的镜像
docker search 命令搜索镜像
https://hub.docker.com/
docker login
docker push itmuch/microservice-discovery-eureka-0.0.1 推送到仓库
docker registry 2.0 搭建私有仓库
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2 #下载registry
docker tag itmuch/microservice-discovery-eureka-0.0.1 localhost:5000/itmuch/microservice-discovery-eureka-0.0.1 #更改tag
docker push localhost:5000/itmuch/microservice-discovery-eureka-0.0.1 #推送
http://ip:5000/v2/_catalog ,访问可查看仓库动态,和仓库中有多文件
配置仓库
vi /etc/docker/daemon.json
内容如下:
{
"registry-mirrors": [
"<your acccelerate address>"
],
"insecure-registries": [
"ip:5000"
]
}
重启服务:
service docker restart
还可以为私有仓库配置 域名,ssl登陆,认证
Docker Registry 2.0 不包含界面,用户管理,权限控制,如果想要这些,用 Docker Trusted Registry
使用maven插件构建镜像
spotify
fabric8io
bibryam
unzip microservice-discovery-eureka.zip 是解压的
<!-- 添加spring-boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 添加docker-maven插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
imageName 镜像名字,itmuch 仓库名。microservice-discovery-eureka 镜像名。0.0.1 标签
baseImage 指定基础镜像
entryPoint 结束要运行的
resources directory: 需要复制的根目录,target目录
include 指定需要复制的文件
mvn clean package docker:build
docker images
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1
读取Dockerfile构建
src/main/docker/Dockerfile
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
没有baseImage ,和 entryPoint,在Dockerfile设置了
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
maven 安装
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
which java
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar zvxf apache-maven-3.6.3-bin.tar.gz
vim apache-maven-3.6.1/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
#/opt/maven/apache-maven-3.6.1
source /etc/profile
mvn -v
将插件绑定在某个phase执行
mvn phase:goal
mvn package docker:build
package docker 都是 phase
build 是 goal
<build>
<plugins>
<!-- 添加spring-boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</configuration>
</plugin>
</plugins>
</build>
不加这些要用: mvn clean package docker:build
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
执行: mvn package 就会自动执行: docker:build
推送镜像
docker push
也可用maven插件推送一个Docker镜像到 Docker Hub
修改 maven的 setting.xml
<servers>
<server>
<id>docker-hub</id>
<username>cakin24</username>
<password>cakin24的密码</password>
<configuration>
<email>DockerHub邮箱</email>
</configuration>
</server>
</servers>
pom.xml
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-hub</serverId>
</configuration>
</plugin>
mvn clean package docker:build -DpushImage
推送到私有仓库
localhost:5000/itmuch/microservice-discovery-eureka:0.0.4
<imageTags>
<imageTag>0.0.5</imageTag>
<tag>latest</tag>
</imageTags>
mvn clean package docker:build -DpushImageTags -DdockerImageTags=lastest -DdockerImageTags=another-tag
<configuration> <forceTags>true</forceTags> #覆盖push
Docker Compose 编排微服务
Compose 定义和运行多容器Docker应用程序的工具,前身是Fig。
构建CI工作流
本书用 1.10.0
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
docker-compose s
scale start stop