使用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和端口访问了。