Skip to content

docker 部署web应用简单上手

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

🕛 step 1 安装docker

官方教程

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

这里我就再贴下命令吧👇

bash
## 设置存储库
$ 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容器

  • 设置之前肯定需要先启动 docker
bash
$ sudo systemctl start docker
  • 安装镜像(在 dockerhub 找到你需要的镜像)

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

bash
$ sudo docker pull centos:latest
  • 创建容器并进入

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

bash
# 这里的意思是 把容器的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 用来映射目录,即可以把宿主机某个目录映射到容器中,方便日后文件管理,当然也可以不设置。

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

如何退出当前容器呢?

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

从 0 开始了解 Docker

bash
# 查看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

bash
$ sudo yum install nginx

配置容器 nginx

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

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

nginx
## 例如 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

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

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. 启动容器

bash
$ sudo docker start web

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

🕚 思路解析

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

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

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

  • Image 镜像,好比 window 的映像。
  • 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 文件来定义整个应用的服务、网络和卷等配置,可以很简单的管理整个应用。

INFO

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

bash
# 更新包索引
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 版本

bash
docker compose version

docker compose版本

注意

v1 版本的命令是 docker-compose

v2 版本的命令是 docker compose

配置 docker compose

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

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

bash
# 创建 docker-compose.yml 配置文件
cd /
mkdir compose
cd ./compose
touch docker-compose.yml
# 编写配置
vim docker-compose.yml
# 老手跳过,小白请往下看
# 然后输入 i 进入插入模式
# 编辑结束后,按 ese 然后键入 : 输入 wq 回车,保存并退出
yaml
# 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 命令是

bash
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 文件目录下执行👇🏻

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

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

容器运行情况

docker compose 常用命令
bash
# 启动某个容器(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

Released under the MIT License.