docker之初体验
1. 背景
最近在做一个基于Django框架的Web项目,代码实现其实根本不是问题,不过存在两个实际的原因一直在犹豫怎么让客户能够快速简单地部署到生产环境并有效地运行程序:
- 因为涉及到保密性,客户的生产环境是无法上外网的,因此项目依赖的很多软件包只能通过线下(源)安装,相当麻烦;
- 客户缺乏一些软件配置的知识比如supervisor、nginx、uwsgi等,因此完成自主配置的困难性比较高;
基于上述两个主要原因的考虑,决定采用docker,由我们提前制作好docker image,镜像里会预先安装好所有必须的软件依赖并且90%的配置工作也已完成,只需把镜像给到客户然后由客户做一些非常简单的配置及执行运行程序的命令,便可实现程序的有效运行。于此目的去研究了下docker的基本理论知识及应用镜像的制作,作为一个新手特在此记录一哈。
2. 什么是docker
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
docker与传统虚拟机的区别
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
3. docker安装
下面仅讲讲在ubuntu系统上docker的安装过程。
首先,docker的版本有两种,一个是社区免费版的docker-ce,另外一个是商业收费版的docker-ee,just安装docker-ce版本即可。
ubuntu下采用apt-get来安装,而为了防止软件在下载的过程中被篡改采用https的源,因此我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加软件源的GPG密匙
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加docker安装源
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu trusty stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce
service docker start
启动docker daemon进程之后测试一下:docker run hello-world
,如果出现如下图所示结果那就表明安装docker成功了。
-
docker run hello-world
4. docker镜像制作
docker镜像的制作常见的有两种方式:
- 进入容器直接手动修改,后通过docker commit提交生效;
- 建立Dockerfile,通过docker build来完成docker镜像的制作;
不过第一种方式非常不建议,因为进入容器手动操作十分繁琐,并且操作的过程只有操作者知道,不透明不好复用,所以直接开始通过Dockerfile来制作docker镜像。
直接举个实例说明啦:
首先看看Dockerfile所在的目录也就是docker context都有什么吧
-
ls *
- cat Dockerfile
FROM ubuntu:14.04
ADD ./cmpvirtmgr/* /var/www/
WORKDIR /var/www/
RUN buildDeps='make zlib1g-dev libffi-dev python-pip libxml2-dev pkg-config libvirt-dev libmysqlclient-dev' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& cd libressl-2.9.0 \
&& ./configure --prefix=/usr/local \
&& make install \
&& echo "/usr/local/lib" > /etc/ld.so.conf.d/ssl.conf \
&& ldconfig \
&& cd .. \
&& cd Python-3.7.3 \
&& sed -i '/ssl/ s/#//g' Modules/Setup.dist \
&& ./configure --enable-optimizations \
&& make altinstall \
&& cd .. \
&& pip install virtualenv \
&& virtualenv -p python3.7 env \
&& . env/bin/activate \
&& cd cmpvirtmgr \
&& ../env/bin/pip install -r requirements.txt \
&& apt-get install -y supervisor nginx \
&& update-rc.d -f nginx remove \
&& sh cmpvirtmgr_autodeploy.sh \
&& cd .. \
&& rm -fr Python* libressl* *.gz
CMD ["supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
之后,在宿主机Dockerfile所在的目录下执行docker build -t cmpvirtmgr .
即可开始docker镜像的制作,完成后输入docker image ls
便可看到刚才制作的docker镜像了。
-
docker image ls
紧接着就可以把docker镜像导出然后导入到实际的生产环境了,关于过程此处不再展开,笔者会专门写一篇博文再作介绍。
参考
https://yeasy.gitbooks.io/docker_practice/introduction/what.html
https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html