昨天为了解决pyodbc访问mssql出现的openssl版本问题,将mssql升级成了2017版。晚上睡觉时突然想到,是不是vscode的mssql插件配置连接时出现握手失败也是这个原因。既然已经升级了mssql,那vscode的mssql插件应该也可以使用了。今早起床后试了一下,果不其然成功连通了。这个问题算是解决了,之前在网上搜了半天也没有找到答案,看来还在用mssql2008的人少之又少,从ubuntu最新版用vscode去访问mssql的人那更少了,如果你因为搜索这个问题看到这篇文章,都是稀有保护动物,握手。
今天主要工作包括测试了远程控制功能和初步尝试了Docker部署服务器。
远程控制首先想到的就是大名鼎鼎的teamviewer了,这种工具肯定会有ubuntu版本的呀。到teamviewer官网下载ubuntu系统下的最新版,windows系统上也下载对应版本,两头都装好就可以互相远控了。teamviewer可以设置开机启动,并配置固定密码,这样ubuntu服务器重启后一样可以远控。这个比较简单,相关配置网上也有很多资料。
关于docker,我之前只知道个大概,类似于一个裁剪的虚拟操作系统,可以定制各种镜像,这些镜像针对不同的应用需求已经做了裁剪,比如原始的ubuntu镜像、nginx镜像、python镜像,甚至还有django镜像。ubuntu镜像包含了ubuntu最基本的功能,甚至连最基本的vi文本编辑器都没有(其实也不需要有,后面你就知道了,想在docker容器里修改配置文件,完全可以在宿主机上修改好后再拷贝进容器里进行覆盖,毕竟宿主机上还可以用gedit不是),当然也可以在这个镜像的基础上自己扩展出nginx服务器等等。一个docker容器上一般只跑一个应用(也可以像配置ubuntu服务器一样跑很多应用,但这就违背了docker部署的初衷),可以将docker容器理解为一个单一应用的虚拟服务器,而一台宿主机上可以很方便地创建多个docker容器,相当于有多个轻量级的虚拟服务器。这里出现了镜像、容器的概念,镜像就相当于类,容器是类派生出的对象,比如一个nginx镜像可以生成多个容器,每个容器上都跑一个nginx服务器。
实践出真知,千里之行始于安装,先来安装docker。ubuntu下的docker安装最简单的方法是使用官方脚本,一条指令搞定,也可以使用国内daocloud的脚本:
curl -sSL https://get.daocloud.io/docker | sh
安装好docker后就需要拉取镜像。首先还是套路,为docker更换国内镜像源,否则拉取镜像的速度很感人。在/etc/docker目录下新建daemon.json文件,gedit /etc/docker/daemon.json,将下面这段包含了中科大、网易和阿里镜像源的配置信息粘贴到daemon.json中保存,然后重启docker,重启docker的命令是systemctl restart docker,重启后的docker再拉取镜像时速度就很快。
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com/"
]
}
先拉取一个nginx镜像试试,可以用docker serach nginx查找一下有没有这个镜像,返回了一堆信息,第一条就是官方最新版的nginx镜像。拉取到本地的命令是docker pull nginx,拉取后可以查看一下本地的镜像仓库,docker image ls,可以看到已经存在了。通过这个镜像生成一个容器,docker run -d -p 81:80 --name mynginx nginx,就可以在在后台生成一个nginx容器:其中-d表示是后台进程,不会随着当前终端的关闭而关闭;-p 81:80是端口映射;将宿主机81端口映射给这个容器的80端口;--name mynginx是给这个容器命名,方便以后操作这个容器,否则以后要通过类似一个进程号的东西来操作它,如果没有这个参数,docker会随机分配一个名称;最后那个nginx就是基于这个nginx镜像来生成容器。好了,容器有了,我们可以通过docker ps来查看当前已经生成的容器状态,如果在普通权限下,只能看到当前活动的容器,通过sudo docker ps -a可以看到全部容器,包括挂起的、停止的容器。
那怎么进到容器内部去操作容器里的虚拟操作系统呢?sudo docker exec -it mynginx /bin/bash,-it是以交互终端的方式运行mynginx上的/bin/bash,这样就进到了虚拟操作系统中的终端。可以试试ls、cd等指令,是不是找到熟悉的感觉了。既然是nginx镜像产生的容器,自然会有/etc/nginx目录下的配置文件,这个裁剪的虚拟系统中cat命令还是有的,可以查看配置文件,cat /etc/nginx/nginx.conf可以看到这里的nginx.conf会加载conf.d目录下的所有配置文件,cat一下conf.d下的default.conf看一看,就是nginx熟悉的server配置文件。这里有个小技巧,在终端下输入某个目录或者文件名时,可以随时按下tab键试试,如果匹配前缀的目录或文件只有一个,会自动补齐,如果匹配多个,则可双击tab列出所有候选项。Linxu的这个功能我就美其名曰摸着石头过河吧。
接着就是把昨天已经发布在ubuntu上的vue dist目录上传到容器里,上传文件的命令是docker cp 本地路径 mynginx:/虚拟系统的路径。看到这个mynginx名字的用处了吧,如果当时生成容器时没有命名,那只能使用docker ps查出来的容器的container ID来操作了,类似于这样一串天书“c0bd9054f0e9”,很不方便吧。我这里把本地的dist目录上传到容器中nginx的网站根目录,刚才cat出来的default.conf文件中给出了这个目录:/usr/share/nginx/html,于是指令就是docker cp ~/myweb/dist mynginx:/usr/share/nginx/html,这样vue的dist目录就上传到nginx容器的网站根目录下了。由于生成容器时已经将主机81端口映射给容器了,在主机浏览器上访问localhost:81就可以访问到容器中的nginx网站了。打开的是nginx的欢迎页,而不是预想中的vue项目主页,因为我把dist目录整体上传,应该通过localhost:81/dist才能访问到vue的首页。然而这是不可以的,vue是单应用模式,其不支持网址的二级目录,必须要在根目录才行。那就修改nginx的default.conf文件,将80端口的root设置为dist目录。怎么修改?没有vi,通过apt去安装?也不是不可以,首先得apt update,但完全没必要。cat出default.conf文件的内容,屏幕上选中复制,再到主机的桌面上新建一个同名的文件(在主机桌面右键,点击打开终端,gedit default.conf),将复制的内容粘贴进去,进行修改,将root指向dist目录,保存后再通过docker cp指令上传到容器中覆盖就可以了。覆盖了配置文件后需要重启nginx -s reload,用主机浏览器再访问一下localhost:81,vue项目首页出现了吧。
docker的初步使用就这些了,后面再研究怎么打包自己的镜像和自动化部署。