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