Docker——容器化部署(进阶篇)
Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本(Dockerfile就相当于用(多条)指令来说明要执行什么操作来构建镜像的文件)。
Dockerfile通过指令构建镜像,过程就相当于Docker内部容器多次提交形成镜像
大致流程:
常用保留字指令
每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
指令执行时期:
Build | Run | Both |
---|---|---|
FROM | CMD | WORKDIR |
MAINTAINER | ENV | USER |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
ONBUILD |
FROM
基础镜像,作为Dockerfile的首条指令。表明当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板。
MAINTAINER
镜像维护者的姓名和邮箱地址。
RUN
容器构建时需要运行的命令。主要用于执行Linux的shell命令,一般是安装过程的命令。
主要有两种格式:
- shell格式:
RUN <命令行命令>
示例:
1 | RUN yum -y install vim |
- exec格式:
RUN ["可执行文件","参数1","参数2"]
示例:
1 | RUN ["./ahzoo.java","dev","offline"] |
EXPOSE
当前容器对外暴露出的端口。
WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。
USER
指定该镜像通过什么用户去执行,如果都不指定,默认为root。
ENV
用来在构建镜像过程中设置环境变量。
示例:
1 | ## 配置一个环境变量 |
ADD
将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
COPY
类似ADD
,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置
格式:COPY 原路径 目标路径
VOLUME
容器数据卷,用于数据保存和持久化工作。
CMD
指定容器启动时要运行的命令。
CMD
是在docker run时运行,RUN
是在docker build时运行。
Dockerfile 中可以有多个CMD
指令,但只有最后一个生效。CMD
会被 docker run 之后的参数替换。
和RUN命令相似,同样支持两种格式:
- shell格式:
CMD <命令行命令>
- exec格式:
CMD ["可执行文件","参数1","参数2"]
ENTRYPOINT
用来指定一个容器启动时要运行的命令。
类似于CMD
指令,可以有多个ENTRYPOINT
令,但只有最后一个生效。不同的是ENTRYPOINT
不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给ENTRYPOINT
指令指定的程序。
格式:ENTRYPOINT ["可执行文件","参数1","参数2"]
当指定了ENTRYPOINT
后,CMD
的含义就发生了变化。不再是直接运行其命令,而是将CMD
的内容作为参数传递给ENTRYPOINT
指令:
示例:
1 | FROM nginx |
自定义容器
自定义centos容器
示例:构建一个带vim和ifconfig以及java8的centos容器
编写Dockerfile
编写一个Dockerfile(需要先准备一个linux版本的jdk文件)。
示例:
1 | vim Dockerfile |
1 | #基于centos7构建 |
构建
格式:docker build -t 新镜像名字:TAG <**上下文路径/网址>**
可以用
.
表示当前路径
示例:
1 | docker build -t centosjava8:3.5 . |
运行
示例:
1 | docker run -it centosjava8:3.5 |
构建Java项目容器
和构建自定义的centos容器是一样的。
Dockerfile示例:
1 | FROM java:8 |
虚悬镜像
仓库名、标签都是
<none>
的镜像,俗称虚悬镜像(dangling image)。一般在构建或删除和修改失败时出现,没有任何价值,可以直接删除。
1 | # 查看虚悬镜像 |
Docker 网络
Compose(容器编排)
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
安装DockerCompose
下面示例的为使用二进制包方式安装:
1 | #安装 |
设置自动补全命令:
1 | # 补全命令 |
卸载:
1 | # 二进制包方式安装的,直接删除文件即可 |
使用
docker compose文件常用属性
compose文件语法详情可以参考官方文档
serivces
顶级属性,用于定义一个所有需要运行的服务。
如果用于创建当前服务镜像的Dockerfile文件不是默认名称,则需要 build
下的 context
属性指定Dockerfile 的路径。
示例:
1 | build: |
image
用户指定当前服务所需要使用的镜像,这个镜像可以是本地镜像,也可以是远程镜像仓库中的镜像(会自动 pull)。
如果设置了 build,此时再设置的 image 属性即为构建出的镜像的名称与 Tag。
ports
将容器内应用端口绑定到主机端口,若不写映射,则容器启动时会将容器内端口随机绑定到主机端口。可以是配置多个端口映射。
1 | ports: |
volumes
映射容器数据卷,可以配置多个映射。
示例:
1 | db: |
depends_on
用于指定当前服务的启动所依赖的应用名称。参数可以是多个服务,指定的服务会先于当前服务启动。
command
用于覆盖 Dockerfile 中的 CMD 指令内容,即启动该服务容器后立即运行的命令。如果直接按照 Dockerfile 中的 CMD 指令内容执行即可,则compose 文件中无需该 command 属性。
编写docker compose文件
1 | # 创建docker-compose.yml文件,并编写 |
示例:
1 |
|
以nginx为例:根据文件中的地址路径,创建nginx配置文件
1 | -p表示创建父级路径 |
在./nginx/conf.d路径下,编写nginx配置文件nginx.conf
文件:
1 | cd ./nginx/conf.d |
1 | server { |
注意将 mysql 与 redis 的主机名修改为它们相应服务的名称。
即:
1 | ... |
启动docker compose
回到docker-compose.yml
的根路径,并启动docker-compose
1 | docker-compose up |
常用命令
docker-compose -h
# 查看帮助docker-compose up
# 启动所有docker-compose服务docker-compose up -d
# 启动所有docker-compose服务并后台运行docker-compose down
# 停止并删除容器、网络、卷、镜像。docker-compose exec [yml里面的服务id]
# 进入容器实例内部docker-compose exec docker-compose.yml
文件中写的服务id/bin/bash
docker-compose ps
# 展示当前docker-compose编排过的运行的所有容器docker-compose top
# 展示当前docker-compose编排过的容器进程docker-compose logs [yml里面的服务id]
# 查看容器输出日志docker-compose config
# 检查配置docker-compose config -q
# 检查配置,有问题才有输出docker-compose restart
# 重启服务docker-compose start
# 启动服务docker-compose stop
# 停止服务