Dockerfile文件格式
# 基础镜像,tag不写默认为latest
# 只能写一次
FROM <image>
FROM <image>:<tag>
# example
# FROM centos
# 作者信息name一般为邮箱
MAINTAINER <name>
# example
# MAINTAINER zhima<1158778689@qq.com>
# 设置镜像的元数据标签信息
LABEL <info>
# example
# LABEL version="1.0"
# LABEL description="this is description"
# 设置环境变量
ENV <key> <value>
ENV <key>=<value> <key>=<value> ...
# example
# ENV DIRPATH /path
# 设置运行RUN CMD ENTRYPOINT的用户名
USER <userName>
USER <UID>
# 设置工作目录
# 对RUN,CMD,ENTRYPOINT,COPY,ADD生效
# 如果不存在则会创建
WORKDIR 镜像内地址
# example
# 使用$读取环境变量
# WORKDIR $DIRPATH
# 定义变量
# 在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数
ARG <name>[=<default value>]
# 为子镜像设置命令
# 当本镜像作为其他容器的基础镜像的时候,INSTRUCTION会在子镜像运行的时候执行
ONBUILD [INSTRUCTION]
# example
# ONBUILD RUN ls -al
# 添加文件到镜像
# source可写
# 宿主机的绝对路径
# 本Dockerfile所在目录的相对路径
# url,如果使用url,则此ADD相当于wget
# source如果是压缩包,则会自动解压
ADD <source> <dest>
# 复制文件到镜像中
# COPY的<source>只能是本地文件,其他用法与ADD一致
COPY <source> <dest>
# 在**构建**镜像的时候运行的命令,一般是安装命令
RUN <command>
RUN ["executable","param1"]
# example
# RUN yum install -y gcc
# 下面三行RUN命令是为了解决以下这个错误的
# Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
# RUN cd /etc/yum.repos.d/
# RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
# RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# 暴露容器运行时的监听端口给外部
EXPOSE <port>
# 但是EXPOSE并不会使容器访问主机的端口
# 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -p参数
# 数据卷
# 这种是匿名数据卷 宿主机会在/var/lib/docker/volumes下生成一个随机命名的目录
# 可以在运行容器的时候,指定挂载卷的名字
# -v 卷名:镜像内想要被挂载的地址2
VOLUME ["镜像内想要被挂载的地址1","镜像内想要被挂载的地址2"]
VOLUME "镜像内想要被挂载的地址1" "镜像内想要被挂载的地址2"
# 容器**运行**的时候运行的命令
CMD <command>
CMD ["executable","param1"]
# example
# CMD ["cd","/usr/local"]
# CMD cd /usr/local
# 容器运行的时候运行的命令
ENTRYPOINT java -jar demo.jar
ENTRYPOINT ["java","-jar","demo.jar"]
# ENTRYPOINT和CMD的区别
# 不同之处
# 1.ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
# 2.如果我们在Dockerfile种同时写了ENTRYPOINT和CMD
# 并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
# 3.docker run image <参数>
# 传入的参数会追加在ENTRYPOINT之后
# 如果是CMD,会直接覆盖此CMD
# 相同之处
# 只能写一条,如果写了多条,那么只有最后一条生效
# 容器启动时才运行
# 如果我们在Dockerfile种同时写了ENTRYPOINT和完整的CMD,ENTRYPOINT一定会执行,CMD不会执行
Docker-compose文件格式
# 指定compose版本,一般3.1就可以了
version: '3.1'
# 服务列表
services:
# 自定义服务名
service_name1:
# 使用docker build构建镜像
# Dockerfile的地址
build:
context: .
dockerfile: custom-Dockerfile
# 如果dockerfile文件名就叫Dockerfile,则可以使用简写模式
# build: .
# 如果有build则是指定构建出来的镜像的镜像名
# 如果没有build则是指定运行的镜像
image: <imageName>:<tag>
# 指定运行容器的名称
container_name: <container_name>
# 容器卷技术
volumes:
- /usr/local/mysql # 匿名挂载
- VolumeName:/home/zhima #具名挂载
- /temp/mysql/config:/etc/mysql/conf.d # 宿主机挂载
# 端口映射
ports:
- "宿主机端口:容器端口"
# 运行容器的时候的参数
command: [
"param1",
"param2"
]
# 指定加入的网络
networks:
- network1
- network2
# 第二个服务
service_name2:
# 使用构建好的镜像
image: <imageName>:<tag>
stdin_open: true # 类似于docker run -d
tty: true # 类似于docker run -t
depends_on:
- service_name1
networks:
network1:
driver: bridge
network2:
driver: bridge