Docker容器技术使用实例

  本来不想这么快研究这个东西的,实在是上一个VPS Provider太让人失望和无语了:服务器无法访问,告诉我服务器配置错误。我问那该怎么办,答复我要VPS要重装。网络不通,数据也无法备份,关键是我重装之后还是不能访问,他们也没找到问题,最后发现是只有某些版本的系统的网络能通,也是无语了。之前运行了近一年了没有出现问题,现在服务器的数据全部没了,很多的额服务器需要重新配置,这也让我对系统的运营和部署产生了足够的重视。
  之前对Docker有一些了解,或许现在正是我这种情况的用武之地了,主要的服务和设置用Docker来部署,而私密的数据毕竟少量,自己按时备份。这样如果下次再出问题,几条命令就可以重新把环境部署回来了。
  对于企业级的部署,docker也是一个很好的解决方案,因为你只需要关心容器特定版本的实现,而不用关系host的环境,就是说你的服务可能只开发了RHEL的版本,但是可以方便的被部署到CentOS、Debian、Ubuntu、CoreOS等各个发行版上去,虽然对原生的性能会有所损耗,但是在现在计算机的配置几乎可以忽略不计了,国外已经有银行用容器部署他们的业务了,可靠性也是得到验证了的,是不是很酷?

下面开工:

1.注册账号

  DockerHub 注册用户账号。这个DockerHub相当于GitHub类似的,可以免费帮你存储公有的容器,别人都可以访问和下载(所以前面强调私有的数据要另外保存),然后每个用户可以免费创建一个私有的容器,更多的私有容器就需要花美刀了,跟GitHub是一个运营模式。

2.创建应用容器

2.1 安装相应的工具

  我用的是Fedora 22 Server,这些东西默认就给我装上了,其它版本请参照官方的安装手册。(官方文档说的添加docker组可以让docker在非root用户下运行,但是试验发现、改变/var/run/docker.socket权限后会自动变回来,所以fedora是没有办法的,只能sudo了)。此外docker在fedora的官方维持了一个版本,同时docker自己也维持了一个版本,两者差不多。

1
2
3
4
5
user@localhost  ~  sudo dnf install docker -y
user@localhost  ~  sudo systemctl enable docker
user@localhost  ~  sudo systemctl restart docker
user@localhost  ~  sudo docker run hello-world
user@localhost  ~  sudo docker run -it fedora:22 ping 8.8.4.4

直接使用docker可以查看docker的可用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
attach    Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders from a container to a HOSTDIR or to STDOUT
create Create a new container
diff Inspect changes on a container's filesystem
exec Run a command in a running container
history Show the history of an image
images List images
info Display system-wide information
kill Kill a running container
login Register or log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within a container
port List port mappings or a specific mapping for the CONTAINER
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image(s) to a tar archive
search Search the Docker Hub for images
start Start one or more stopped containers
stop Stop a running container
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within a container

2.2 创建Docker镜像

  DockerHub官方描述,如果DockerHub有的镜像,可以用上面的方法下载下来直接使用,如果没有的话,有两种方式:
(1)下载别人的镜像,然后修改镜像的内容,再提交更改变成自己的镜像;
(2)重新修改Dockfile,然后按照自己的规则生成镜像;
  当然两者各有优点
第(1)种:简单方便;
第(2)种:清晰明了,白盒操作,而且可以持续更新,维护较佳,但是有些配置和修改比较的麻烦,需要用sed等工具来实现;Dockfile可以托管到GitHub上面,然后DockerHub可以关联GitHub,自动编译镜像,这个很重要,在国内龟速的出口网络上,上穿上百兆的内容是很困难的!
  所以个人觉得,如果第(2)种能实现的话,虽然麻烦点,建议用第二种;
  Dockfile描述了镜像创建的规则,创建Docker镜像实际就是编写Dockfile的过程,fedora官方提供了很多的Dockfile实例可供参考。Dockerhub约定了各个软件和系统官方所提供的镜像都是不带前缀的,比如“centos:latest”;个人镜像都是带前缀的,比如“taozhijiang/debian-pptpd:v1”这种类型的。

  这里我们尝试生成一个运行pptpd协议VPN服务的Docker镜像作为例子。

2.2.1 登入Dockhub,修改环境

  Docker的方便之处就是对运维人员的解脱,将镜像存储在云端,任何在线的服务器都可以轻松的部署。下面就是用Dockfile建立镜像的步骤,其中编写Dockfile是重点!

1
2
3
4
5
6
7
8
9
10
11
 user@localhost  ~  sudo docker login
Username: taozhijiang
Password:
Email: taozhijiang@gmail.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
user@localhost  ~  cd ~/DockerHub
user@localhost  ~/DockerHub  mkdir debian-pptpd
user@localhost  ~/DockerHub  cd debian-pptpd
user@localhost  ~/DockerHub/debian-pptpd  vim Dockerfile
user@localhost  ~/DockerHub/debian-pptpd  sudo docker build -t taozhijiang/debian-pptpd .

  还有一点这里需要列举出来的是,如果你用的systemd,那么*不要用systemd的networkd来管理的你的网络,我用地沟油试验的,这种情况container上不了外网,切记切记!
  本来打算用fedora的base image的,但是发现生成的docker image太大了,在768M的VPS上面根本没法运行,内存太小导致docker的进程被杀死。一直以来,fedora和RHEL都感觉比较的臃肿,上次安装系统的时候也是,256M的VPS直接不让装CentOS 7,安装的最低限度是512M……所以现在打算用debian的base image来做这个pptpd的镜像吧。

2.2.2 编写Dockfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM debian:latest
MAINTAINER taozhijiang <taozhijiang@gmail.com>

#RUN dnf update -y && dnf install pptpd iptables -y
#RUN dnf clean all
RUN rm -fr /etc/apt/sources.list
COPY ./sources.list /etc/apt/sources.list
RUN apt-get update -y && apt-get install pptpd iptables rsyslog -y
RUN apt-get clean

RUN echo "\nlocalip 192.168.5.254 \nremoteip 192.168.5.200-230\n" >> /etc/pptpd.conf
RUN echo "\nms-dns 8.8.8.8 \nms-dns 8.8.4.4 \ndebug\n" >> /etc/ppp/pptpd-options

EXPOSE 1723

COPY ./pptpd_start.sh /root/pptpd_start.sh
RUN chmod u+x /root/pptpd_start.sh

CMD ["/root/pptpd_start.sh"]

2.2.3 向DockerHub推送镜像

  很简单,登陆之后sudo docker push debian-pptpd:latest就可以啦。不过一个镜像少者一两百兆,多着五六百兆,电信的宽带尝试了很多次都没有成功;-( 中国的互联网速度龟、费用贵,出口带宽还得加个墙,无语了。
  我是将Dockfile复制到自己的VPS上面去编译的,国外那个网速那是真的快。

2.2.4 关联GitHub账号,实现自动化编译

  DockerHub有一个很靓的功能,就是Automated Build。你可以在你的DockerHub账号设置中,关联GitHub账号或者Bitbucket账号,成功之后你可以新建这种关联与GitHub某个项目的Automated Build的Repo,当GitHub上面的项目有提交更新的话,可以手动或者自动触发这个编译操作去执行生成新的镜像。就不用自己本地生成然后再慢慢上传了,着实的很方便。
  当然,每个GitHub Repo能关联生成一个DockerHub Repo,这对我们没有自己的项目,想用一个GitHub Repo管理所有Dockfile的来说比较的不方便,而且发现Repo的名字不能包含大写字符,应该是一个Bug。

2.2.5 应用服务器部署和调试

  在任意一台服务器上,运行sudo docker pull debian-pptpd:latest就可以下载存储在DockerHub云端的镜像了。对于上面的文件,我们在部署服务器上面添加VPN用户账户,比如

1
#/srv/chap-secrets

然后终端运行

1
sudo docker run -d --privileged -p 1723:1723 -v /home/user/GitHub/DockerHub/debian-pptpd/chap-secrets:/etc/ppp/chap-secrets:ro  taozhijiang/debian-pptpd

如果需要调试,可以运行

1
sudo docker exec -i -t 5f1c03c7410c62db5edc1d418788ffb982554988c8ced58999590b28436fd978 bash

3.测试验证

  手机端和PC端,用Docker Host的IP地址和设置的VPN账号密码,可以拨号成功就OK啦!

Reference