Docker上手101


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,肯定可以减少不少机器。

Reference

  1. docker.com
  2. Docker —— 从入门到实践
  3. 如何部署一个 docker registry
  4. Insecure Registry

文章作者: Odin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Odin !
  目录