dockerfile配置以及docker compose

如何配置容器里的应用

1. docker container run --name CONTAINER_NAME -it IMAGE_NAME COMMAND
2. 自定义镜像,将修改完成的配置文件写入镜像
3. 通过传递环境变量,docker container run --name CONTAINER_NAME -e VAR -it IMAGE_NAME COMMAND
4. 通过加载存储卷里的配置文件
5. 借助于其它平台控制容器的启动时加载环境变量,存储卷,配置文件等

Dockerfile

Dockerfile只是纯文本,其包含了生成docker镜像所包含的命令或者指令的集合,使用docker build命令可以自动读取某工作目录下的Dockerfile,通过该文件的配置的命令集合,自动生成Docker镜像文件

Dockerfile的环境变量

使用ENV指令定义
    ENV variabele_na
特殊的变量:
    ${variable:-word}:如果variable为空或者没有设P置,则使用word的值,否则,则使用variable的值
    ${variable:+word}:如果variable不为空或者已经设置,则使用word的值,否则,则使用variable的值

Dockerfile的指令

1、FROM:指定基础镜像,必须为第一个命令

FROM 或者 FROM: #不加tag默认为latest,最好加tag

2、MAINTAINER: 维护者信息 #可以用LATEL代替

MAINTAINER Jasper Xu sorex@163.com

3、ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
注
    <src>必须是build上下文中的路径,不能是父目录中的文件 <dest>建议使用绝对路径,为容器内部的路径,

4、COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

5、RUN:构建镜像时执行的命令,有以下两种命令执行方式:

shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN yum update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:

   RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build –no-cache

6、CMD:构建容器后调用,也就是在容器启动时才进行调用。

格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:

   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令,有多个指令存在时,仅最后一个会生效。
这里边包括参数的一定要用双引号,就是”,不能是单引号。千万不能写成单引号。

7、ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。

格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
    而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。
   不过,docker run命令的--entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

8、LABEL:用于为镜像添加元数据

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:

   LABEL version=”1.0″ description=”这是一个Web服务器” by=”IT笔录”
注:
   使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。
推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

9、ENV:设置环境变量 可被Dockerfile文件中位于其后的其他指令(如ENV,COPY,ADD等)所调用

格式:
    ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
    ENV myCat=fluffy

10、EXPOSE:指定于外界交互的端口

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 11211/tcp 11211/udp
注:

   EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

11、VOLUME:用于指定持久化目录

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:

   一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
–卷可以容器间共享和重用
–容器并不一定要和其它容器共享卷
–修改卷后会立即生效
–对卷的修改不会对镜像产生影响
–卷会一直存在,直到没有任何容器在使用它

12、WORKDIR:工作目录,类似于cd命令

格式:
    WORKDIR /path/to/workdir
注:

   通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

13、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,默认为root用户
    USER <UID>|<UserName>
    注
        UID可以为任意数,但是必须为/etc/passwd中某用户的有效UID,否则run命令将运行失败

14、ARG:用于指定传递给构建运行时的变量

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www

15、ONBUILD:用于设置镜像触发器

格式:

   ONBUILD [INSTRUCTION]
示例:
   ONBUILD ADD . /app/src
   ONBUILD RUN /usr/local/bin/python-build –dir /app/src
注:
   当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

16、HEALTHCHECK:容器健康状况检查命令

语法有两种:
    1. HEALTHCHECK [OPTIONS] CMD command
    2. HEALTHCHECK NONE
    第一个的功能是在容器内部运行一个命令来检查容器的健康状况
    第二个的功能是在基础镜像中取消健康检查命令

[OPTIONS]的选项支持以下三中选项:
    --interval=DURATION 两次检查默认的时间间隔为30秒
    --timeout=DURATION 健康检查命令运行超时时长,默认30秒
    --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

注意:
    HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。
    CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
        0: success - 表示容器是健康的
        1: unhealthy - 表示容器已经不能工作了
        2: reserved - 保留值

例子:
    HEALTHCHECK --interval=5m --timeout=3s \
    CMD curl -f http://localhost/ || exit 1
          解释:健康检查命令是:curl -f http://localhost/ || exit 1  ,两次检查的间隔时间是5秒 ,命令超时时间为3秒

docker compose配置

docker compose

yum install docker-compose
用于编排多个容器,让多个容器有序的运行,停止等操作,并且支持yaml格式
配置段:
    version:现在使用的版本为第三版本
    services:定义容器运行的服务
        image:引用现存镜像
        build:利用Dockerfile制作镜像
          context: ./dir
          dockerfile: Dockerfile-alternate
        restart:通知如果宿主机重启了,容器是否要重启
        volume:定义该服务的挂载的卷
        environment:定义运行该容器的环境变量
        depends_on:定义运行该容器的依赖关系
        ports:定义运行该容器与宿主机映射端口
    network:定义容器的网络
    volumes:定义卷的挂载

wordpress docker-compose示例

1. mkdir ~/wordpress
2. vim docker-compose.yml 
    version: '3.3'
    services:
      wordpress:
        depends_on:
          - db
        image: wordpress:lastest
        volumes:
          - wordpress_files:/var/www/html
        ports:
          - "80:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_NAME: wpdb
          WORDPRESS_DB_USER: wpuser
          WORDPRESS_DB_PASSWORD: wpuserpass
      db:
        image: mysql:5.7
        volumes: 
          - db_file:/var/lib/mysql 
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: centos
          MYSQL_DATABASE: wpdb
          MYSQL_USER: wpuser
          MYSQL_PASSWORD: wpuserpass
    volumes:
      wordpress_files:
      db_file: /data/webs
3. 使用docker-compose up启动
4. 启动之后使用docker ps 查看运行的容器