一、什么是Docker?
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
二、为什么要使用Docker?
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker vs VM
从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
三、Docker认识
**宿主机(host)**安装docker的主机(windows,mac,linux)
Docker是CS架构,主要有两个概念:
- Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
- Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
Docker三个概念
-
仓库(Repository)
- Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
-
镜像(Image)
- 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
-
容器(Container)
- 仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
四、docker安装
1、具有sudo权限的非root用户或root用户直接安装,root用户直接安装跳过第一步。
-
查看
/etc/sudoers
的文件权限: -
ll /etc/sudoers
-
只有只读权限,需要用root修改
/etc/sudoers
的权限,加入写的权限:chmod u+w /etc/sudoers
-
编辑
/etc/sudoers
文件-
vim /etc/sudoers
编辑命令(输入英文冒号执行后面命令):插入:i,保存退出:wq,退出不保存:q! -
找到 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
-
xxx用户有了sudo命令
-
2、卸载docker:如果有docker会先卸载旧版本,如果没有则yum报告未安装。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、接下来要通过yum源去安装一些必要的环境:
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4、安装
-
安装最新版(对版本没要求):
-
sudo yum install docker-ce docker-ce-cli containerd.io
一直y即可,最后
-
-
安装指定版本:
-
列出存储库版本号
-
yum list docker-ce --showduplicates | sort -r
-
出现
-
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
-
-
安装(如下命令的**<VERSION_STRING>**替换为版本号。例如:18.09.1)
-
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
-
-
5、启动docker
sudo systemctl start docker
6、测试是否成功安装
sudo docker run hello-world
安装成功!!!!
7、为了使非root用户直接使用Docker,我们将非root用户添加到Docker组中
sudo usermod -aG docker your-user
更新用户组
newgrp docker
五、docker常用命令
1、查看docker版本:docker -v
2、搜索镜像命令:
docker search ubuntu
3、拉取镜像
docker pull ubuntu
4、查看镜像
docker images
5、删除镜像
docker rmi ubuntu
# 删除所有的docker镜像
docker rmi 'docker images -q'
# 删除所有的docker镜像
docker rmi 'docker images -qa'
6、docker创建容器并运行
# 创建容器,运行容器,并进入。
docker run -it --name=ubuntu_llc ubuntu /bin/bash
# 关闭容器并退出
exit
# 退出容器,不关闭
ctrl+p+q
7、创建容器时将宿主机目录挂载到容器上
# 宿主机目录要已经创建好的,若没有创建好的,会以启动docker的用户创建,我是以root用户启动的,所以目录没有实现创建好会导致目录权限为root(路径最好为绝对路径)
# 容器目录必须为绝对路径
容器名 宿主机目录 容器目录 镜像
docker run -it --name="ubuntu_llc_mounts" -v /home/liaolinchun/mounts_test:/tmp ubuntu /bin/bash
# 查看容器挂载的目录
docker inspect ubuntu_llc_mounts | grep Mounts -A 20
更多目录挂载细节:https://www.cnblogs.com/ivictor/p/4834864.html
在已经创建的容器上挂载目录:http://www.bubuko.com/infodetail-3232302.html
docker数据卷:https://www.cnblogs.com/edisonchou/p/docker_volumes_introduction.html
8、查看容器
# 查看运行中的容器
docker ps
# 查看所有容器 包括正在运行和已经停止运行的
docker ps -a
# 查看所有容器中名字含'ubuntu_llc'的容器
docker ps -af name=ubuntu_llc
9、停止容器(容器名称==id)
# 通过容器名称直接关闭容器
docker kill ubuntu_llc
# 通过容器名称关闭容器 默认等待十秒 超时强制关闭 等价于 docker stop -t=10 ubuntu_llc
docker stop ubuntu_llc
10、容器运行(容器名称==id)
# 通过容器名称启动容器,如果已启动则忽略
docker start ubuntu_llc
# 通过容器名称重新启动容器,如果未启动则直接启动,如果已启动则关闭再启动
docker restart ubuntu_llc
# 重启容器,如果容器正在运行最多等待5秒用于停止容器,不加-t参数默认最多等待10秒
docker restart -t 5 ubuntu_llc
11、容器进入(容器名称==id)
docker attach ubuntu_llc
12、删除容器(容器名称==id)
docker rm ubuntu_llc
强制(-f)删除所有
docker rm -f $(docker ps -q)
13、容器和宿主机之间复制文件
# 容器 ==》 宿主机
容器名 容器路径 宿主机路径
docker cp ubuntu_llc:/root/mv_test.txt ./
# 宿主机 ==》 容器
宿主机路径 容器名 容器路径
docker cp ./host_test.txt ubuntu_llc:/root/
14、查看容器详细信息
docker inspect ubuntu_llc
15、备份和迁移
- 保存到镜像
docker commit ubuntu_llc ubuntu_llc_bak
- 将镜像转为压缩文件导出
docker save -o ubuntu_llc_bak.tar ubuntu_llc_bak
- 通过压缩文件恢复镜像
- 先删除之前镜像:
docker rmi ubuntu_llc_bak
- 恢复镜像:
docker load -i ubuntu_llc_bak.tar
- 之后根据这个镜像创建容器
- 先删除之前镜像:
16、继承容器
继承容器名称 被继承容器 镜像名
docker run -it --name ubuntu_llc_inherit --volumes-from ubuntu_llc ubuntu
docker官网:https://docs.docker.com/
参考:https://blog.csdn.net/vitaair/article/details/80894947
:https://blog.csdn.net/lxh_worldpeace/article/details/105459847