创建自己的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