Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,逐渐的也将成为各个岗位的必要技术栈要求

了解Docker

Docker简单介绍


Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

Docker优点

  1. 快速,一致地交付应用程序
  2. 响应式部署和扩展
  3. 在同一硬件上运行更多工作负载

Docker的作用简单来说就是docker中的容器可以看成装货物的集装箱,不同应用可以看做不同货物。没有集装箱的情况下需要考虑如何规整的存放不同货物,有了集装箱就可以将不同货物统一放进去,以相同的方式存放货物,这样就实现了标准化。

Docker采用了集装箱原理,我们将程序放入到容器中,实现“一次封装,到处运行”,只要开发环境能跑,在其他任何流行的机器上都能运行。并且将程序丢入到容器中,很好的实现了程序与程序之间的隔离,避免了类似Java开发的程序和.net开发的程序安装在一个服务器上需要很多调试,有时还会产生冲突的情况。

Docker 架构

Docker 包括三个基本概念:

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

更换yum仓库(可选)

直接使用原yum仓库地址可能由于是国外原因导致从仓库下载资源失败,所以将安装源替换成阿里云的仓库地址
以下操作需要 root 权限
可以切换到root用户 su


或者在所有vim操作前加入sudo

进入 repo 目录

cd /etc/yum.repos.d

备份原文件

cp CentOS-Base.repo CentOS-Base.repo.bak

编辑repo文件

vim CentOS-Base.repo

修改为以下内容

[BaseOS]
	name=CentOS-$releasever - Base
	baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
	gpgcheck=1
	enabled=1
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
vim CentOS-AppStream.repo

修改内容

[AppStream]
	name=CentOS-$releasever - AppStream
	baseurl=https://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os/
	gpgcheck=1
	enabled=1
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
vim CentOS-Extras.repo

修改内容

[extras]
	name=CentOS-$releasever - Extras
	baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
	gpgcheck=1
	enabled=1
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

清除缓存

yum clean all

建立缓存

yum makecache

安装Docker

卸载旧版本

较旧的 Docker 版本称为 docker 或 docker-engine ,如果已安装这些程序,需要卸载它们以及相关的依赖项。

sudo yum remove docker
sudo yum remove docker-client
sudo yum remove docker-client-latest
sudo yum remove docker-common
sudo yum remove docker-latest
sudo yum remove docker-latest-logrotate
sudo yum remove docker-logrotate
sudo yum remove docker-engine

设置 Docker 仓库

首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。

 sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

安装所需软件包,其中yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-datalvm2

设置稳定的仓库

sudo yum-config-manager \
    --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker Engine-Community

安装最新版本的 Docker Engine-Community 和 containerd

sudo yum install docker-ce docker-ce-cli containerd.io


Docker 安装完默认是不启动的。

安装时可能提示要求自行选择版本,这时在存储库中列出可用版本,然后选择并安装:

列出并排序存储库中可用的版本。

yum list docker-ce --showduplicates | sort -r

然后通过其完整的软件包名称安装特定版本

例如:docker-ce-18.09.1。

sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io

启动 Docker。

sudo systemctl start docker

输入docker info验证是否安装成功

成功会出现docker的版本信息

Docker的基本操作

获取镜像
如果我们本地没有镜像,可以使用 docker pull 命令来载入镜像

例如载入ubantu镜像

docker pull Ubuntu:15.10


启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:

 docker run ubuntu:15.10 /bin/echo "Hello world"

参数说明:

-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit

启动已停止运行的容器
使用 docker start 启动一个已停止的容器:
docker start [容器ID或名字]

查看所有的容器
查看所有的容器命令如下:

docker ps -a


后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以通过 -d 指定容器的运行模式。

docker run -itd --name ubuntu-test ubuntu /bin/bash


注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec

停止一个容器
停止容器的命令如下:

docker stop <容器 ID>


停止的容器可以通过 docker restart 重启:

docker restart <容器 ID>

进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

docker attach


docker exec:推荐使用 docker exec 命令,因为此命令退出容器终端,不会导致容器的停止而上个会。

删除容器
删除容器使用 docker rm 命令:

docker rm <容器 ID>

列出镜像列表
我们可以使用 docker images 来列出本地主机上的镜像。

各个选项说明:

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,使用 REPOSITORY:TAG 来定义不同的镜像。

删除镜像
镜像删除使用 docker rmi 命令,比如删除 hello-world 镜像:

docker rmi hello-world

Docker 仓库管理

仓库(Repository)是集中存放镜像的地方。主要是 Docker Hub。不止有 docker hub,只是远程的服务商不一样,操作都是一样的。

Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub。

大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

注册docker账号
在 https://hub.docker.com 免费注册一个 Docker 账号。

登录和退出
登录需要输入用户名和密码,登录成功后就可以从 docker hub 上拉取自己账号下的全部镜像。

使用docker login命令登录:

docker login


退出 docker hub 可以使用命令:

docker logout 

拉取镜像
可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。

例如:
以 ubuntu 为关键词进行搜索:

docker search Ubuntu


使用 docker pull 将官方 ubuntu 镜像下载到本地:

docker pull ubuntu 


推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub:
docker push [用户名]/[镜像名:镜像tag]