如何配置容器里的应用
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 查看运行的容器