项目的环境配置相当麻烦,换一台机器,就要重新来一次,非常费时。
Docker就给出了一套标准化解决方案,系统平滑移植,容器虚拟化技术。
可以理解为docker把原始环境一摸一样地复制过来,通过镜像,达到一个平滑移植,跨平台的效果。。
Docker是基于Go语言实现的云开源项目。

传统虚拟机技术 与 容器虚拟化技术 的区别:
虚拟机的使用过程:

(缺点:需要多台虚拟机,资源占用多,冗余步骤多,启动慢。)
Docker容器虚拟化技术过程:

由于docker的出现,开发/运维(DevOps)混合型工程师,新一代开发工程师。
简而言之,就是一台物理机上面,可以跑多太容器,大大提升了物理服务器的CPU和内存的利用率。

docker官方:https://www.docker.com/
docker hub镜像仓库:https://hub.docker.com/
docker实质上是在已经运行的linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的linux主机。
docker(docker引擎)必须部署在linux内核的系统上。

查看自己的内核的两个命令:
cat /etc/redhat-release
uname -r
Docker的三个基本组成:
Docker 镜像 、 Docker 容器 、Docker 仓库:
docker是一个client-server的结构系统,docker守护进程运行在主机上。

docker整体的执行原理如下:

centos安装文档地址https://docs.docker.com/engine/install/centos/

官方安装文档:https://docs.docker.com/engine/install/centos/
第一步:确定你是centos7以上的版本。
第二步:根据情况,卸载旧版本。
# Uninstall old versions
# Older versions of Docker were called docker or docker-engine. If # these are installed, uninstall them, along with associated dependencies.
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第三步:yum 安装 gcc 相关。
# 保证 centos7 能够上外网。
$ yum -y install gcc
$ yum -y install gcc-c++
第四步:安装需要的软件包。

第五步: 设置stable镜像仓库。
不要按照官方来配置镜像仓库,因为是国外资源,使用起来很慢,经常遇到下面的错误。

执行命令一下命令,设置阿里云镜像仓库资源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第六步:更新yum软件包索引。相当于重建一下yum安装的索引,这样安装以后快一点。
$ yum makecache fast
第七步:安装 docker engine (docker引擎)。
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
第八步:启动docker服务。
# 启动docker服务
$ sudo systemctl start docker
# 查看docker版本
$ docker version
第九步:执行一个helloworld,测试docker执行。
# 执行helloworld
$ docker run hello-world

出现以上内容,就表示docker服务安装成功,并且能够正常使用。
卸载docker步骤如下:

官方步骤如下:

进入阿里云官方,直接搜索,容器镜像服务:

创建容器镜像服务,实例列表:

根据阿里云文档,进行配置加速:

docker run命令执行流程:

类似linux命令,docker的一些启动运行命令:


# 列出本地主机上的镜像
docker images
# -a: 列出本地所有的镜像
docker images -a
# -q:只显示镜像ID
docker images -q

解释一下tag作用:同一个仓库源可以有多个不同的tag,tag不具体说明,默认安装的就是最新版本(latest版本)。一般我们都要指定tag标签版本的。
# 去远程仓库,模糊查找某个镜像名称
docker search [某个镜像的名字]
# --limit:只列出N个镜像,默认25个。
docker search --limit 5 [某个镜像的名字]


# 下载拉取镜像 , :TAG是指定版本
docker pull 镜像名字[:TAG]
# 没有TAG就是最新版等同于 docker pull 镜像名称:latest

linux命令 : df -h 。 disk free 硬盘内存情况。

# 查看镜像/容器/数据卷所占的空间
docker system df

# rmi就是remove image,就是移除某个image镜像
docker rmi [某个镜像名字ID]
# -f 参数:就是force,强制删除。
docker rmi -f [某个镜像名字ID]
# 删除多个image镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG ...
# 删除全部镜像
docker rmi -f $(docker images -qa)
# 解释一下上面命令:
# docker images -qa 是查询全部镜像的imageID,将该命令获取的imageID传递给docker rmi -f 这个命令,这就是linux的一个用法。

(从上图不难看出,image ID其实很长,显示的时候仅仅显示了开头的一小部分。)
面试题:谈谈docker虚悬镜像是什么?

有镜像才能创建容器。
例如:下面在docker服务上面创建了一个ubuntu环境容器。

# 启动容器命令:
docker run [option] 镜像 [command] [arg...]
解释option参数选项:


实例:
# 从仓库拉去一个ubuntu系统(centos系统比ubuntu大一点)
docker pull ubuntu
# -it: it就是interactive交互式 、tty终端的意思
docker run -it ubuntu /bin/bash
# 用bash也可以。
docker run -it ubuntu bash


# 列出当前所有正在运行的容器
docker ps [options]

NAMES:如果没有指定容器名称,那么系统就会随机分配一个名称。
执行了多次run命令,相当于创建了多个docker容器:

docker ps [options]命令:就是查看当前运行的容器。
参数命令如下:

退出容器方式:
启动已停止运行的容器:
docker start 容器ID或者容器名
重启容器:
docker restart 容器ID或者容器名
停止容器:
docker stop 容器ID或者容器名
强制停止容器:
docker kill 容器ID或者容器名
删除已经停止的容器:
docker rm 容器ID或者名字
# -f 强制删除
docker rm -f 容器ID或者名字
# 一次性删除全部(多个)容器实例: (生产环境绝对不能用!!)
docker rm -f $(docker ps -a -p)
# 以下也可以实现,xargs是linux的输入参数,docker ps -a -q的结果集放到xargs中作为输入参数,执行docker rm命令。
docker ps -a -q | xargs docker rm

之前是交互式容器,操作容器进行交互。
与之相反的是守护式容器。
启动守护式容器(后台服务器):

注意:
docker容器后台运行,就必须有一个前台进程!,原因如下:

不过像mysql,redis这些后台服务器,最好式后台守护式启动!

# 查看容器日志
docker logs 容器ID
一般那个容器出现问题了,就要查看日志去:

# 查看容器内的进行进程情况
docker top 容器ID

# 查看容器内部细节 inspect检查审阅的意思。
docker inspect 容器ID

进入正在运行的容器,如何再交互式访问该容器:
# 再次以交互式方式访问正在运行的容器ID , 以下两个命令都可以:
docker exec -it 容器ID /bin/bash
docker attach 容器ID

attach 和 exec的区别:

工作中,一般使用docker exec命令,这样退出容器终端,就不会导致容器停止。
从容器内拷贝文件到主机上:
# 从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
容器的导入和导出:

# 将容器导出,不指定路径的情况下默认导出再当前文件夹下面
# 相当于将整个容器备份了。
docker export 容器ID > 文件名.tar

# 将备份的tar文件,导入成一个镜像文件:
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
# 案例:
cat abc.tar | docker import - itholmes/ubuntu:1.0.0

镜像的概念:

分层的镜像效果:

这就涉及到了UnionFS(联合文件系统),Union文件系统是Docker镜像的基础。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。一层层的叠加。
docker镜像加载原理:

为什么平时安装的虚拟机centos都是好几个G,而docker才200M?


为什么Docker镜像要采用这种分层结构?

容器层 与 镜像层 :


如何在容器内部安装vim?
# 1. 先交互式运行容器
docker run -it ubuntu
# 2. 更新包管理工具(一定想着更新一下包管理工具)
apt-get update
# 3. 安装vim
apt-get install vim
docker commit作用就是提交容器副本使之成为一个新的镜像:
# 提交格式如下:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

我们给ubuntu容器内部安装vim,这样就相当于又加了一层镜像一层层的叠加,最后commit成为一个镜像。效果如下:

本地镜像发布到阿里云的流程:

将本地镜像推送到阿里云的步骤:
第一步:进入阿里容器镜像服务控制台。
第二步:进入个人实例,先创建命名空间,在创建镜像仓库。



第三步:按照阿里云生成的命令进行相关操作。

将镜像推送到阿里云仓库,就走上图的第3个步骤:

从阿里上面拉去镜像,执行上图的第2个步骤:
