创建自己的docker
- 测试服务器已经安装docker
- 编写测试工程主要代码如下
DockerApplication : 服务类
@SpringBootApplication
@RestController
public class DockerApplication {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(DockerApplication.class, args);
}
}
代码详细见github
3. 执行pom.xml生成docker-0.0.1-SNAPSHOT.jar
将上面生成的docker-0.0.1-SNAPSHOT.jar复制到工作目录如:/docker/simplebuild
4. 在工作目录下,添加Dockerfile,内容如下
FROM openjdk
MAINTAINER hryou0922
ENV JAVA_HOME /usr/local/java
RUN echo $JAVA_HOME
ADD docker-0.0.1-SNAPSHOT.jar /home/hry/docker/simplebuild/contain/app.jar
# 创建用户
RUN useradd hryou0922
RUN echo "hryou0922:hryou0922" | chpasswd
# 指定用户
USER hryou0922
# 外挂盘
VOLUME /home/hry/docker/simplebuild
# 工作目录
WORKDIR /home/hry/docker/simplebuild/contain/
EXPOSE 8080
ENTRYPOINT ["java","-jar" ,"/home/hry/docker/simplebuild/contain/app.jar"]
Dockerfile语法介绍本章后面介绍
5. 建立imange并运行
在当前目录下命令执行创建image命令
```
docker build -t cnbao/myjdk .
```
命令末尾“.”表示Dockerfile在当前路径下
查看当前images列表,发现image已经生成:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cnbao/myjdk latest 9c69de534f81 3 days ago 655.8 MB
创建容器并运行
hry@hry-VirtualBox:/home/share$ docker run -d --name test4 -p 8080:8080 cnbao/myjdk
57702e0c5c60252ffac2b8832c2cb455aeab62957e63013daeb74a0e47bb2a63
访问服务接口,表示服务已经启动成功
hry@hry-VirtualBox:/home/share$ curl http://127.0.0.1:8080/
Hello Docker Worldhry
Dockerfile语法
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令
FROM:
目地:指定基础的image,表示新程序基于哪个image构建新image
语法:
FROM <image>:<tag>
tag:版本号,如果没有,则使用最新版本MAINTAINER
指定镜像创建者信息语法:MAINTAINER <name>
RUN
RUN可以运行任何被基础image支持的命令
语法:RUN <command> (the command is run in a shell - `/bin/sh -c`) 或 RUN ["executable", "param1", "param2" ... ] (exec form)
- CMD
容器启动时运行的操作。该指令只能在文件中存在一次,如果有多个,则只执行最后一条
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
或
CMD command param1 param2 (as a shell)
ENTRYPOINT
设置容器启动时执行的操作。该指令只能在文件中存在一次,如果有多个,则只执行最后一条语法:ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form) 或 ENTRYPOINT command param1 param2 (as a shell)
该指令的使用分为两种情况,
一种是独自使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效# CMD指令将不会被执行,只有ENTRYPOINT指令被执行 CMD echo “Hello, World!” ENTRYPOINT ls -l
另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。
FROM ubuntu CMD ["-l"] ENTRYPOINT ["/usr/bin/ls"]
USER
设置启动容器的用户,默认是root用户。指定 memcached 的运行用户daemon# 指定memcached的运行用户 ENTRYPOINT ["memcached"] USER daemon 或 ENTRYPOINT ["memcached", "-u", "daemon"]
EXPOSE
指定容器需要映射到宿主机器的端口语法:EXPOSE <port> [<port>...] # 映射一个端口 EXPOSE port1 # 等价于 docker run -p port1 image ===================================== # 映射多个端口 EXPOSE port1 port2 port3 # 等价于 docker run -p port1 -p port2 -p port3 image # 还可以指定需要映射到宿主机器上的某个端口号 docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
ENV
在image中设置一个环境变量。语法:ENV <key> <value> ENV JAVA_HOME /usr/local/java8
ADD
从src复制文件到容器的的dest路径语法: ADD <src> <dest> <src> 源目录/文件 <dest> 容器中的绝对路径
VOLUME
指定挂载点.语法: VOLUME ["DIR"] VOLUME ["/tmp/data"]
运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在
WORKDIR
切换目录。可以多次切换工作目录(相当于cd命令)语法: WORKDIR /path/to/workdir