Overview
久闻docker的大名,之前用daocloud也是用了docker,正好最近有时间,就简单研究了一下。为了避免以后忘记,这里写一篇简单的上手指南。
介绍docker概念的文章太多了,这里就不赘述了。docker的好处在于可以带着整个系统环境进行分发,避免了部署时各种依赖构建的痛苦。而且轻量级容器不仅可以隔离应用环境,还可以提高机器利用率。相对于虚拟化来说,docker更轻量级一些,避免了不必要的资源浪费。
安装
CentOS
目前epel源上有docker,看之前的文章docker必须要3.x+以上的kernel,不过显然现在也支持2.6了,这对于还用着RHEL/CentOS 6的广大中国码农来说无疑是个好消息。安装非常简单:
首先,添加epel源:
wget http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm && rpm -ivh epel-release-latest-6.noarch.rpm
然后直接$ sudo yum install -y docker-io
ubuntu
先添加源$ sudo apt-get install -y apt-transport-https
添加密钥$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
添加源列表,按自己的系统来,我用的16.04,不过目前还没有对应的源,但是用wily的源:deb https://apt.dockerproject.org/repo ubuntu-wily main
然后安装就行了$ sudo apt-get update && sudo apt-get install -y docker-engine
基本操作
- 查看镜像列表
sudo docker images
- 拉取镜像
sudo docker pull [image url]
- 启动镜像
sudo docker run -it golang:alpine /bin/sh
- 停止
sudo docker stop [container id]
- 删除镜像
sudo docker rmi [image id]
- 构建镜像
docker build -t liuyiding/java:1.0 .
自订镜像
首先要选择一个基础镜像作为构建自己的应用的镜像,这里推荐alpine linux系列的镜像,alpine是一个非常小的linux发行版,非常适合于构建docker镜像,不过官方的alpine不包括glibc,导致类似java都没法运行,我是以frolvlad/alpine-glibc
为基础的。
一个简单的Java环境的Dockerfile例子:
FROM frolvlad/alpine-glibc
MAINTAINER Liu Yiding<odinushuaia@gmail.com>
RUN mkdir -p /usr/java
RUN mkdir -p /app
ADD jdk.1.8.0_65.tar.gz /usr/java/
RUN ln -s /usr/java/jdk.1.8.0_65 /usr/java/default
ENV JAVA_HOME=/usr/java/default
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar
ENV PATH=$JAVA_HOME/bin:$PATH
构建直接docker build -t liuyiding/java:1.8 .
即可。
再来个自己应用的Dockerfile的例子:
FROM liuyiding/java:1.8
MAINTAINER Liu Yiding<odinushuaia@gmail.com>
RUN mkdir -p /app/uds/logs
ADD uds-assembly-1.1.0.jar /app/uds/
ADD start.sh /app/uds/
EXPOSE 8888 9990 20880
CMD ["/bin/sh", "/app/uds/start.sh"]
基本上非常简单就把自己应用的环境构建好了,再分发的时候也方便。
registry
docker的registry相当于一个镜像仓库,可以把构建好的镜像直接push上去,其他的docker机器只要pull回来就可以直接用了。除了公开的dockerhub,还可以搭建自己私有的registry。方法也很简单,只要拉一个registry的镜像就好。比较麻烦的是它要求https协议,还要生成自己的证书,如果没有可以验证的证书,还得自己手动信任。
生成证书
cd /opt && mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt
在docker的机器上将domain.crt拷贝至
/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt
安装运行docker-registry
#目前最新版是2.3.1,千万别用latest,因为latest指向的是一个非常低的版本,还是python实现的 $ sudo docker pull registry:2.3.1 $ sudo docker run -d \ -v /opt/registry:/var/lib/registry \ -p 5000:5000 \ -v /opt/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ --restart=always --name registry registry:2.3.1
之后就可以用myregistrydomain.com:5000作为私有的registry了,在push之前需要打tag
$ sudo docker tag liuyiding/uds:1.1.0 myregistrydomain.com:5000/liuyiding/uds:1.1.0
$ sudo docker push myregistrydomain.com:5000/liuyiding/uds
Conclusion
总的来说,docker上手还是蛮简单的,如果有机会考虑推广一下。公司的线上机器资源利用率非常低,每个月阿里云上机器成本就一大堆,如果用上docker,肯定可以减少不少机器。