Docker 完成作坊式部署私活级别 Golang 程序 0x02:Docker 部署应用
在上一小节,我们使用 bat 脚本完成了服务的部署,那么在这一些小节我们将搭建 Nginx 来反向代理我们的 golang 应用,既然是私活级的项目,那肯定是越快上线越好,使用 Docker 我们可以快速上线各类应用。
使用 alpine 镜像启动 Golang 应用程序
上一节我们在构建Golang 的时候使用了 alpine3.16 那么我们在打包 Golang 镜像的时候最好与打包镜像保持一致,防止有冲突。
[root@localhost conf]# docker pull alpine:3.16
3.16: Pulling from library/alpine
213ec9aee27d: Already exists
Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad
Status: Downloaded newer image for alpine:3.16
docker.io/library/alpine:3.16
[root@localhost conf]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 2d389e545974 2 weeks ago 142MB
golang 1.18.6-alpine3.16 b68eed002951 3 weeks ago 328MB
alpine 3.16 9c6f07244728 7 weeks ago 5.54MB
nginx 1.19-alpine a64a6e03b055 17 months ago 22.6MB
因为我们在上一节的构建镜像使用的就是 3.16 所以在 docker pull 的时候就直接用了本地的 layer,从此就可以看到 docker 的强大,并且 alpine 体积足够小只有5.54 MB。
接下来我们使用 docker 来运行 api-server。
docker run --name api-server -d -v /data/server/api-server/:/app -w /app alpine:3.16 ./ser
ver
一个在线生成 Nginx 配置的网站
it.baiked.com 提供了一个可以快速生成 nginx 配置的工具,点击链接进行调转。
首先,nginx 配置这个东西是很基础的,所有的开发者都应该去学习,但是这个东西如果在你已经会用了的情况下,还是能够给我们的日常工作一些帮助。
我们先将隐藏 nginx 版本点选,然后修改配置文件路径 /etc/nginx/nginx.conf,点击增加server。
在 server 中修改我们的域名,注意在规则中,我们将其设置为了 api/ 然后对程序部署目录和根目录进行修改,最后点击生成。
生成好的 config,如下:
# Generated by xubo it.baiked.com
user nginx;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
multi_accept on;
worker_connections 65535;
}
http {
charset utf-8;
tcp_nopush on;
server_tokens off;
types_hash_max_size 2048;
client_max_body_size 1M;
# MIME
include mime.types;
default_type application/octet-stream;
# logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
# load configs
include /etc/nginx/conf.d/*.conf;
# sihuo.maksim.website
server {
listen 80;
listen [::]:80;
server_name sihuo.maksim.website;
set $base /usr/share/nginx;
root $base/html;
# api/
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
安装 Nginx
我们需要将上面生成好的 nginx.conf 映射到 /etc/nginx/nginx.conf 中。
[root@localhost ~]# docker pull nginx:1.19-alpine
[root@localhost ~]# docker run --name nginx -d -v /data/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -p 80:80 nginx:1.19-alpine
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
创建网络,让两个容器间进行通信
[root@localhost api-server]# docker network create -d bridge network-bridage
[root@localhost api-server]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e7f6b718f7dd bridge bridge local
7f0c4539817b host host local
1ea2a74e9f5c network-bridage bridge local
1366058279d2 none null local
[root@localhost api-server]# docker network connect network-bridage api-server
[root@localhost api-server]# docker network connect network-bridge nginx-server
我们使用docker inspect 来查看容器的IP
[root@localhost api-server]# docker inspect api-server
"network-bridage": {
"IPAMConfig": {},
"Links": null,
"Aliases": [
"9b616e730cb0"
],
"NetworkID": "1ea2a74e9f5ce9edaf32132a5b928c5859093baf4f5a76dbfcf172a1325ed395",
"EndpointID": "ed48e38a0e63b88fecc3030bcdc1604a10c460724ed4ee1ab5973a8ccc9bd769",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": {}
}
然后修改nginx proxy_pass 的IP,最终在浏览器中查看
小结
至此,我们的项目可以对外访问了,也完成了整个项目的 Docker 化,在这一小节中我们的部署方式也变成了 Docker ,但是脚本文件并没有进行修改,修改的部分我放到了下一章节,在下一章节,我们将解决线上的版本回滚。