将服务迁移到docker相关问题

字数 3845 阅读 648 喜欢 0

关于服务迁移到Docker

为什么这么做

  1. 首先将服务迁移到docker中可以更好的管理服务本身,更好的进行版本管理。
  2. 确保程序与数据直接是隔离的。
  3. 从安全角度来看,Docker确保运行在容器中的应用程序和其他容器中的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。从体系结构角度来看,每个容器只使用着自己的资源(从进程到网络堆栈)。
  4. 环境标准化,环境问题这是一个老生常谈的问题,为什么在我本地开发的功能是好好的,结果到了生产环境就出现了问题呢!! 这种问题出现的主要原因还是因为,本地开发环境与线上生产环境不一致导致的,但是docker可以很好的解决这个问题,。

主要问题

首先在程序角度来看,需要将使用的数据库、程序进行分离,然后就是测试容器使用效果,没有问题,我们就可以在替换生产环境的服务了。

现在说一下在替换过程中出现的问题,以及相关解决办法。

  1. 通过dockerfile build的镜像太大!
  2. 在docker中程序与数据库分离,如何连接,通讯!
  3. 将本地镜像push到自己的hub.docker上
  4. 在服务器中安装docker,并将镜像pull下来,启动
  • 问题1
    镜像第一次的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"]

优化后的dockerfile
```dockerfile
FROM node:8.10.0-alpine

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

ENTRYPOINT /bin/sh -c "npm run pm2;tail -f /dev/null"

修改镜像的基础镜像 hub.docker , 相关文章

  • 问题2
    在docker中连接数据库,一开始的思路是将数据库也换成docker,然后使用呢link连接,但是最后在同事的建议下,做了相应的修改,还是使用原有的数据库。
    无论是使用数据库docker镜像还是服务器程序,最后的数据存储应该还是与镜像分离的,因此可以将服务器数据库端口开放,并且设置auth认证。
    这里说一下关于mongodb3.4版本auth开启的方式
    在4.0+版本我们只需要在mongod.conf中
    # 添加
    auth = true
    重启mongodb服务就可以实现auth认证
    但是3.4版本并不支持这种方式,需要在mongod.conf添加
    security:
    authorization: enabled
    当然这只是配置方式的不同,其实最终的目的是一样的!
    最重要的是在auth开启之前我们需要给数据库添加auth user
    db.createUser({
      user:"admin",
      pwd:"admin",
      roles: [{role: "readWrite"}, db: "test"]
    })
    提示successful
    表示我们给test添加了admin 用户

重启我们的数据库
在mongo sell里面惊醒测试

use test
db.auth("admin","adminn")
#1表示验证成功

然后下一步就是需要测试我们本地的镜像能否正常使用。
docker logs -f <container id>查看这个镜像的日志

  • 将测试完成的镜像push到hub.docker上面
    这一步没什么太大的难度,首先我们需要有一个docker hub的账号,然后在本地

    docker login
    # 输入自己的账号
    # 输入自己的密码
    # successful 登陆成功

    将给本地的镜像添加tag
    docker tag <image id> <user/dockername:docker-tag>
    添加成功后将镜像push到docker hub
    docker push <user/dockername:docker-tag>

  • 在服务器中安装docker

    # 这里我使用的是CentOS 7的系统
    # 更新
    sudo yum update
    # 移除旧版本的docker 未安装过的可省略
    sudo yum remove docker  docker-common docker-selinux docker-engine
    # 安装依赖
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    # 设置yum源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    # 可以查看所有仓库中所有docker版本,并选择特定版本安装
    yum list docker-ce --showduplicates | sort -r
    # 安装docker
    sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
    sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce
    

设置重启自启动

sudo systemctl start docker
sudo systemctl enable docker

查看

docker version

登陆

docker login

登陆成功之后就可以拉去镜像了

在这个地方遇到一个坑
就是在pull镜像的时候出现Error response from daemon
百度以后发现大家一般出现这个问题的原因是没有进行登陆,显然不是我这里出现的问题的原因
最后找到的解决方案是
使用`dig @114.114.114.114 registry-1.docker.io`
```shell
; <<>> DiG 9.10.6 <<>> @114.114.114.114 registry-1.docker.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32073
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;registry-1.docker.io.        IN    A

;; ANSWER SECTION:
registry-1.docker.io.    37    IN    A    34.201.236.93
registry-1.docker.io.    37    IN    A    54.88.231.116
registry-1.docker.io.    37    IN    A    54.210.105.17
registry-1.docker.io.    37    IN    A    34.199.40.84
registry-1.docker.io.    37    IN    A    100.24.246.89
registry-1.docker.io.    37    IN    A    34.201.196.144
registry-1.docker.io.    37    IN    A    34.199.77.19
registry-1.docker.io.    37    IN    A    34.197.189.129

;; Query time: 17 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Sun Apr 21 15:10:31 CST 2019
;; MSG SIZE  rcvd: 177

修改host

34.201.236.93    registry-1.docker.io

重试,解决,完美

以上就是这次的分享内容。