Contents
初识Docker与容器¶
1. Docker与虚拟机比较¶
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:
Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。
下表比较了使用Docker容器技术与传统虚拟机技术的各种特性,可见容器技术在很多应用场景下都具有巨大的优势。
Docker容器技术与传统虚拟机技术的比较

2. Docker与虚拟化¶
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。
基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。
前者一般指的是一些模拟设备或诸如Wine这样的软件,后者又可以细分为几个子类:
完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p和z系列的虚拟化、VMware Workstation、VirtualBox、QEMU等;
硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMware Workstation,Xen,KVM;
部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;
超虚拟化(paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen;
操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。
可见,Docker以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor支持。
Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。
比较了Docker和常见的虚拟机方式的不同之处。

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
3.核心概念¶
Docker大部分的操作都围绕着它的三大核心概念:
镜像
容器
仓库。
因此,准确把握这三大核心概念对于掌握Docker技术尤为重要。
3.1 Docker镜像¶
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。
通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。
3.2 Docker容器¶
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此相互隔离、互不可见的。
可以把容器看作一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
注意
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
3.3 Docker仓库¶
Docker仓库类似于代码仓库,是Docker集中存放镜像文件的场所。
有时候我们会将Docker仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,被称为Ubuntu仓库,其中可能包括16.04、18.04等不同版本的镜像。
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。
目前,最大的公开仓库是官方提供的Docker Hub,其中存放着数量庞大的镜像供用户下载。
国内不少云服务提供商(如腾讯云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。
注意
可以看出,Docker利用仓库管理镜像的设计理念与Git代码仓库的概念非常相似,实际上Docker设计上借鉴了Git的很多优秀思想。
4.安装Docker引擎¶
Docker引擎是使用Docker容器的核心组件,可以在主流的操作系统和云平台上使用,包括Linux操作系统(如Ubuntu、Debian、CentOS、Redhat等),macOS和Windows操作系统,以及IBM、亚马逊、微软等知名云平台。
用户可以访问Docker官网的Get Docker(https://www.docker.com/get-docker )页面,查看获取Docker的方式,以及Docker支持的平台类型。
Docker引擎目前分为两个版本:社区版本(Community Edition,CE)和企业版本(Enterprise Edition,EE)。社区版本包括大部分的核心功能,企业版本则通过付费形式提供认证支持、镜像管理、容器托管、安全扫描等高级服务。通常情况下,用户使用社区版本可以满足大部分需求;若有更苛刻的需求,可以购买企业版本服务。社区版本每个月会发布一次尝鲜(Edge)版本,每个季度(3、6、9、12月)会发行一次稳定(Stable)版本。版本号命名格式为“年份.月份”,如2018年6月发布的版本号为v18.06。
4.1 Centos 7安装¶
方法1
Docker 支持 CentOS6 及以后的版本。
#CentOS6
对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下
$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io
#Docker目前支持CentOS 7及以后的版本。系统的要求跟Ubuntu情况类似,64位操作系统,内核版本至少为3.10。
# 首先,为了方便添加软件源,以及支持devicemapper存储类型,安装如下软件包:
$ sudo yum update
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 添加Docker稳定版本的yum软件源:
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 之后更新yum软件源缓存,并安装Docker:
$ sudo yum update
$ sudo yum install -y docker-ce
#安装之后启动 Docker 服务,并让它随系统启动自动加载。
#最后,确认Docker服务启动正常:
$ sudo systemctl start docker
$ sudo systemctl enable docker.service
方法2
## Docker CE 的安装使用。
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
#安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新 yum 缓存:
sudo yum makecache fast
#安装 Docker-ce:
sudo yum -y install docker-ce docker-ce-cli containerd.io
#启动 Docker 后台服务
sudo systemctl start docker
#测试运行 hello-world
[root@runoob ~]# docker run hello-world
#镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 镜像加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#删除 Docker CE
#执行以下命令来删除 Docker CE:
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
}
方法3
安装Docker前的准备
#添加内核配置参数
$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然后重新加载 sysctl.conf 即可
$ sudo sysctl -p
#添加yum软件源。
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
开始安装Docker
#更新 yum 软件源缓存,并安装 docker-engine。
$ sudo yum update
$ sudo yum install docker-engine
#启动 Docker 引擎
$ sudo systemctl enable docker
$ sudo systemctl start docker
#建立docker组:
$ sudo groupadd docker
将当前用户加入 docker 组:
$ sudo usermod -aG docker $USER
$ sudo gpasswd -a $USER docker
$ newgrp docker
最后记得安装加速器,DockerHub在国外,访问可能比较慢,要使用国内的DaoCloud,非常快
执行命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl restart docker
阿里云的加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://25bxwt20.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4.2 Ubuntu安装¶
①1.配置 Docker 的 apt 源
1. 安装包,允许 apt 命令 HTTPS 访问 Docker 源。
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
② 2. 添加 Docker 官方的 GPG
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
③ 3. 将 Docker 的源添加到 /etc/apt/sources.list
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装 Docker
$ sudo apt-get update
$ sudo apt-get install docker-ce
④ 镜像下载加速
由于 Docker Hub 的服务器在国外,下载镜像会比较慢。
幸好 DaoCloud 为我们提供了免费的国内镜像服务。daocloud.io 免费注册一个用户,点击查看加速器
# 镜像加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
重启 Docker deamon,即可体验飞一般的感觉。
systemctl restart docker.service
运行第一个docker
$ docker run -d -p 80:80 httpd
4.3 脚本安装¶
用户还可以使用官方提供的shell脚本来在Linux系统(目前支持Ubuntu、Debian、Oracleserver、Fedora、Centos、OpenSuse、Gentoo等常见发行版)上安装Docker的最新正式版本, 该脚本会自动检测系统信息并进行相应配置:
$ curl -fsSL https://get.docker.com/ | sh
或者:
$ wget -qO- https://get.docker.com/ | sh
如果想尝鲜使用最新功能,可以使用下面的脚本来安装预发布版本。但要注意,预发布版本往往意味着功能还不够稳定,不要在生产环境中使用:
$ curl -fsSL https://test.docker.com/ | sh
另外,也可以从store.docker.com/search?offering=community&q=&type=edition找到各个平台上的Docker安装包,自行下载使用。
阿里云安装脚本
# 阿里云的安装脚本
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
DaoCloud 的安装脚本
# DaoCloud 的安装脚本
curl -sSL https://get.daocloud.io/docker | sh
这两个脚本可以任选其一,速度非常不错。
4.4 windows上安装docker¶
对Windows 10的用户来说,Docker官方为64位Windows 10 Pro环境(需支持Hyper-V)提供了原生虚拟化应用Docker for Windows。Windows环境下Docker CE同样支持两个版本:稳定版和测试版。这两个版本的异同可以参见上节。下载地址可见官网文档中心的Get Docker→Docker CE→Windows。
windows上不为常用,在此省略详细步骤。
若要在Windows 10之外的Windows上运行Docker,可以使用Boot2Docker工具。用户可从https://docs.docker.com/installation/windows/ 下载使用。
4.5 离线安装Docker¶
因为有些 Linux 服务器在全内网环境,不能联网安装 Docker。 这个时候要在服务器上安装 Docker 就只能下载对应安装包,离线安装 Docker 需要如下软件包:
docker-engine、
docker-engine-selinux、
libtool-ltdl
下面以安装 Docker 1.12.6 为例讲讲如何在离线环境中安装 Docker,首先我们要下载对应的 Docker 软件包, 下面的地址是官方提供的软件仓库地址,里面有各个版本的 Docker 软件包。
参考文献
https://www.jianshu.com/p/764ec08196e0
https://walle-web.io/docs/2/installation_docker.html
1. CentOS¶
https://yum.dockerproject.org/repo/main/centos/
centos7上离线安装安装docker
$ mkdir docker_install
$ cd docker_install
$ wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.6-1.el7.centos.x86_64.rpm
$ wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm
$ wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm
$ rpm -ivh *.rpm
2. Ubuntu¶
https://apt.dockerproject.org/repo/pool/main/d/docker-engine/
Docker 安装需要依赖 libtool-ltdl
软件包,libtool-ltdl可在pkgs.org这个网站搜索下载。
方式1
参考文献:
https://www.runoob.com/docker/ubuntu-docker-install.html
离线安装参考:
https://www.cnblogs.com/atuotuo/p/9272368.html
Ubuntu 离线安装 docker
1、下载离线包,网址:https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/
离线安装docker需要下载3个包,containerd.io ,docker-ce-cli,docker-ce
2、下载完毕后拷贝到ubuntu上用 dpkg 命令安装,先安装 containerd.io 跟 docker-ce-cli,最后安装docker-ce,命令
sudo dpkg -i xxxx.deb
3. Docker离线安装¶
参考文献
5. 镜像加速器¶
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
Docker 官方提供的中国 registry mirror
阿里云加速器
DaoCloud 加速器
Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。之后重新启动服务。
6. 配置Docker服务¶
为了避免每次使用Docker命令时都需要切换到特权身份,可以将当前用户加入安装中自动创建的docker用户组,代码如下:
$ sudo usermod -aG docker USER_NAME
用户更新组信息,退出并重新登录后即可生效。
Docker服务启动时实际上是调用了dockerd命令,支持多种启动参数。因此,用户可以直接通过执行dockerd命令来启动Docker服务,如下面的命令启动Docker服务,开启Debug模式,并监听在本地的2376端口:
$ dockerd -D -H tcp://127.0.0.1:2376
这些选项可以写入/etc/docker/路径下的daemon.json文件中,由dockerd服务启动时读取:
{
"debug": true,
"hosts": ["tcp://127.0.0.1:2376"]
}
当然,操作系统也对Docker服务进行了封装,以使用Upstart来管理启动服务的Ubuntu系统为例,Docker服务的默认配置文件为/etc/default/docker,可以通过修改其中的DOCKER_OPTS来修改服务启动的参数,例如让Docker服务开启网络2375端口的监听:
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
或者修改systemd如下:
$ cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
$ vim /lib/systemd/system/docker.service
这句改成这样的: ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
systemctl daemon-reload
systemctl restart docker
netstat -plnt
修改之后,通过service命令来重启Docker服务:
$ sudo service docker restart
对于CentOS、RedHat等系统,服务通过systemd来管理,配置文件路径为/etc/systemd/system/docker.service.d/docker.conf。更新配置后需要通过systemctl命令来管理Docker服务:
$ sudo systemctl daemon-reload
$ sudo systemctl start docker.service
此外,如果服务工作不正常,可以通过查看Docker服务的日志信息来确定问题,例如在RedHat系统上日志文件可能为/var/log/messages,在Ubuntu或CentOS系统上可以执行命令
$ journalctl -ue docker.service。
每次重启Docker服务后,可以通过查看Docker信息(docker info命令),确保服务已经正常运行。
7. docker初始优化¶
上面是默认启动 docker,此时 docker 生成的文件都在 /var/lib/docker
下面。
为了便于管理,可以做下面几个方面的优化:
指定新的数据目录。
指定新的存储引擎。
注册点设置,并指定国内的注册点,加速镜像下载。
设置 docker 网络,默认 docker 网络指定的本地
docker0网卡的网段为172.17。设置日志和其它。
配置方法,新增配置文件:
cat > /etc/docker/daemon.json << EOF
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com", "quay.io"],
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"bip": "172.16.200.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"],
"log-opts": {
"max-size":"100M",
"max-file":"3"
}
}
EOF
修改启动参数:
vim /usr/lib/systemd/system/docker.service
内容如下:删除掉启动参数后面的部分
ExecStart=/usr/bin/dockerd
此时重启 docker:
systemctl daemon-reload
systemctl restart docker
开启Docker服务器的端口¶
1.修改配置文件
执行命令: vim /lib/systemd/system/docker.service
# 注释掉这行
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
2.将管理地址写入 /etc/profile
执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
执行命令:source /etc/profile
3.重启服务
执行命令: systemctl daemon-reload && systemctl restart docker
8. Docker配置文件说明¶
9. pycharm连接docker开发¶
参考文献: