手把手教你用 Docker 部署网站[Docker 系列-8]

大家好,我是本周的值班编辑 江南一点雨 ,本周将由我为大家排版并送出技术干货,大家可以在公众号后台回复“java”,获得作者 Java 知识体系/面试必看资料。


在实际的开发环境或者生产环境,容器往往都不是独立运行的,经常需要多个容器一起运行,此时,如果继续使用 run 命令启动容器,就会非常不便,在这种情况下,docker-compose 是一个不错的选择,使用 docker-compose 可以实现简单的容器编排,本文就来看看 docker-compose 的使用。

本文是 Docker 系列第八篇,阅读前面的文章,有助于更好的理解本文:


  1. Docker 入门及安装[Docker 系列-1]

  2. Docker 容器基本操作[Docker 系列-2]

  3. Docker 容器高级操作[Docker 系列-3]

  4. Docker 镜像基本操作[Docker 系列-4]

  5. DockerHub 与容器网络[Docker 系列-5]

  6. Docker 数据卷操作[Docker 系列-6]

  7. 容器连接[Docker 系列-7]


本文以 jpress 这样一个开源网站的部署为例,向读者介绍 docker-compose 的使用。jpress 是 Java 版的 wordPress ,不过我们不必关注 jpress 的实现,在这里我们只需要将之当作一个普通的应用即可,完成该项目的部署工作。

准备工作

这里我们一共需要两个容器:

  • Tomcat

  • MySQL

然后需要 jpress 的 war 包,war 包地址:jpress

当然,这里的 jpress 并不是必须的,读者也可以结合自身情况,选择其他的 Java 项目或者自己写一个简单的 Java 项目部署都行。

编写 Dockerfile

Tomcat 容器中,要下载相关的 war 等,因此我这里编写一个 Dockerfile 来做这个事。在一个空的文件夹下创建 Dockerfile ,内容如下:

  1. FROM tomcat

  2. ADD https://github.com/JpressProjects/jpress/raw/alpha/wars/jpress-web-newest.war /usr/local/tomcat/webapps/

  3. RUN cd /usr/local/tomcat/webapps/ \

  4. && mv jpress-web-newest.war jpress.war

解释:

  1. 容器基于 Tomcat 创建。

  2. 下载 jpress 项目的 war 包到 tomcat 的 webapps 目录下。

  3. 给 jpress 项目重命名。

编写 docker-compose.yml

在相同的目录下编写 docker-compose.yml ,内容如下(关于 yml 的基础知识,这里不做介绍,读者可以自行查找了解):

  1. version: "3.1"

  2. services:

  3. web:

  4. build: .

  5. container_name: jpress

  6. ports:

  7. - "8080:8080"

  8. volumes:

  9. - /usr/local/tomcat/

  10. depends_on:

  11. - db

  12. db:

  13. image: mysql

  14. container_name: mysql

  15. command: --default-authentication-plugin=mysql_native_password

  16. restart: always

  17. ports:

  18. - "3306:3306"

  19. environment:

  20. MYSQL_ROOT_PASSWORD: 123

  21. MYSQL_DATABASE: jpress

解释:

  1. 首先声明了 web 容器,然后声明db容器。

  2. build. 表示 web 容器项目构建上下文为 . ,即,将在当前目录下查找 Dockerfile 构建 web 容器。

  3. container_name 表示容器的名字。

  4. ports 是指容器的端口映射。

  5. volumes 表示配置容器的数据卷。

  6. depends_on 表示该容器依赖于 db 容器,在启动时,db 容器将先启动,web 容器后启动,这只是启动时机的先后问题,并不是说 web 容器会等 db 容器完全启动了才会启动。

  7. 对于 db 容器,则使用 image 来构建,没有使用 Dockerfile 。

  8. restart 描述了容器的重启策略。

  9. environment 则是启动容器时的环境变量,这里配置了数据库 root 用户的密码以及在启动时创建一个名为 jpress 的库,environment 的配置可以使用字典和数组两种形式。

OK,经过如上步骤,docker-compose.yml 就算配置成功了

运行

运行的方式有好几种,但是建议使用 up 这个终极命令,up 命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。对于大部分应用都可以直接通过该命令来启动。默认情况下, docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试,通过 Ctrl-C 停止命令时,所有容器将会停止,而如果使用 docker-compose up-d 命令,则将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

因此,这里进入到 docker-compose.yml 所在目录下,执行如下命令:

  1. docker-compose up -d


执行结果如下:

执行后,通过 docker-compose ps 命令可以看到容器已经启动了。

初始化配置

接下来,浏览器中输入 http://localhost:8080/jpress ,就可以看到 jpress 的配置页面,如下:

根据引导页面配置数据库的连接信息以及网站的基本信息:


注意:由于 mysql 和 web 都运行在容器中,因此在配置数据库地址时,不能写回环地址,否则就去 web 所在的容器里找数据库了

配置完成后,运行如下命令,重启 web 容器:

  1. docker restart jpress

测试

浏览器中分别查看博客首页以及后台管理页,如下图:


其他

如果想要停止容器的运行,可以执行如下命令:

  1. docker-compose down

总结

本文主要向大家介绍了简单的容器编排,专业的或者大型项目的容器编排需要结合 K8s 来做,我们后面有机会再向大家介绍。

参考资料:

[1] 曾金龙,肖新华,刘清.Docker开发实践[M].北京:人民邮电出版社,2015.

作者简介:

江南一点雨,《Spring Boot + Vue 全栈开发实战》作者,一个认真的程序员~

精彩回顾:

面试中的Spring,我们该怎么去回答

聊聊面试中的过滤器与拦截器

你竟然没用 Maven 构建项目?

强烈推荐:

《Java 极客技术》知识星球限时优惠,现在加入只需 50 元,仅限前 1000 名,机不可失时不再来。长按识别下面的二维码即可加入,趁早行动吧!



隆重介绍:

Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。