Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,逐渐的也将成为各个岗位的必要技术栈要求
了解Docker
Docker简单介绍
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker优点
- 快速,一致地交付应用程序
- 响应式部署和扩展
- 在同一硬件上运行更多工作负载
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-data
和 lvm2
。
设置稳定的仓库
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]