docker安装

1 在 CentOS 6.4 上安装 docker

docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172)。

docker官方文档说要求Linux kernel至少3.8以上,CentOS 6.4是2.6的内核,于是我哼哧哼哧的编译安装了最新的kernel 3.11.6,重启后运行docker还是失败,最后找到原因,是因为编译时忘记集成aufs模块了。aufs 需要和 kernel 一起编译,很麻烦。

不过不需要这么麻烦,有强人已经编译好了带aufs模块的内核,见这里Installing docker.io on centos 6.4 (64-bit)

1.1 取消selinux,因为它会干扰lxc的正常功能

sudo vim /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

1.2 安装 Fedora EPEL

sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

1.3 添加 hop5 repo地址

cd /etc/yum.repos.d
sudo wget http://www.hop5.in/yum/el6/hop5.repo

1.4 安装 docker-io

sudo yum install docker-io

会自动安装带aufs模块的3.10内核,以及docker-io包。

1.5 将 cgroup 文件系统添加到 /etc/fstab , 只有这样docker才能正常工作

sudo echo "none                    /sys/fs/cgroup          cgroup  defaults        0 0" >> /etc/fstab

1.6 修改grub引导顺序

sudo vim /etc/grub.conf
default=0

设置default为新安装的内核的位置,一般是0

1.7 重启

sudo reboot

1.8 检查新内核是否引导成功

重启后,检查一下新内核是否引导起来了

uname -r
.10.5-3.el6.x86_64

说明成功了

看一下 aufs是否存在

grep aufs /proc/filesystems
nodev aufs

说明存在

1.9 启动 docker daemon 进程

sudo docker -d &

如果你在公司,且公司内部都是通过代理上网,则可以把代理服务器告诉docker,用如下命令(参考这里):

sudo HTTP_PROXY=http://xxx:port docker -d &

1.10 下载 ubuntu 镜像

sudo docker pull ubuntu

1.11 运行 hello world

sudo docker run ubuntu /bin/echo hello world
hello world

安装成功了!!

2 在 Ubuntu 上安装 docker

见官方文档,Ubuntu Linux

使用docker来部署应用相对于主机上直接安装应用所需的运行环境,docker要方便的多。

  1. 与虚拟机相比,docker是操作系统级别的虚拟化,与host共享了很多系统资源。因此docker比虚拟机更轻量级,运行的时候启动速度更快,开销也更小;
  2. 虚拟机可以安装桌面,但是docker部署的应用一般通过"IP+端口"的方式来访问;
  3. docker以image(镜像)为基础,应用程序运行在基于特定image开启的container(容器)上;
  4. 如果多个程序使用同一个image来开启不同的container,这些container共享该image而不需要复制多个;
  5. 一个image可以是一个完整的操作系统(例如Ubuntu的官方镜像,大小为2G左右),也可以只是满足某个应用程序运行的基本环境(例如运行nginx的alpine镜像,只有15.5M);
  6. image是分层的,已有image的层是只读属性的,可以在已有image的基础上添加新的层来覆盖下层的东西,从而构建出新的image.

图1:docker与虚拟机的区别

由于应用程序运行在container中,而容器又是基于image构建的,因此image就显得非常重要了。image相当于一个刻录好的光盘,里面有预装好的操作系统或应用程序等。docker官方维护了docker hub这个网站,类似于github,可以直接从该网站上pull各种应用程序的官方镜像。这些镜像可以直接使用,也可以在此基础上添加新的层,来构建自己的镜像。

 Docker的安装

windows下需要win10操作系统的特定版本(Windows 10 64bit: Pro, Enterprise or Education (1607 Anniversary Update, Build 14393 or later))才可以安装docker engine。下面是CentOS下安装及启动Docker Community Edition(CE)的官方文档:

在安装好docker,并启动docker之后,就可以pull官方的image,并在这些image的基础上按照自己的需要创建新的image。

2. Dockerfile文件


创建自己的image只需要一个Dockerfile文件就可以,该文件中保存了构建image的每一步命令。image的每一层可以仅包含一个命令也可以是多个命令,且每一层执行完成后可以缓存起来(下次不用重新执行已构建完成的层中的命令),这样就让可追溯的逐步搭建运行环境成为可能。

Dockerfile中保存的是与基础image对应的操作系统命令,例如以Ubuntu为基础image构建的新的image,该文件中就是Ubuntu系统的shell命令。以下是docker官网对该文件的介绍:

Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession.

下面是一个该文件的示例,使用了jupyter的官方镜像datascience-notebook:

 1 # 指定基础image
2 FROM jupyter/datascience-notebook:03b897d05f16
3 MAINTAINER Xin Xiong <xiongxin20008@126.com>
4
5 # 替换CRAN镜像为国内的镜像,可以更快的安装R packages
6 ARG CRAN_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/CRAN/
7
8 # 由于要安装程序,使用root身份
9 USER root
10
11 # install Java
12 RUN \
13 apt-get update -qq && \
14 apt-get install -y openjdk-8-jdk && \
15 apt-get install -y mlocate && updatedb && \
16 rm -rf /var/lib/apt/lists/*
17
18 # 为安装rJava做准备
19 # need using ln to avoid some errors, such as conftest.c:1:10: fatal error: jni.h: No such file or directory
20 RUN \
21 ln -s /usr/lib/jvm/java-8-openjdk-amd64/include/jni.h /opt/conda/include/ && \
22 ln -s /usr/lib/jvm/java-8-openjdk-amd64/include/linux/jni_md.h /opt/conda/include/ && \
23 ln -s /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so /usr/lib/ && \
24 R CMD javareconf
25
26
27 # 添加本地文件夹package到镜像中的/src
28 ADD ./package/ /src/
29
30 # link lib
31 RUN \
32 ln -s /opt/conda/lib/libpcre.so /usr/lib/ && \
33 ln -s /opt/conda/lib/liblzma.so /usr/lib/ && \
34 ln -s /opt/conda/lib/libbz2.so /usr/lib/ && \
35 ln -s /opt/conda/lib/libz.so /usr/lib/ && \
36 ln -s /opt/conda/lib/libiconv.so /usr/lib/ && \
37 ln -s /opt/conda/lib/libicuuc.so /usr/lib/ && \
38 ln -s /opt/conda/lib/libicui18n.so /usr/lib/
39
40 # 安装前面添加到镜像/src文件夹中rpacks.txt文件中的R package
41 # 且使用国内的镜像地址CRAN_MIRROR
42 RUN \
43 cd /src && \
44 R -e 'install.packages(sub("(.+)\\\\n","\\1", scan("rpacks.txt", "character")), repos="'"${CRAN_MIRROR}"'")'
45
46 # 安装前面添加到镜像/src文件夹中requirements.txt文件中的Python package
47 RUN \
48 cd /src && \
49 pip --no-cache-dir install -r requirements.txt && \
50 rm -rf /root/.cache
51
52 # 直接使用conda安装Python package
53 RUN conda install -c rdkit rdkit
54
55 # 切换到默认普通用户
56 USER jovyan

Jupyter的官方镜像datascience-notebook,包含了Python, R和Julia以及一些数据分析中常用的包。我在该镜像的基础上,安装了Java以及其他一些自己需要的Python和R包。这些包的的名字保存在文件夹package的rpacks.txt和requirements.txt两个文件中,每个包名称一行。在上面的操作中,第28行添加该文件夹中的内容到镜像中的的/src目录下,第42-44行安装了rpacks.txt文件中的R包,第47-50行安装了requirements.txt文件中的Python包。更多关于该镜像的说明可以在官方文档的描述中看到,还有其他的官方镜像可供选择。

2.1 Dockfile中的关键字

如上面的例子所示,Dockfile中包含的最重要的内容是可以在系统命令行中执行的命令,只是每一行命令前加了一些Dockfile特有的关键词。下面是一些常见的关键词:

2.1.1 FROM

FROM <镜像>:<标签>  指定基础镜像为该镜像的一个标签版本,上面例子中的第2行

2.1.2 RUN

运行指定的命令。使用RUN可以运行任何被基础image支持的命令。如果基础image是ubuntu系统,那么软件管理部分只能使用ubuntu的命令

2.1.3 ADD

添加本地文件或目录到container

2.1.4 LABLE

添加一些元数据,格式为LABEL <key>=<value>,例如上面的第3行可以写成LABEL maintainer="Xin Xiong, xiongxin@20008@126.com". MAINTAINER关键词已弃用。

2.1.5 ARG

定义一个变量,如第6行,可以重复使用

更多关键词,可以参考官方文档。此外,"&&"用来连接两条不同的指令,"\" 表示同一条语句换行显示

2.2 Dockerfile的最佳实践

官方文档给出了一些最佳实践指南,比如说不要安装不需要的package,应用解偶联,最小化层数,如何最好的使用"apt-get",COPY和ADD关键词的差别等。

2.3 构建自己的image

有了上面的文件,就可以在Dockerfile这个文件所在的文件夹,使用下面的命令build自己的镜像了:

docker build -t onlybelter/ds-notebook .

这句命令会使用当前目录下的Dockerfile文件,构建一个image,新image的名称为onlybelter/ds-notebook。

3. docker-compose


docker-compose可以用来配置一些在image中没有设置的参数,例如端口号,log日志的目录,容器启动时运行的命令等。此外还可以用来启动、停止容器,打印log,查看容器状态和限制资源使用等功能。

docker-compose的其他介绍及安装可以参考官方文档

3.1 docker-compose的配置文件

docker-compose的配置文件是一个放在与Dockerfile相同目录下,以.yml结尾的文件,示例如下:

 1 version: '2.2'
2
3 services:
4 jupyterlab:
5 image: onlybelter/ds-notebook
6 command: /bin/bash -c "jupyter lab --no-browser --ip=0.0.0.0 --notebook-dir=/mnt/notebook"
7 cpus: 16
8 mem_limit: 8g
9 volumes:
10 - /mnt/home/belter/github/jupyter-note:/mnt/notebook
11 - /etc/localtime:/etc/localtime:ro
12 environment:
13 - PYTHONUNBUFFERED=1
14 ports:
15 - 8888:8888

第1行,指定了配置文件的版本号,由于v3不支持单机模式下配置资源,因此这里使用了v2.2(如果不适用swarm或其他集群模式,官方推荐使用v2);

第4行是service的名称;

第5行指定了image的名称,就是上面build好的镜像;

第6行设置了容器启动时的命令;

第7-8行限制了资源的使用:16个CPU核,8G内存;

第10行,相当于挂载了一个本地目录到容器,这样容器和外部的host之间就可以交换文件了(内外对应的文件夹里的内容是同步的);

第11行用于同步容器与host的时间;

第13行设置了一个环境变量;

第15行设置了容器内外端口号的对应关系,左边是host的端口号,右边是容器内的端口号。

3.2 启动容器

配置好上面的.yml文件(我的文件为docker-compose.yml)后,就可以启动前面build好的镜像来创建一个容器了。

$ sudo docker-compose up -d

$ sudo docker-compose logs

第1行命令使用当前目录下的docker-compose.yml文件创建容器,并在后台运行;第2行命令打印logs,可以从logs中获得Jupyter Notebook生成的token来登录。

Attaching to jupyterlab_jupyterlab_1
jupyterlab_1 | [I 20:07:06.567 LabApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
jupyterlab_1 | [I 20:07:06.731 LabApp] JupyterLab beta preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
jupyterlab_1 | [I 20:07:06.731 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
jupyterlab_1 | [W 20:07:06.737 LabApp] JupyterLab server extension not enabled, manually loading...
jupyterlab_1 | [I 20:07:06.737 LabApp] JupyterLab beta preview extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
jupyterlab_1 | [I 20:07:06.737 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
jupyterlab_1 | [I 20:07:06.744 LabApp] Serving notebooks from local directory: /mnt/notebook
jupyterlab_1 | [I 20:07:06.744 LabApp] 0 active kernels
jupyterlab_1 | [I 20:07:06.744 LabApp] The Jupyter Notebook is running at:
jupyterlab_1 | [I 20:07:06.744 LabApp] http://1c7e68e582c4:8888/?token=3bda623azj07414dbcf58bf977e2c2855158bd052f77afa2
jupyterlab_1 | [I 20:07:06.744 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

使用该host的ip加端口号8888,输入日志中的token就可以打开Jupyter的界面。我的本地地址为,http://192.168.1.33:8888/lab?

界面如下图所示:

其他docker-compose命令:

$ sudo docker-compose down  # 关闭容器
$ sudo docker-compose ps # 查看容器运行状态

此外使用docker stats <container name>可以查看该容器资源使用情况:

Reference


https://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-virtual-machine

https://www.docker.com/resources/what-container#/package_software

https://blog.csdn.net/weixin_37645838/article/details/83343029

https://docs.docker.com/engine/reference/builder/

docker安装,和虚拟机区别的更多相关文章

  1. Docker容器和虚拟机区别

    Docker .虚拟机之间区别 虚拟机技术的缺点: 1.资源占用太多 2.冗余步骤多 3.启动很慢 容器化技术 1.服务器资源利用率高 2.比较轻量化 3.打包镜像测试,一键运行 比较Docker和虚 ...

  2. docker容器与虚拟机区别

  3. Vmware虚拟机中CentOS7与Docker安装图文教程

    1.安装VMware 下载一个软件安装: 2.新建一个虚拟机 等待自动安装完成 配置系统语言: 配置系统时间: 配置系统键盘: 语言支持: 默认自动使用安装源: 配置软件环境,需要及时添加的软件,这里 ...

  4. 开工:创建虚拟机,xshell连接虚拟机,复制虚拟机,docker安装,添加加速器

    创建虚拟机:http://www.linuxidc.com/Linux/2015-08/121807.htm http://www.linuxidc.com/Linux/2010-04/25573.h ...

  5. Docker基础:VMware虚拟机Centos7环境下docker安装及使用

    1.docker简介 2.docker安装 3.卸载docker 4.阿里云镜像加速 5.docker的常用命令 5.1 帮助命令 5.2 镜像命令 5.3 容器命令 5.4 后台启动命令 5.5 查 ...

  6. 【linux杂谈】安装linux虚拟机的时候发现的full name,user name有啥区别

    本人为了重温linux,在新电脑上又要安装linux虚拟机,在VMware内配置快速安装的时候看到有如下说明: 大家可能跟我一样对于username比较熟悉,但是这个fullname是干嘛的?我们先进 ...

  7. 【docker】docker安装和使用

    一.docker简介: docker是容器技术的一个代表,而容器技术是将程序打包和隔离的一种技术,其实它并不是一个新技术,之前在linux内核中早已存在,真正被大众所用所了解是因为docker的出现. ...

  8. 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理

    1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...

  9. docker安装及使用

    一.简介 说起docker,大多数人第一时间想起来的应该有虚拟化.云计算,这三者有什么区别呢? 对比: 我们所熟知的虚拟化有KVM.xen.Hyper-V等,这些虚拟化虚拟出来的服务器会产生一个新的操 ...

随机推荐

  1. Inno Setup 设置开机启动

    案1: 将快捷方式添加到“启动”文件夹 [Tasks] Name: "startupicon"; Description: "{cm:CreateQuickLaunchI ...

  2. css面试题总结(转)

    转自此网页http://www.cnblogs.com/YangqinCao/p/5721810.html. 1.两栏布局,左边栏宽度固定,适应父元素高度变化 首先分析两栏布局, 两栏布局两种常见方法 ...

  3. 字符串Hash算法比较

    基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m> ...

  4. java中URLEncode和URLDecode

    URLEncode和URLDecode用于完成普通字符串和 application/x-www-from-urlencoded MIME字符串之间的相互转化 如果传递的字符串中包含非西欧字符的字符串, ...

  5. LeetCode120 Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  6. 使用jquery.form.js的ajaxsubmit方法提交数据的Bug

    周五同事遇到一个很奇怪的问题,调到下班,虽然问题解决了,但是不知道问题的具体原因,回来翻了翻代码,才发现症结所在,下面就分享出来,供遇到同样问题的同行们参考: 先把问题描述一下,做的功能是使用ajax ...

  7. C#面向对象--命名空间与类库

    1.命名空间 在源代码文件开头使用using语句引用 命名空间,就可以直接使用其中的类而不再需要指明其所属的命名空间. .NET Framework使用命名空间来管理所有的类. 类的修饰符:   pu ...

  8. centos6 名字服务dnsmasq配置

    1 主机名配置 主机hd1配置(后面配置为名字服务器) [grid_hd@hd1 Desktop]$ cat /etc/sysconfig/network NETWORKING=yes HOSTNAM ...

  9. 【转载】.NET中使用Redis

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...

  10. Pytorch 多 GPU 并行处理机制

    Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids),其中 module 参数是所要执行的模型,而 device_ids 则是指 ...