-
Docker 入门及安装[Docker 系列-1]
-
Docker 容器基本操作[Docker 系列-2]
-
Docker 容器高级操作[Docker 系列-3]
-
Docker 镜像基本操作[Docker 系列-4]
-
DockerHub 与容器网络[Docker 系列-5]
-
Docker 数据卷操作[Docker 系列-6]
-
容器连接[Docker 系列-7]
本文以 jpress 这样一个开源网站的部署为例,向读者介绍 docker-compose 的使用。jpress 是 Java 版的 wordPress ,不过我们不必关注 jpress 的实现,在这里我们只需要将之当作一个普通的应用即可,完成该项目的部署工作。
准备工作
这里我们一共需要两个容器:
-
Tomcat
-
MySQL
然后需要 jpress 的 war 包,war 包地址:jpress
当然,这里的 jpress 并不是必须的,读者也可以结合自身情况,选择其他的 Java 项目或者自己写一个简单的 Java 项目部署都行。
编写 Dockerfile
Tomcat 容器中,要下载相关的 war 等,因此我这里编写一个 Dockerfile 来做这个事。在一个空的文件夹下创建 Dockerfile ,内容如下:
FROM tomcat
ADD https://github.com/JpressProjects/jpress/raw/alpha/wars/jpress-web-newest.war /usr/local/tomcat/webapps/
RUN cd /usr/local/tomcat/webapps/ \
&& mv jpress-web-newest.war jpress.war
解释:
-
容器基于 Tomcat 创建。
-
下载 jpress 项目的 war 包到 tomcat 的 webapps 目录下。
-
给 jpress 项目重命名。
编写 docker-compose.yml
在相同的目录下编写 docker-compose.yml ,内容如下(关于 yml 的基础知识,这里不做介绍,读者可以自行查找了解):
"3.1"
services:
web:
build: .
container_name: jpress
ports:
- "8080:8080"
volumes:
- /usr/local/tomcat/
depends_on:
- db
db:
image: mysql
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123
MYSQL_DATABASE: jpress
解释:
-
首先声明了 web 容器,然后声明db容器。
-
build.
表示 web 容器项目构建上下文为.
,即,将在当前目录下查找 Dockerfile 构建 web 容器。
-
container_name 表示容器的名字。
-
ports 是指容器的端口映射。
-
volumes 表示配置容器的数据卷。
-
depends_on 表示该容器依赖于 db 容器,在启动时,db 容器将先启动,web 容器后启动,这只是启动时机的先后问题,并不是说 web 容器会等 db 容器完全启动了才会启动。
-
对于 db 容器,则使用 image 来构建,没有使用 Dockerfile 。
-
restart 描述了容器的重启策略。
-
environment 则是启动容器时的环境变量,这里配置了数据库 root 用户的密码以及在启动时创建一个名为 jpress 的库,environment 的配置可以使用字典和数组两种形式。
OK,经过如上步骤,docker-compose.yml 就算配置成功了
运行
运行的方式有好几种,但是建议使用 up 这个终极命令,up 命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。对于大部分应用都可以直接通过该命令来启动。默认情况下, docker-compose up
启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试,通过 Ctrl-C 停止命令时,所有容器将会停止,而如果使用 docker-compose up-d
命令,则将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
因此,这里进入到 docker-compose.yml 所在目录下,执行如下命令:
docker-compose up -d
执行结果如下:
执行后,通过 docker-compose ps
命令可以看到容器已经启动了。