为什么这么做
- 首先将服务迁移到docker中可以更好的管理服务本身,更好的进行版本管理。
- 确保程序与数据直接是隔离的。
- 从安全角度来看,Docker确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。
- 环境标准化,环境问题这是一个老生常谈的问题,为什么在我本地开发的功能是好好的,结果到了生产环境就出现了问题呢!! 这种问题出现的主要原因还是因为,本地开发环境与线上生产环境不一致导致的,但是docker可以很好的解决这个问题,。
主要问题
首先在程序角度来看,需要将使用的数据库、程序进行分离,然后就是测试容器使用效果,没有问题,我们就可以在替换生产环境的服务了。
现在说一下在替换过程中出现的问题,以及相关解决办法。
- 通过dockerfile build的镜像太大!
- 在docker中程序与数据库分离,如何连接,通讯!
- 将本地镜像push到自己的hub.docker上
- 在服务器中安装docker,并将镜像pull下来,启动
- 问题1
镜像第一次的dockerfile
```dockerfile
FROM node:8
EXPOSE 3000
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN npm install pm2 -g
RUN npm install
CMD ["npm", "run", "pm2"]
修改镜像的基础镜像 hub.docker , 相关文章
- 问题2
在docker中连接数据库,一开始的思路是将数据库也换成docker,然后使用呢link连接,但是最后在同事的建议下,做了相应的修改,还是使用原有的数据库。
无论是使用数据库docker镜像还是服务器程序,最后的数据存储应该还是与镜像分离的,因此可以将服务器数据库端口开放,并且设置auth认证。
这里说一下关于mongodb3.4版本auth开启的方式
在4.0+版本我们只需要在mongod.conf中
重启mongodb服务就可以实现auth认证
但是3.4版本并不支持这种方式,需要在mongod.conf添加
当然这只是配置方式的不同,其实最终的目的是一样的!
最重要的是在auth开启之前我们需要给数据库添加auth user
提示successful
表示我们给test添加了admin 用户
重启我们的数据库
在mongo sell里面惊醒测试
然后下一步就是需要测试我们本地的镜像能否正常使用。docker logs -f <container id>查看这个镜像的日志
-
将测试完成的镜像push到hub.docker上面
这一步没什么太大的难度,首先我们需要有一个docker hub的账号,然后在本地将给本地的镜像添加tag
docker tag <image id> <user/dockername:docker-tag>
添加成功后将镜像push到docker hubdocker push <user/dockername:docker-tag> -
在服务器中安装docker
```shellsudo yum update
sudo yum remove docker docker-common docker-selinux docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos...
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
sudo yum install # 例如:sudo yum install docker-ce-17.12.0.ce
sudo systemctl start docker
sudo systemctl enable docker
docker version
docker login
修改host
重试,解决,完美
以上就是这次的分享内容。