Docker 完成作坊式部署私活级别 Golang 程序 0x02:Docker 部署应用

DevOps500 字

在上一小节,我们使用 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 配置的工具,点击链接进行调转

2022-10-03T07:47:40.png

首先,nginx 配置这个东西是很基础的,所有的开发者都应该去学习,但是这个东西如果在你已经会用了的情况下,还是能够给我们的日常工作一些帮助。

2022-10-03T07:48:04.png

我们先将隐藏 nginx 版本点选,然后修改配置文件路径 /etc/nginx/nginx.conf,点击增加server。

2022-10-03T07:48:14.png

在 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,最终在浏览器中查看

image-20221003070208270

小结

至此,我们的项目可以对外访问了,也完成了整个项目的 Docker 化,在这一小节中我们的部署方式也变成了 Docker ,但是脚本文件并没有进行修改,修改的部分我放到了下一章节,在下一章节,我们将解决线上的版本回滚。

maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见