初识Docker与容器

1. Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;

  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);

  • Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;

  • Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。

下表比较了使用Docker容器技术与传统虚拟机技术的各种特性,可见容器技术在很多应用场景下都具有巨大的优势。

Docker容器技术与传统虚拟机技术的比较

image0

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和常见的虚拟机方式的不同之处。

image1

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。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离线安装

参考文献

https://www.cnblogs.com/superlinux/p/14070141.html

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配置文件说明

https://www.cnblogs.com/wt645631686/p/13356743.html

9. pycharm连接docker开发

参考文献:

https://www.cnblogs.com/Mr-shen/p/12833142.html

10. Docker和docker-compose在线和离线安装

https://www.jb51.net/article/201220.htm