Docker入门与实战——实战案例(Web服务与应用)

实战案例(Web服务与应用)

1、Apache

作为一款具有高稳定性和商业级别的开源Web服务器软件,Apache在全球范围内的使用排名位居首位。得益于出色的跨平台兼容性和安全性表现,Apache已在众多平台和操作系统上得到广泛应用。作为受到软件基金会支持的项目,Apache自1995年发布以来,依靠完善且高效的开发者社区,始终秉持高标准进行项目的维护和开发。Apache一词来源于美国西南部一个印第安人部落的名称---阿帕奇族。

1.1、使用官方镜像

Docker Hub官方提供的Apache镜像名字为httpd。

编写Dockerfile文件,内容如下:

bash 复制代码
FROM httpd:2.4
COPY ./public-html /usr/local/apache2/htdocs/

创建项目目录public-html,并在此目录下创建index.html文件:

html 复制代码
<!DOCTYPE html>
<html>
	<body>
		<p>Hello,Docker!</p>
	</body>
</html>

构建自定义镜像:

bash 复制代码
docker build -t apache2-image .

构建完成后,使用docker [container] run指令运行镜像:

bash 复制代码
docker run -it --rm --name apache-container -p 80:80 apache2-image

通过浏览器访问本地的80端口,即可打开静态页面,如图所示。

读者也可以不创建自定义镜像,直接通过映射目录的方式运行Apache容器:

bash 复制代码
docker run -it --rm --name my-apache-app -p 80:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

再次打开浏览器,即可看到页面输出。如果读者希望进行参数配置,可以先从镜像中获取当前配置:

bash 复制代码
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf

然后可以通过COPY命令将自定义配置导入/usr/local/apache2/conf/httpd.conf:

bash 复制代码
FROM httpd:2.4
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf

如果希望配置SSL/HTTPS,可以使用COPY命令或-v参数将server.crt和server.key加载至/usr/local/apache2/conf/中,然后将/usr/local/acche2/conf/httpd.conf文件中的以下几行取消注释:

配置文件conf/extra/httpd-ssl.conf会读取上文配置的鉴权文件,同时监听443端口。运行docker run命令的时候,要记得添加-p 443:443端口映射配置。如果使用sed命令行工具,可以参考以下命令:

以上配置方式可用于开发环境配置,笔者建议针对生产环境定制conf文件,有关SSL设置的更多信息,请参阅httpd.apache.org。

1.2、使用自定义镜像

首先,创建一个apache_ubuntu工作目录,在其中创建Dockerfile文件、run.sh文件和sample目录:

bash 复制代码
mkdir apache_ubuntu && cd apache_ubuntu
touch Dockerfile run.sh
mkdir sample

下面是Dockerfile的内容和各个部分的说明:

bash 复制代码
FROM ubuntu:24.04
# 设置继承自用户创建的SSHD镜像

LABEL maintainer="yourname@example.com"
#创建者的基本信息

# 设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND=noninteractive

# 安装
RUN apt-get update
RUN apt-get -yq install apache2 tzdata && rm -rf /var/lib/apt/lists/*

RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
# 更改系统的时区设置

# 添加用户的脚本,并设置权限,这会福海之前放在这个位置的脚本
ADD run.sh /run.sh
RUN chmod 755 /*.sh

# 添加一个示例的Web站点,删除默认安装在apache文件夹下面的文件,并将用户添加的示例用软件链接到/var/www/html目录下面
RUN mkdir -p /var/lock/apache2 && mkdir /var/run/apache2 && mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/html

COPY sample/ /app

# 设置app相关的一些变量,在容器启动的时候可以使用-e参数替代
ENV APACHE_RUN_USER=www-data
ENV APACHE_RUN_GROUP=www-data
ENV APACHE_LOG_DIR=/var/log/apache2
ENV APACHE_PID_FILE=/var/run/apache2.pid
ENV APACHE_RUN_DIR=/var/run/apache2
ENV APACHE_LOCK_DIR=/var/locak/apache2
ENV APACHE_SERVERADMIN=admin@localhost
ENV APACHE_SERVERNAME=localhost
ENV APACHE_SERVERALLAS=docker.localhost
ENV APACHE_DOCUMENTROOT=/var/wwww

EXPOSE 80
WORKDIR /app
CMD ["/run.sh"]

此sample站点的内容为输出Hello Docker!。下面用户在sample目录下创建index.html文件,内容为:

html 复制代码
<!DOCTYPE html>
<html>
	<body>
		<p>Hello,Docker!</p>
	</body>
</html>

run.sh脚本内容也很简单,只是启动apache服务:

bash 复制代码
#! /bin/bash
exec apache2 -D FOREGROUND

此时,apache_ubuntu目录下面的文件结构为:

bash 复制代码
$ tree .
.
|-- Dockerfile
|-- run.sh
`-- sample
	  `-- index.html

1 directory, 3 files

下面开始创建apache:ubuntu镜像。

使用docker build命令创建apache:ubuntu镜像,注意命令最后的"."​:

bash 复制代码
docker build -t apache:ubuntu .

此时镜像已经创建成功了。用户可以使用docker images命令查看本地新增的apache:ubuntu镜像:

bash 复制代码
docker images | grep apache

接下来,使用docker run命令测试镜像。用户可以使用-P参数映射需要开放的端口(22和80端口)​:

bash 复制代码
docker run -d -P apache:ubuntu

$ docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS                   NAMES
b7687edb0244   apache:ubuntu   "/run.sh"   2 seconds ago   Up 2 seconds   0.0.0.0:55002->80/tcp   admiring_poincare

在本地主机上用curl抓取网页来验证刚才创建的sample站点:

用户可以通过映射本地目录的方式指定容器内Apache服务响应的内容,例如映射本地主机上当前目录下的www目录到容器内的/var/www目录:

bash 复制代码
docker run -i -d -p 80:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/var/www:ro apache:ubuntu

在当前目录内创建www目录,并放上自定义的页面index.html,内容为:

html 复制代码
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>Hi Docker</title>
</head><body>
<h1>Hi Docker</h1>
<p>How are you?</p>
<hr>
<address>Apache/2.4 (Ubuntu) Server at Port 80</address>
</body></html>

在本地主机上可访问测试容器提供的Web服务,查看获取内容为新配置的index.html页面信息。

1.3、相关资料

2、Nginx

Nginx是一款功能强大的开源反向代理服务器,能够支持HTTP、HTTPS、SMTP、POP3、IMAP等各种协议。除此之外,Nginx也可以充当负载均衡器、HTTP缓存或Web服务器。从诞生之初,Nginx就专注于优化高并发和高性能的应用环境。遵循类BSD开源协议,它能在Linux、BSD、Mac、Solaris、AIX等类UNIX系统上运行,并且也有专门为Windows系统移植的版本。

Nginx的特性如下:

  • 热部署:通过管理进程与工作进程的分离设计,支持热部署。在无须中断服务的情况下,可以升级版本,更新配置文件,或者更换日志文件等。
  • 高并发连接:Nginx能够毫不费力地支持超过100000的并发连接,理论上支持的并发连接数量上限取决于机器内存的大小。
  • 低内存消耗:通常情况下,10000个非活跃的HTTPKeep-Alive连接在Nginx中仅消耗2.5MB的内存,这也是Nginx能够支持高并发连接的重要基础。
  • 响应迅速:在正常情况下,Nginx可以为单次请求提供更快的响应。即使在流量高峰期,Nginx也能比其他Web服务器更快地响应请求。
  • 高可靠性:Nginx是一款高可靠性的Web服务器,许多网站都在使用Nginx,这足以证明其出色的可靠性。

2.1、使用官方镜像

用户可以使用docker run命令直接运行官方Nginx镜像:

bash 复制代码
docker run -d -p 80:80 --name webserver nginx

可以使用docker ps命令查看当前运行的容器:

bash 复制代码
$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                 NAMES
b911e3ad923b   nginx     "/docker-entrypoint...."   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, [::]:80->80/tcp   webserver

目前Nginx容器已经在0.0.0.0:80启动,并映射了80端口。打开浏览器访问此地址,即可看到Nginx输出的页面,如图所示。

也可以使用curl命令进行测试,如curl 127.0.0.1:80,命令行将会返回以下信息:

bash 复制代码
$ curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, nginx is successfully installed and working.
Further configuration is required for the web server, reverse proxy,
API gateway, load balancer, content cache, or other features.</p>

<p>For online documentation and support please refer to
<a href="https://nginx.org/">nginx.org</a>.<br/>
To engage with the community please visit
<a href="https://community.nginx.org/">community.nginx.org</a>.<br/>
For enterprise grade support, professional services, additional
security features and capabilities please refer to
<a href="https://f5.com/nginx">f5.com/nginx</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Nginx 1.9.8版本后的镜像支持debug模式,镜像包含nginx-debug,可以支持更丰富的log信息:

bash 复制代码
docker run --name my-nginx -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx nginx-debug -g 'daemon off;'

相应的docker-compose.yml配置如下:

yml 复制代码
web:
  image: nginx
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro
  command: [nginx-debug, '-g', 'daemon off;']

2.2、自定义Web页面

首先,新建index.html文件,内容如下:

html 复制代码
<html>
	<title>text</title>
	<body>
		<div>hello world</div>
	</body>
</html>

然后使用docker run命令运行,并将index.html文件挂载至容器中,即可看到显示自定义的页面:

bash 复制代码
docker run --name nginx-container -p 80:80 -v $(pwd)/index.html:/usr/share/nginx/html/index.html:ro -d nginx

另外,读者也可以使用Dockerfile来构建新镜像。Dockerfile内容如下:

bash 复制代码
FROM nginx
COPY ./index.html /usr/share/nginx/html

开始构建镜像my-nginx:

bash 复制代码
docker build -t my-nginx .

构建成功后执行docker [container] run命令:

bash 复制代码
docker run --name nginx-container -p 80:80 -d my-nginx

2.3、使用自定义Dockerfile

代码如下:

bash 复制代码
FROM ubuntu:24.04

#创建者信息
LABEL maintainer="yourname@example.com"

# 安装Nginx,设置Nginx以非daemon方式启动
RUN apt-get update && apt-get install -y nginx tzdata && rm -rf /var/lib/apt/lists/* 

RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf && chown -R www-data:www-data /var/lib/nginx

RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
# 注意这里要更改系统的时区设置

# 添加用户的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD run.sh /run.sh
RUN chmod 755 /*.sh

# 定义可以被挂载的目录,分别时虚拟主机的挂载目录、整数目录、配置目录、和日志目录
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx"]

#定义工作目录
WORKDIR /etc/nginx

# 定义输出命令
CMD ["/run.sh"]

# 定义输出端口
EXPOSE 80
EXPOSE 443

查看run.sh脚本文件内容

bash 复制代码
#! /bin/bash
/usr/sbin/nginx

使用docker build命令,创建镜像nginx:stable:

bash 复制代码
docker build -t nginx:stable .

启动容器,查看到内部的80端口被映射到本地的49193端口:

bash 复制代码
docker run -d -P nginx:stable

访问本地的49193端口:

bash 复制代码
CONTAINER ID   IMAGE          COMMAND     CREATED         STATUS         PORTS                                           NAMES
a3c4e19fd35c   nginx:stable   "/run.sh"   3 seconds ago   Up 2 seconds   0.0.0.0:55000->80/tcp, 0.0.0.0:55001->443/tcp   optimistic_brahmagupta

如果可以再次看到Nginx的欢迎页面,说明Nginx已经正常启动了。

2.4、参数优化

为了能充分发挥Nginx的性能,用户可对系统内核参数做一些调整。下面是一份常见的适合运行Nginx服务器的内核优化参数:

2.5、相关资源

3、Tomcat

Tomcat是一个由Apache软件基金会旗下Jakarta项目开发的Servlet容器,它严格按照Sun Microsystems的技术规范进行设计,从而实现了对Servlet和JavaServerPage(JSP)的全面支持。不仅如此,Tomcat还提供了一些专属于Web服务器的特性,包括Tomcat管理和控制平台、安全域管理以及Tomcat阀等。由于Tomcat自身内置了一个HTTP服务器,因此它也能够作为一个独立的Web服务器使用。

3.1、使用官方镜像

可以使用docker run命令运行官方镜像,并将容器端口8080映射到主机的8888端口:

bash 复制代码
docker run -it --rm -p 8888:8080 tomcat:11.0

可以通过本地浏览器访问http://localhost:8888或http://host-ip:8888来测试。

由于目前没有部署应用,因此浏览器会返回404页面,如图所示。官方镜像的默认配置如下:

3.2、相关资源

4、Jetty

Jetty是一个优秀的开源Web服务器和Servlet容器,以其高效、小巧、可嵌入式等优点广受欢迎,它是业界主流Java Web开源运行环境之一,还支持HTTP/2、WebSocket、OSGi、JMX、JNDI、JAAS等协议。Jetty基于Java语言编写,API以JAR包的形式发布。

相对老牌的Tomcat,Jetty的架构更合理,性能更优。尤其在启动速度上,它让Tomcat望尘莫及。Jetty目前在国内外互联网企业中应用广泛。

4.1、使用官方镜像

Docker Hub官方提供了Jetty镜像,读者可以直接通过docker run命令运行:

bash 复制代码
docker run -d jetty

使用docker ps命令查看运行中的Jetty容器:

bash 复制代码
$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
ff32d548e7ed   jetty     "/docker-entrypoint...."   15 seconds ago   Up 14 seconds   8080/tcp   distracted_joliot

当然,还可以使用-p参数映射运行端口:

bash 复制代码
docker run -d -p 80:8080 -p 443:8443 jetty

使用宿主机的浏览器访问container-ip:80,即可获得Jetty运行页面,由于当前未配置具体Java应用,因此页面会提示报错,如图所示。

4.2、环境配置

官方镜像中的默认Jetty环境配置为:

Jetty的服务器配置可以使用-list-config参数:

bash 复制代码
docker run -d jetty --list-config

也可以通过-module传入附加模块的配置:

bash 复制代码
docker run -d jetty --module=jmx jetty.threadPoll.maxThreads=500

如果将Jetty作为基础镜像,可以在Dockerfile中使用RUN指令开启附加模块:

bash 复制代码
FROM jetty
RUN java -jar "$JETTY_HOME/start.jar" --add-to-startd=jmx,stats

还可以通过/var/lib/jetty/start.d/*.ini文件来配置模块,也可以通过删除该文件来停用模块。

4.3、相关资源

5、LAMP

LAMP是一款备受青睐的Web开发工具套装,由以下部分构成:Linux操作系统,Apache网络服务器,MySQL数据库,以及Perl、PHP或Python编程语言。每一种组成工具都是已经证明其稳定性的开源软件,并且被众多网站广泛采用。与Java/J2EE架构相比,LAMP拥有丰富的Web资源,以及轻量、快速开发的优势。相对于微软的.NET架构,LAMP展现出了更为广泛的通用性、跨平台性,以及高性能和较低的成本。因此,LAMP软件套装在多种场景下被大量使用。

注意现在也有人用Nginx替换Apache,称为LNMP或LEMP,是类似的工具套装。

  • 1.使用官方镜像

    用户可以使用自定义Dockerfile或者Compose方式运行LAMP,同时社区也提供了成熟的linode/lamp和tutum/lamp镜像。

  • 2.使用linode/lamp镜像

    首先,执行docker [container] run命令,直接运行镜像,并进入容器内部bash shell:

    bash 复制代码
    docker run -it -p 80:80 linode/lamp /bin/bash

    在容器内部shell启动Apache以及MySQL服务:

    此时镜像中Apache、MySQL服务已经启动,可使用docker ps命令查看运行中的容器:

    此时通过浏览器访问本地80端口即可看到默认页面,如图所示。

  • 3.使用tutum/lamp镜像

    首先,执行`dockercontainerrun命令,直接运行镜像:

    容器启动成功后,打开浏览器,访问demo页面,如图所示。

  • 4.部署自定义PHP应用

    默认的容器启动了一个hello world应用。读者可以基于此镜像,编辑Dockerfile来创建自定义LAMP应用镜像。

    在宿主机上创建新的工作目录lamp:

    在php目录下创建Dockerfile文件,内容为:

    创建镜像,命名为my-lamp-app:

    利用新创建的镜像启动容器,注意启动时指定-d参数,让容器在后台运行:

    在本地主机上使用curl命令测试应用程序是不是已经正常响应。

  • 5.相关资料

6、CMS

内容管理系统(Content Management System,CMS)是一个提供内容编辑服务的平台软件。CMS使用户能够轻松发布、修改和管理各种类型的数字内容,主要包括文本和图像。在接下来的内容中,笔者将以两款流行的CMS软件---WordPress和Ghost为例,详述如何使用它们的Docker镜像。

6.1、WordPress

WordPress是一款在全球广受欢迎的开源CMS,被广泛应用于博客、企业官网、产品首页等多种内容相关的平台。它采用了GPLv2协议,值得注意的是,它已成为网络上超过43%的网站的首选平台。此外,还有许多类似的项目,如Drupal、Joomla、Typo3等。

WordPress基于PHP和MySQL构建,其架构设计简洁明了。它支持各种主题、插件和功能模块,更引人注目的是,WordPress拥有庞大的用户社区,其在线资源丰富多样。而且,WordPress在各大网络服务商和云平台中得到广泛的支持和应用。

使用官方镜像

可以使用docker run命令直接运行官方WordPress镜像:

bash 复制代码
docker run --name my-wordpress -p 8089:80 -d wordpress

可以使用-link命令配置WordPress连接的MySQL数据库:

bash 复制代码
docker run --name my-wordpress --link my-mysql:mysql -d wordpress

容器启动成功后,读者可在浏览器中访问http://localhost:8089或http://host-ip:8089来打开WordPress初始化页面,如图所示。

6.2、Ghost

Ghost是一个广受欢迎的开源博客平台,使用JavaScript编写,以MIT协议发布。它的设计非常简约,使用起来体验优异,非常适合做内容发布,故而受到很多极客或技术工作者的喜爱。

  • 1.使用官方镜像

    可以使用docker run命令直接运行官方Ghost镜像。

    bash 复制代码
    docker run -d --name some-ghost -e NODE_ENV=development -e url=http://localhost:3001 -p 3001:2368 ghost

    容器启动后,读者可以通过http://localhost:3001或http://IP:3001访问Ghost管理界面,如图所示。初次访问会跳转至http://IP:3001/ghost/#/setup。这里的IP指容器的公网IP。

    此外,读者还可以通过-v命令挂载已有的内容到Ghost容器内,如下所示,这里可以使用Ghost官方提供的基于Alpine的镜像。

    注意,database__connection__filename仅在开发模式下有效,这里指向SQLite数据库文件的位置。如果读者希望在生产环境中使用Ghost,则需要使用外部MySQL服务器,如下面的docker-compose.yml示例所示:

  • 2.相关资源

相关推荐
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker 架构拆解:镜像、容器、守护进程与 Registry
java·docker·架构
java_logo2 小时前
Docker 部署 OpenViking:轻松搭建 AI Agent 上下文数据库平台
数据库·人工智能·docker·agent·火山引擎·openviking·轩辕镜像
a5986522 小时前
Docker云手机搭建挂机环境,外网远程访问完整实操
docker·容器·智能手机·云手机
夜之眷属2 小时前
服务启动即崩:InetAddress.getLocalHost() 抛 UnknownHostException 排查记
java·运维·后端·docker
郭老二3 小时前
【docker】使用阿里云的容器镜像服务(ACR)构建自己的容器仓库
阿里云·docker·容器
Wang's Blog6 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
AIGC大时代7 小时前
LLM Agent 执行沙箱闸门:失败含义与当天最小实验
docker·沙箱·闸门·bubblewrap·llm agent
灯澜忆梦8 小时前
【docker】#2 | 基础命令
docker·容器·eureka