基于Docker后台开发实践

2017/03/02

申请了 腾讯云的服务器并安装docker

登录方式:
ssh -q -l root -p 22 123.206.64.226
安装Docker
$ sudo yum update
$ sudo yum install docker-engine
启动Docker
$ sudo systemctl enable docker
$ sudo systemctl start docker

在本机安装docker和简单的Nginx服务器

在本地MacOS上也安装Docker 直接下载就好

https://download.docker.com/mac/stable/Docker.dmg

pull 下来一个nigx的镜像,并run。

docker run –name webserver -d -p 80:80 nginx

在公网上 http://123.206.64.226:80 就可以访问了

Docker的原理:

实现系统层级的虚拟隔离,通过各种命名空间:

  • pid命名空间:进程隔离
  • net命名空间:连接到docker的虚拟网桥实现 网络隔离
  • mnt命名空间:每个进程看见的文件目录不同实现了 隔离效果
  • uts命名空间:使其网络上被认为是一个独立的host主机。而不是主机上的一个进程。
  • user命名空间;容器都有自己的用户组
  • 控制组 cgroup:分离多个容器在共享物理资源上的竞争
  • 联合文件系统 UnionFS : 一种分层 高性能,轻量级的文件系统,同时支持将不同的文件夹 挂载到同一个文件系统上。分层可以提高利用率,是Docker镜像的基础。

Docker 最强大的集群部署能力:

Docker实践项目中有集群环境分布式案例:

CoreOS是一个分布式平台?不是!是一个精简的linu系统! 、集群环境搭建完了就可以利用CoreOS的这三大工具做任务分发,分布式存储

三大工具:

  1. 服务发现 (etcd): 许多服务器实例开始运行时去服务注册中心注册自己的服务,关闭时去注册中心注销服务,客户端发送RestfulAPI到注册中心,中心通过某种API压力算法,算出应答的服务实例。
  2. 容器管理 (Docker):使用docker进行代码和应用
  3. 进程管理 (fleet):fleet是集群的分布式初始化系统,用来管理这些dockers的生存周期。

常用docker命令:

docker pull hello-world :拉取镜像
docker run hello-world :以此镜像运行一个容器
docker images  :列出镜像
docker rm  : 移除镜像
docker ps :列出正在运行的容器
docker start|stop|restart : 启动 停止和重启一个指定容器
http://blog.chinaunix.net/uid-10915175-id-4443127.html
docker run -itd ubuntu:14.04 /bin/bash 创建守护态容器进程
docker ps 查看容器ID
docker attach 44fc0f0582d9 并进入这个容器
docker exec -it 775c7c9ee1e1 /bin/bash  并进入这个容器(新的命令)
[ctrl + P][ctrl + Q]退出而不终止容器运行
容器是独立运行的一个或一组应用,以及它们的运行态环境

一般来说Docker 怎么用呢?

一个Spottly服务可以拆分很多个容器一起运行,比如把Spottly的“搜索功能”特别强大单独把这部分业务逻辑拿出来,写一个搜索程序 然后制作成镜像,用Docker开一个容器运行这个镜像,暴露出端口,供给IOS客户端或者其他服务器使用。

这个搜索服务的镜像可以是从一个Liunx的镜像开始的,可以是从其他镜像开始的,离这个服务最近的镜像,比如采用Luncene搜索,那么可能从一个JVM镜像开始,数据库的话直接从 DBMS 镜像开始。这些镜像都是分层的,应该都会共用相同的部分。所以分离出来的程序挂上操作系统镜像运行在容器里,开销很小,非常轻量级,因为它就是在host上做了一个限制和映射,所有针对container的操作都投射到host上)

Docker的实践

借助beego框架(快速搭建web服务器)和bee(实时重载程序)。用Docker 部署 go web 程序。

项目一

本文中定制的 go-web-demo 镜像。里面只安装了beego框架和bee工具。并没有将自己的业务程序考进去,而是再运行时,通过 加载数据卷 -v 将本地的工程文件 映射到容器中的工作目录,我觉得这样做优点是 制作的是一个干干净净的环境镜像,方便业务程序更新。缺点是,违背docker集装箱的理念,操作繁琐了。

项目二

我们可以看到,docker里明确的将本地工程目录添加到了镜像中

ENV APP_DIR  $GOPATH/src/github.com/puffsun/todos
ADD . $APP_DIR

并安装好程序依赖以及各种工具

 RUN go get github.com/tools/godep
 RUN go get github.com/pilu/fresh
 RUN $GOPATH/bin/godep restore

并且在最后安装自己的程序,指定好入口点运行自己的程序

RUN go install github.com/puffsun/todos
ENTRYPOINT $GOPATH/bin/todos

第三个项目

讲述了 如何用Go搭建一个简单的wiki网站,处理 view/edit/save 不同api路径,利用html模板简化代码,并响应用户的点击事件提交给服务器。

完整的教程

制作jenkins的镜像Dockerfile

FROM jenkins
# if we want to install via apt
USER root
RUN apt-get update
     && apt-get install -y golang
#USER jenkins

运行命令为

docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v ~/jenkins_home:/var/jenkins_home  -it myjenkins:v4
备份时的命令为
sudo docker cp e52a5e7fe510:~/jenkins_home /var
//sudo docker cp ./id_rsa e52a5e7fe510:/id_rsa

服务器的Dockerfile

FROM golang:latest
MAINTAINER Huang zhigang <http://huangzhigang1024@qq.com>
ENV GOROOT /usr/local/go
ENV GOPATH /GoWorkSpace
ENV GOBIN  $GOPATH/bin
ENV PATH $GOROOT/bin:$PATH
RUN apt-get install -y git
WORKDIR /
RUN git clone git://github.com/callmebill/GoWorkSpace.git
WORKDIR $GOPATH/src/github.com/callmebill/todolist/
RUN go install main.go
ENTRYPOINT $GOPATH/bin/main
EXPOSE 8888

docker run –name $CONTAINER_NAME -p 8888:8888 -i $IMAGE_NAME >/dev/null 2>&1 &

/dev/null 2>&1 & 意为 重定向输出 不阻塞当前脚本

Post Directory