docker 部署web应用简单上手

docker 部署web应用简单上手

Apr 05, 2024 ·
11 Min Read

此案例是基于腾讯云服务器 centos stream 8

🕛 step 1 安装docker

官方教程

官方介绍了很多种安装方法,我使用的是 Install using the repository 的

这里我就再贴下命令吧👇

Terminal window
## 设置存储库
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
## 安装docker引擎
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

🕒 step 2 设置docker容器

Terminal window
$ sudo systemctl start docker

这里使用的是 centos 最新版。of course 你也可以安装多个镜像,镜像在 docker 中被称为 image

Terminal window
$ sudo docker pull centos:latest

如果你需要外网可以访问,还需要把容器的端口映射到 宿主机上。

Terminal window
# 这里的意思是 把容器的80端口映射到宿主机的8080上,把宿主机 /data/web 映射到容器的 /data; 容器使用 centos:latest 这个映像创建
$ sudo docker run -it -p 8080:80 --name web -v /data/web:/data centos:latest /bin/bash
# 端口可以自定义,不一定按照上面的写,but要注意的是,不能多个容器映射到宿主机同一个端口

-p 用来映射端口;-v 用来映射目录,即可以把宿主机某个目录映射到容器中,方便日后文件管理,当然也可以不设置。

然后你就可以在里面做任何操作,就类似于直接在 宿主机 似的。

如何退出当前容器呢?

Terminal window
$ sudo exit
# or
ctrl + d
docker 常用命令

从 0 开始了解 Docker

Terminal window
# 查看docker 所有映像
$ docker images
# 查看docker 所有容器
$ docker ps
# 查看docker 当前运行中的容器
$ docker ps -a
# 进入已有容器
$ docker exec -it [container name] /bin/bash
# 删除容器
$ docker rm [container name]
# 启动容器
$ docker start [container name]
# 停止容器
$ docker stop [container name]
# 查询某个镜像
$ docker search [image name]

遇到的问题解决⁉️

  1. 在容器执行 vim 命令的时候,可能会报 bash vim: command not found

原因是少了一些包,执行 yum -y install vim-enhanced

  1. 第一次执行 nginx -s reload 时,可能会报 Nginx报错:nginx: [error] invalid PID number ““ in “/run/nginx.pid“

原因是你没启动过,执行 nginx -c /etc/nginx/nginx.conf

🕕 step 3 在 docker 容器中部署应用及连接

首先这里我使用的是 nginx

安装 nginx

Terminal window
$ sudo yum install nginx

配置容器 nginx

一般自定义配置都是放在 /etc/nginx/conf.d 目录下,文件使用 *.conf 格式。

也可以直接配置在 /etc/nginx/nginx.conf,但不推荐。

## 例如 blog.conf,基于上面的容器创建
server {
listen 80;
server_name localhost;
root /data/blog/data/;
location / {
# 多页面配置
index index.html
# 单页面配置
# try_files $uri /index.html;
}
}

重启 nginx 前建议使用 nginx -t 检测配置正确性,然后 nginx -s reload 进行重启。

退出容器,配置宿主机的 nginx

同理,重复上面两步操作,只是配置略有不同,利用反向代理 到本机的其他端口

# 定义一个 http 服务组
upstream blog_server {
# 指定时间内请求失败的最大次数,如10s内错5次就认为这个服务器不可用,需要冷却10s
server 127.0.0.1:8080 max_fails=5 fail_timeout=10s;
# 空闲连接最大值,超过则关闭使用最少得连接
keepalive 100;
# 连接保存开启的超时时间
keepalive_timeout 60;
}
server {
listen 443 ssl;
## 省略证书部分,详情可以查看我的 nginx 部署文章 —— Nginx部署ssl证书 踩坑
server_name xxx.com;
location / {
proxy_set_header X-Forwarded-Host $host;
# 通过代理将请求发送给 upstream 命名的 HTTP 服务
proxy_pass http://blog_server;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding gzip;
# 如开启 websocket 需要
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection upgrade;
}
}

Nginx部署ssl证书 踩坑

最后一步

  1. 上传应用文件到 宿主机 /data/web (前面容器已经做了目录映射)

  2. 重启 nginx -s reload

  3. 启动容器

Terminal window
$ sudo docker start web

访问 xxx.com ✔️✔️✔️大功告成🎉

🕚 思路解析

在第一次使用的时候我也是非常懵逼的,各种上网百度资料,问前辈们(不要觉得丢脸,学到就是赚到——某位老后端说的)请教。

玩一个东西,当然首先要了解它是什么?

docker 三大核心概念:Image、Container、Repository

因为 dockercontainer 是相互隔绝的,因此就可以用来部署多个应用而使用的环境不会相互污染。当然 docker 正在强大的用处不在于此。

第一步安装 docker 就没什么好说了,使用当然要安装。

第二步设置容器,你要部署应用需要什么环境,就在容器内部创建,可以理解为一台虚拟机。

第三步设置宿主机。不可能 80 端口就只能某个容器使用吧,比如你要部署多个应用,部署到不同的容器中,http 默认是 80 端口,若都设置在各自容器的 nginx 中(把 server_name 指向具体域名),那映射端口没法做呀。(😐表示本人踩过这坑)

因此需要把它们前置,放在宿主机的 nginx 配置中,然后监听到对应端口的对应 server_name, 就 proxy_pass 代理到对应的容器内即可;比如 proxy_pass http://127.0.0.1:8080, 因为在创建 docker 容器时,我们将容器的 80 端口映射到本机(宿主机)的 8080 端口,所以只需将匹配的请求代理到本机的 8080 端口,而容器内只需监听 80 端口即可获取得到。

扩展——docker compose

通过上面的实践,docker 部署一个应用需要执行那么多命令,又要下载这又要执行那…假如后期需要搬迁服务器时,又要重新来一遍(虽然不会常常发生),无疑效率是低下的。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。可以通过一个 YAML 文件来定义整个应用的服务、网络和卷等配置,可以很简单的管理整个应用。

如果按官方指令安装 docker(官方命令已包含 docker-compose-plugin 下载),此步骤可忽略。

Terminal window
# 更新包索引
yum update
# 安装
yum install docker-compose-plugin
# 或
$ sudo curl -L "<https://github.com/docker/compose/releases/download/v2.11.1/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 如果 嫌弃 github.com 国内访问很慢,可以使用国内镜像
# 将链接 <https://github.com> 替换成 <https://get.daocloud.io> 即可

检测docker compose 版本

Terminal window
docker compose version
docker compose版本
docker compose版本

注意

v1 版本的命令是 docker-compose

v2 版本的命令是 docker compose

配置 docker compose

首先创建好必要的目录,这一步只要在执行 docker compose 前完成即可。否则会启动失败!(📖 Linux 命令大全

目录结构可自行决定,待会记得在配置文件替换路径即可。 比如下文的 /data/blog/nginx/data/blog/data

Terminal window
# 创建 docker-compose.yml 配置文件
cd /
mkdir compose
cd ./compose
touch docker-compose.yml
# 编写配置
vim docker-compose.yml
# 老手跳过,小白请往下看
# 然后输入 i 进入插入模式
# 编辑结束后,按 ese 然后键入 : 输入 wq 回车,保存并退出
docker-compose.yml
version: "3.9"
services:
# 服务名,可自定义
docker_blog:
restart: always
# 使用的镜像,这里使用的是 nginx,上文使用的是 centos
image: nginx
# 容器名,可自定义
container_name: blog
# 端口映射 宿主机:容器,即容器的 80 端口映射到宿主机的 8080 端口上
ports:
- 8080:80
volumes:
# 挂载目录或者数据卷,格式和端口映射一样,前面的是 宿主机,后面的是容器地址,即容器读取某个路径,映射到 读取宿主机的某个路径上的文件
- /data/blog/nginx:/etc/nginx/conf.d
- /data/blog/data:/data
# 为了在容器可以使用 docker 命令
- /usr/bin/docker:/usr/bin/docker

配置文件对应转换为 docker 命令是

Terminal window
docker run -d \
--name blog \
--restart always \
-p 8080:80 \
-v /data/blog/nginx:/etc/nginx/conf.d \
-v /data/blog/data:/data \
nginx

只是这里补充多了一处 nginx 配置的映射,避免需要进入到容器设置的繁琐操作。

将上文提到的 blog.conf 文件放到宿主机 /data/blog/nginx,其余配置不变。

最后在 docker-compose.yml 文件目录下执行👇🏻

Terminal window
# 创建所有容器
docker compose up -d

默认创建完会自动启动,可以通过 docker compose ps 查看容器运行情况

容器运行情况
容器运行情况
docker compose 常用命令
Terminal window
# 启动某个容器(service_name 就是在配置文件服务名),不填则启动全部
docker compose start [service_name]
# 停止某个容器
docker compose stop [service_name]
# 根据配置生成某个容器
docker compose create [service_name]
# 创建并启动容器
docker compose up
# 移除某个容器
docker compose rm [service_name]
# 进入容器
docker compose exec [service_name] bash
Last edited Feb 15