使用Docker发布Asp.Net Core程序到Linux
CentOS安装Docker
按照docker官方文档来,如果有之前安装过旧版,先卸载旧版,没有的话,可跳过。
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
首先安装docker依赖包
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
添加docker源到yum包管理器
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
可选项设置都跳过,直接安装
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker,并设置为开机启动
sudo systemctl start docker
sudo systemctl enable docker
之前写了一个demo,在aspnetcore2.2中使用swagger,但是当时并没有启动docker支持,而且很早之前就上传到这台服务器了,其实就是本地虚拟机ヽ(ー_ー)ノ。但是没关系,可以直接在服务器里面来写这个Dockerfile,因为懒得再用VS添加docker支持,其实道理都是一样的,重要的是这个Dockerfile。
添加Dockerfile
在服务器进入到程序发布的路径,比如我是放在/home/wwwroot/swagger_demo/,进来之后用命令创建一个Dockerfile文件:sudo vi Dockerfile,内容如下:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app COPY . . EXPOSE 24438 ENTRYPOINT ["dotnet", "swaggerDemo.dll"]
我这里是开放了24438端口,这个swaggerDemo应用在创建的时候就是这个端口,所以就用了这个端口。一般一台服务器如果只部署一个应用的话,默认开放80端口就好了。我也不知为什么,我就是喜欢用别的端口 ,╮(╯▽╰)╭
创建镜像
在有Dockerfile的这个目录下执行命令,注意命令最后是一个点。
sudo docker build -t swaggerdemo .
创建镜像过程中提示了一个warning,大家都懂的,程序员从来不接受威胁,况且终端提示Successfully build,所以继续下一步。┓( ´∀` )┏
启动容器
sudo docker run --name=swaggerdemo -p 24438:24438 -d swaggerdemo
仍然有这个警告,但是容器是启动成功了,可以通过sudo docker ps查看运行中的容器。在服务器打开Firefox(没错,虚拟机中安装了图形化界面),访问24438端口,程序正常。
解决IPv4 forwarding
虽然docker容器启动成功了,但是只能在服务器访问,外网访问不了。看来这个warning简直就是error啊,要解决这个警告,在/etc/目录下找到这个文件sysctl.conf,结果打开一看,
# sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
然而/sysctl.d/目录里面全是快捷方式,最后在/usr/lib/sysctl.d/目录找到了这个文件00-system.conf,在里面加上这一句:
net.ipv4.ip_forward = 1
然后重启网络和docker
systemctl restart network && systemctl restart docker
重新启动容器之后,在本地就可以通过服务器ip和端口访问了。