docker 部署web应用简单上手
此案例是基于腾讯云服务器 centos stream 8
🕛 step 1 安装docker
官方介绍了很多种安装方法,我使用的是 Install using the repository 的
这里我就再贴下命令吧👇
## 设置存储库
$ 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
$ sudo systemctl start docker
- 安装镜像(在 dockerhub 找到你需要的镜像)
这里使用的是 centos
最新版。of course 你也可以安装多个镜像,镜像在 docker
中被称为 image
。
$ sudo docker pull centos:latest
- 创建容器并进入
如果你需要外网可以访问,还需要把容器的端口映射到 宿主机上。
# 这里的意思是 把容器的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
用来映射目录,即可以把宿主机某个目录映射到容器中,方便日后文件管理,当然也可以不设置。
然后你就可以在里面做任何操作,就类似于直接在 宿主机 似的。
如何退出当前容器呢?
$ sudo exit
# or
ctrl + d
docker 常用命令
# 查看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]
遇到的问题解决⁉️
- 在容器执行
vim
命令的时候,可能会报bash vim: command not found
原因是少了一些包,执行 yum -y install vim-enhanced
- 第一次执行
nginx -s reload
时,可能会报Nginx报错:nginx: [error] invalid PID number ““ in “/run/nginx.pid“
原因是你没启动过,执行 nginx -c /etc/nginx/nginx.conf
🕕 step 3 在 docker 容器中部署应用及连接
首先这里我使用的是 nginx
安装 nginx
$ 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;
}
}
最后一步
上传应用文件到 宿主机
/data/web
(前面容器已经做了目录映射)重启
nginx -s reload
启动容器
$ sudo docker start web
访问 xxx.com ✔️✔️✔️大功告成🎉
🕚 思路解析
在第一次使用的时候我也是非常懵逼的,各种上网百度资料,问前辈们(不要觉得丢脸,学到就是赚到——某位老后端说的)请教。
玩一个东西,当然首先要了解它是什么?
docker 三大核心概念:Image、Container、Repository。
- Image 镜像,好比 window 的映像。
- Container 容器,依赖于镜像,可以比喻成沙盒。
- Repository 仓库,可以保存构建完的镜像。
因为 docker
的 container
是相互隔绝的,因此就可以用来部署多个应用而使用的环境不会相互污染。当然 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
下载),此步骤可忽略。
# 更新包索引
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 版本
docker compose version
注意
v1 版本的命令是 docker-compose
v2 版本的命令是 docker compose
配置 docker compose
首先创建好必要的目录,这一步只要在执行 docker compose
前完成即可。否则会启动失败!(📖 Linux 命令大全)
目录结构可自行决定,待会记得在配置文件替换路径即可。 比如下文的 /data/blog/nginx
和 /data/blog/data
。
# 创建 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 命令是
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
文件目录下执行👇🏻
# 创建所有容器
docker compose up -d
默认创建完会自动启动,可以通过 docker compose ps
查看容器运行情况。
docker compose 常用命令
# 启动某个容器(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