Docker常用命令笔记(二)

2018-01-143282

1、Dockerfile编写常用指令(一般格式为:指令名称 参数)(https://docs.docker.com/engine/reference/builder/

  • FROM 。FROM指令必须指定且需要在Dockerfile其他指令的前面,指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。后续的指令都依赖于该指令指定的image。当在同一个Dockerfile中建立多个镜像时,可以使用多个FROM指令。

    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
  • MAINTAINER。用于指定维护者的信息 MAINTAINER <name>

  • RUN。支持两种格式:

    RUN <command> 或 
    RUN ["executable", "param1", "param2"]
  • CMD。主要目的是为执行容器提供默认值。每个Dockerfile只有一个CMD命令,如果指定了多个CMD命令,那么只有一条会被执行,如果启动容器的时候指定了运行的命令,则会覆盖掉CMD指定的命令。

    CMD ["executable","param1","param2"] (推荐使用)
    CMD ["param1","param2"] (为ENTRYPOINT指令提供预设参数)
    CMD command param1 param2 (在shell中执行)
  • LABEL。为镜像添加元数据 LABEL <key>=<value> <key>=<value> <key>=<value> ...

  • EXPOSE。为Docker容器设置对外的端口号。在启动时,可以使用-p选项或者-P选项。 EXPOSE <port> [<port>...]

  • ENV。指定环境变量,会被后续RUN指令使用,并在容器启动后,可以通过docker inspect查看这个环境变量,也可以通过docker run --env <key>=<value> 来修改环境变量。

    ENV <key> <value>
    ENV <key>=<value> ...
  • ADD。从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。

  • COPY。复制本地端的src到容器的dest。和ADD指令类似,COPY不支持URL和压缩包。

  • ENTRYPOINT。指定Docker容器启动时执行的命令,可以多次设置,但是只有最后一个有效。

  • VOLUME。使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。 VOLUME ["/data"]

  • USER。设置启动容器的用户,默认是root用户。 USER 用户名

  • WORKDIR。切换目录指令,类似于cd命令,对RUN、CMD、ENTRYPOINT生效。 WORKDIR /path/to/workdir

  • ARG。定义一个变量。 ARG <name>[=<default value>]

  • ONBUILD。指定当建立的镜像作为其他镜像的基础时,所执行的命令。 ONBUILD [INSTRUCTION]

2、使用Dockerfile构建Docker镜像

1.在项目jar包所在目录创建文件,命名为Dockerfile

from java:8  # 基于哪个镜像
volume /tmp  # 将本地文件夹挂载到当前容器
# 添加文件到容器
add xxx.jar app.jar
run bash -c 'touch /app.jar'
expose 12345  # 开放12345端口
entrypoint ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] # 配置容器启动后执行的命令

2.构建docker镜像,执行 docker build -t hello/test1 . # 格式:docker build -t 标签名称 Dockerfile的相对位置(.表示当前位置)

3.启动镜像,查看 docker run -d -p 8080:12345 hello/test1

3、使用Maven插件构建Docker镜像

//TODO

4、关于Docker Compose(工具)

  编写Dockerfile 可以让用户管理一个单独的容器,那么如果要管理多个容器呢,例如:我们需要管理一个Web应用的同时还要加上其后端的数据库服务容器呢?而Docker Compose就是这样的一个工具。   官网对Compose的定义是:Compose 是一个用于定义和运行多容器的Docker应用的工具。使用Compose,你可以在一个配置文件(yaml格式)中配置你的应用的服务,然后使用一个命令,即可创建并启动配置中引用的所有服务。

1.安装Compose(官方文档:https://docs.docker.com/compose/install/

  • 下载docker-compose ,并放到/usr/local/bin/
    curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
  • 为Docker Compose脚本添加执行权限
    chmod +x /usr/local/bin/docker-compose
  • 测试命令,如果有版本信息输出则说明Compose已经成功安装
    docker-compose --version

2.docker-compose.yml常用命令(官方文档:https://docs.docker.com/compose/compose-file/

  • image 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。示例: image: java

  • build 指定Dockerfile文件的路径。可以是一个路径,示例: build: ./dir 也可以是一个对象,用以指定Dockerfile和参数,示例:

    build:
    context: ./dir
    dockerfile: Dockerfile-alternate
    args:
      buildno: 1
  • command 覆盖容器启动后默认执行的命令。示例: command: bundle exec thin -p 3000 也可以是一个list,类似于Dockerfile总的CMD指令,格式如下: command: [bundle, exec, thin, -p, 3000]

  • links 链接到其他服务中的容器。可以指定服务名称和链接的别名使用SERVICE:ALIAS 的形式,或者只指定服务名称,示例:

    web:
    links:
     - db
     - db:database
     - redis
  • external_links 表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似,示例:

    external_links:
    - redis_1
    - project_db_1:mysql
    - project_db_1:postgresql
  • ports 暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p ,示例:

    ports:
    - "3000"
    - "3000-3005"
    - "8000:8000"
    - "9090-9091:8080-8081"
    - "49100:22"
    - "127.0.0.1:8001:8001"
    - "127.0.0.1:5000-5010:5000-5010"
  • expose 暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机,示例:

    expose:
    - "3000"
    - "8000"
  • volumes 卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。示例:

    volumes:
    # Just specify a path and let the Engine create a volume
    - /var/lib/mysql
    
    # Specify an absolute path mapping
    - /opt/data:/var/lib/mysql
    
    # Path on the host, relative to the Compose file
    - ./cache:/tmp/cache
    
    # User-relative path
    - ~/configs:/etc/configs/:ro
    
    # Named volume
    - datavolume:/var/lib/mysql
  • volumes_from 从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。示例:

    volumes_from:
    - service_name
    - service_name:ro
    - container:container_name
    - container:container_name:rw
  • environment 设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。示例:

    environment:
    RACK_ENV: development
    SHOW: 'true'
    SESSION_SECRET:
    environment:
    - RACK_ENV=development
    - SHOW=true
    - SESSION_SECRET
  • env_file 从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。示例:

    env_file: .env
    env_file:
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env
  • extends 继承另一个服务,基于已有的服务进行扩展。

  • net 设置网络模式。示例:

    net: "bridge"
    net: "host"
    net: "none"
    net: "container:[service name or container name/id]"
  • dns 配置dns服务器。可以是一个值,也可以是一个列表。示例:

    dns: 8.8.8.8
    dns:
    - 8.8.8.8
    - 9.9.9.9
    dns_search

    配置DNS的搜索域,可以是一个值,也可以是一个列表,示例:

    dns_search: example.com
    dns_search:
    - dc1.example.com
    - dc2.example.com

3.docker-compose常用命令(官方文档:https://docs.docker.com/compose/overview/ ) //TODO

Docker系列

Docker(二):<a href="http://wiki.talkmoney.cn/knowledge/open.knowledge/view/24" target="_blank">http://wiki.talkmoney.cn/knowledge/open.knowledge/view/24</a> Docker(一):<a href="http://wiki.talkmoney.cn/knowledge/open.knowledge/view/13" target="_blank">http://wiki.talkmoney.cn/knowledge/open.knowledge/view/13</a>

参考文档

Docker —— 从入门到实践:http://udn.yyuap.com/doc/docker_practice/index.html 使用Spring Cloud与Docker实战微服务:http://book.itmuch.com/ 简述 Docker:http://www.importnew.com/24658.html Docker 镜像、容器、仓库的概念:http://blog.csdn.net/SmalOSnail/article/details/53117496 Docker实践 - 安装Docker并在容器里运行tomcat:http://blog.csdn.net/massivestars/article/details/54352484

学习文档

Docker官方文档:https://docs.docker.com/engine/understanding-docker/ Docker中文文档:http://git.oschina.net/widuu/chinese_docker Docker Hub:https://hub.docker.com/ Dockerfile文档:https://docs.docker.com/engine/reference/builder/#dockerfile-reference Dockerfile最佳实践:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#build-cache

分享
点赞1
打赏
上一篇:Docker常用命令笔记(一)
下一篇:电梯调度的一些个人见解