Docker 容器编排利器 Docker Compose( 三 )


接下来我们来个稍微复杂点的练习 , 通过基础镜像 centos:7 , 在该镜像中安装 jdk 和 Tomcat 以后将其制作为一个新的镜像 mycentos:7 。
创建目录并编写 Dockerfile 文件 。
 # 创建目录 mkdir -p /usr/local/docker-centos # 切换至指定目录 cd /usr/local/docker-centos/ # 编写 Dockerfile 文件 vi DockerfileDockerfile 文件内容如下:
 # 指明构建的新镜像是来自于 centos:7 基础镜像 FROM centos:7 # 通过镜像标签声明了作者信息 LABEL maintainer="mrhelloworld.com" # 设置工作目录 WORKDIR /usr/local # 新镜像构建成功以后创建指定目录 RUN mkdir -p /usr/local/JAVA && mkdir -p /usr/local/tomcat # 拷贝文件到镜像中并解压 ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java ADD Apache-tomcat-9.0.37.tar.gz /usr/local/tomcat # 暴露容器运行时的 8080 监听端口给外部 EXPOSE 8080 # 设置容器内 JAVA_HOME 环境变量 ENV JAVA_HOME /usr/local/java/jdk-11.0.6/ ENV PATH $PATH:$JAVA_HOME/bin # 启动容器时启动 tomcat 并查看 tomcat 日志信息 CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh", "run"]【Docker 容器编排利器 Docker Compose】将所需的资源包 jdk 和 tomcat 上传至 Dockerfile 同一目录 。

Docker 容器编排利器 Docker Compose

文章插图
 
创建目录并编写 docker-compose.yml 文件 。
 # 描述 Compose 文件的版本信息 version: "3.8" # 定义服务 , 可以多个 services: mycentos: # 服务名称   build: . # 相对当前 docker-compose.yml 文件所在目录 , 基于名称为 Dockerfile-alternate 的文件构建镜像   container_name: mycentos7 # 容器名称 , 默认为"工程名称_服务条目名称_序号"   ports: # 宿主机与容器的端口映射关系     - "8080:8080" # 左边宿主机端口:右边容器端口然后通过 dokcer-compose 相关命令即可完成容器的创建 , 停止或删除等一系列操作 。
context
该选项可以是 Dockerfile 文件的绝对/相对路径 , 也可以是远程 Git 仓库的 URL , 当提供的值是相对路径时 , 相对当前 docker-compose.yml 文件所在目录 。
 build: context: . # 相对当前 docker-compose.yml 文件所在目录 , 基于名称为 Dockerfile 的文件构建镜像
dockerfile
一般情况下 , 默认都基于文件名叫 Dockerfile 的文件构建镜像 , 当然也可以是自定义的文件名 , 使用 dockerfile 声明 , 不过这个选项只能声明文件名 , 文件所在路径还是要通过 centext 来声明 。
 build: context: . # 相对当前 docker-compose.yml 文件所在目录 dockerfile: Dockerfile-alternate # 基于名称为 Dockerfile-alternate 的文件构建镜像
container_name
Compose 创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号 。如果要使用自定义名称 , 使用 container_name 声明 。
 services: mycentos:   build: .   container_name: mycentos7 # 容器名称 , 默认为"工程名称_服务条目名称_序号"
因为 Docker 容器名称必须是唯一的 , 所以如果指定了自定义名称 , 就不能将服务扩展至多个容器 。这样做可能会导致错误 。

关于序号
序号是干什么用的呢 , 看下面这个例子你就懂了 , docker-compose.yml 文件内容如下:
 # 描述 Compose 文件的版本信息 version: "3.8" # 定义服务 , 可以多个 services: helloworld: # 服务名称   image: hello-world
然后通过 --scale 指定 helloworld 服务一次性启动 3 个 。
 docker-compose up -d --scale helloworld=3
通过下图可以看到有 3 个容器被创建 , 容器名称最后的序号是从 1 开始累加的 , 这就是序号的作用 。所以如果指定了自定义名称 , 就不能将服务扩展至多个容器 。
Docker 容器编排利器 Docker Compose

文章插图
 
depends_on
使用 Compose 最大的好处就是敲最少的命令做更多的事情 , 但一般项目容器启动的顺序是有要求的 , 如果直接从上到下启动容器 , 必然会因为容器依赖问题而启动失败 。例如在没有启动数据库容器的情况下启动了 Web 应用容器 , 应用容器会因为找不到数据库而退出 。depends_on 就是用来解决容器依赖、启动先后问题的配置项 。


推荐阅读