Py学习  »  docker

docker系列二 创建自己的docker及Dockerfile语法

hryou0922 • 6 年前 • 226 次点击  

创建自己的docker

  1. 测试服务器已经安装docker
  2. 编写测试工程主要代码如下
    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的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令

  1. FROM:
    目地:指定基础的image,表示新程序基于哪个image构建新image
    语法:
    FROM <image>:<tag>
    tag:版本号,如果没有,则使用最新版本

  2. MAINTAINER 指定镜像创建者信息

      语法:MAINTAINER <name>  
  3. RUN
    RUN可以运行任何被基础image支持的命令
    语法:

    RUN <command> (the command is run in a shell - `/bin/sh -c`)  
    或
    RUN ["executable", "param1", "param2" ... ]  (exec form)  
  4. CMD
    容器启动时运行的操作。该指令只能在文件中存在一次,如果有多个,则只执行最后一条

    CMD ["executable","param1","param2"] (like an exec, this is the preferred form)

    CMD command param1 param2 (as a shell)
  5. 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"]  
  6. USER 设置启动容器的用户,默认是root用户。指定 memcached 的运行用户daemon

    
    # 指定memcached的运行用户  
    
    ENTRYPOINT ["memcached"]  
    USER daemon  
    或  
    ENTRYPOINT ["memcached", "-u", "daemon"]  
  7. 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  
  8. ENV 在image中设置一个环境变量。

     语法:ENV <key> <value> 
    
     ENV JAVA_HOME /usr/local/java8 
  9. ADD 从src复制文件到容器的的dest路径

    语法:
            ADD <src> <dest>  
    
    <src> 源目录/文件
    <dest> 容器中的绝对路径
  10. VOLUME 指定挂载点.

    语法:
        VOLUME ["DIR"]  
    
    VOLUME ["/tmp/data"]  

    运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在

  11. WORKDIR 切换目录。可以多次切换工作目录(相当于cd命令)

    语法:
        WORKDIR /path/to/workdir  

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/PkZHV0ggqg
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/5436
 
226 次点击