前言
最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下。于是就拿之前一个aps.net core的项目(已被停止)去练手。该项目之前在ubuntu14.04上确保可以正常运行,所以docker化应该不会有太多问题。搜索了下微软提供了asp.net core的官方docker镜像,但我为了学习docker决定从linux的基础镜像开始制作docker镜像,同时为了少绕弯路,决定从确保能运行的ubuntu14.04开始.
准备
环境
OS:Ubuntu 14.04
.NET Core SDK:2.0
DB:mysql
编译发布程序
sudo dotnet publish -o ..\publish -c Release -r ubuntu.14.04-x64
将程序编译成ubuntu平台的二进制文件.
构建数据库用Docker容器
既然应用程序Docker化了,那数据库肯定也要Docker化,这里数据库我用的Mysql,直接使用的官方镜像的mysql:5.7
sudo docker run --name demo-mysql -v /home/yotsuki/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
这里使用了将本地路径/home/yotsuki/datadir设为映射为数据库目录,并把数据库的3306端口给映射出来。
修改应用程序配置文件
因为docker容器的IP地址不固定,稍后的应用程序容器打算使用--link方式连接到数据库,于是需要把应用程序配置文件中的数据库连接从IP改为hostname,就先定义为demodb吧
// "ConnectionString": "server=127.0.0.1;user id=root;persistsecurityinfo=True;database=pmis;password=123456;port=3306;",
"ConnectionString": "server=demodb;user id=root;persistsecurityinfo=True;database=pmis;password=123456;port=3306;",
编写Dockerfile 文件
# Version:0.0.1
FROM ubuntu:14.04
MAINTAINER yotsuki
RUN cp /etc/apt/sources.list /etc/apt/sources.list_backup
COPY ./sources.list /etc/apt/sources.list
RUN apt-get install libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-dev zlib1g libicu52 -y
RUN apt-get update
RUN mkdir /usr/bin/pmis_web
COPY ./publish /usr/bin/pmis_web
WORKDIR /usr/bin/pmis_web
ENTRYPOINT ./PMIS.WebAPIs
EXPOSE 80
我使用了从官方的ubuntu14.04镜像开始构建容器。
sources.list是国内访问官方镜像过慢的无奈之举,我做了一个163镜像文件直接COPY进去了(我知道这样不好,但这不是重点)
根据微软官方文档查到要想运行.net core程序需要安装以下几个包,于是就先使用apt-get安装必须包
apt-get install libunwind8 liblttng-ust0 libcurl3 libssl1.0.0 libuuid1 libkrb5-dev zlib1g libicu52 -y
apt-get update
然后创建目录并copy程序文件进去
RUN mkdir /usr/bin/pmis_web
COPY ./publish /usr/bin/pmis_web
WORKDIR /usr/bin/pmis_web
最后设置启动命令,并暴露端口
这样Dockerfile就编写完成了
sudo docker build -t demo-web .
运行镜像
sudo docker run -d --name demowebapp --link demo-mysql:demodb -p 80:80 demo-web
打开我们的浏览器输入127.0.0.1 就能看到程序在运行了
至此我们的一个简单的docker化的asp.net core应用程序就部署完毕了。
总结
因为.net core的跨平台特性保证了.net 也能拥抱docker,这是一件大好事。
在学习docker过程中,我感觉到容器化的.net程序和我们以前开发的还是要有一些不同的。比如配置文件中的数据库链接,这里虽然我该ip为demodb,并使用--link链接了,但这是我事先在编译docker镜像前固定好了名字。我觉得可能比较好的做法应该是通过docker run命令传进来或者通过-v命令指定本地配置文件。后者不用更改程序,前者还是需要用到环境变量的(我以前的程序基本不用环境变量)。
希望以后能有.net core程序在docker中实践的机会吧