目录
什么是Docker
视频学习网站https://www.bilibili.com/video/av27122140
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
为什么要用Docker
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker的基本概念
Docker镜像
Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
Docker容器的运用
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
Docker仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker安装指南
Ubuntu 系列安装 Docker
通过系统自带包安装
Ubuntu 16.04 版本系统中已经自带了 Docker 包,可以直接安装。
$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的 0.9.1。 要安装更新的版本,可以通过使用 Docker 源的方式。
通过Docker源安装最新版本
要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
14.04 之前版本
如果是较低版本的 Ubuntu 系统,需要先更新内核。
$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
然后重复上面的步骤即可。
安装之后启动 Docker 服务。
$ sudo service docker start
CentOS 系列安装 Docker
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
CentOS7
CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:
$ yum update -- 用于更新yum
$ sudo yum install docker
安装之后启动 Docker 服务,并让它随系统启动自动加载。
$ sudo service docker start
$ sudo chkconfig docker on
阿里云服务器使用以下命令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
设置镜像加速
因为docker的镜像仓库在国外,国内访问会很慢所以我们需要镜像加速,提供镜像加速的企业有阿里云,网易云等,这里我们采用阿里云
进入阿里云官网https://www.aliyun.com/
登陆后点击控制台进入自己的服务控制台
然后点击左上角树形菜单栏---产品与服务---容器镜像服务
然后在左边树形菜单栏中找到并点击镜像加速器然后根据阿里云的操作文档操作
centOS6
$ vim /etc/sysconfig/docker
将加速地址copy替换掉红色字体部分
Docker镜像命令
docker images罗列出所有的本地镜像
docker images -q显示当前镜像image id
docker images -qa显示所有本地镜像image id
docker search 项目名 查看所有docker hub上的该镜像例如docker search tomcat
Name为镜像名,stars为点赞数
然后可以用docker pull 镜像名来下载该镜像docker pull tomcat
如果在镜像名后加‘:版本号’例如docker pull tomcat:8.0则会下载8.0的tomcat默认为最新版
docker rmi -f 本地镜像名删除单个镜像
docker rmi -f 镜像名 镜像名:(用空格隔开)可以删除多个镜像名
docker rmi -f ${docker images -qa} 删除所有本地镜像
如果想将镜像推送到阿里云上,可以到阿里云得docker服务去获取帮助https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
Docker容器命令*
新建并启动容器
docker [option] image [command] [arg..]
docker run -it REPOSITORY/IMAGE ID
既可启动容器
可看到root@xxxxxxxx变化已经进入容器内
docker ps查看在运行的容器
docker ps [option]
运行容器并给容器设置别名,下次进入容器可以以别名命名
启动守护进程(后台运行)
Docker run -d REPOSITORY/IMAGE ID/NAMES
重启容器
docker restart REPOSITORY/IMAGE ID/NAMES
停止容器
docker stop REPOSITORY/IMAGE ID/NAMES
强行停止
Docker kill REPOSITORY/IMAGE ID/NAMES
删除容器
Docker ps -n 数字 查看最近数字个docker容器包括没有运行的
Docker ps -l 上一轮的容器
Docker rm REPOSITORY/IMAGE ID/NAMES 删除指定容器没有停止不可删除
Docke rm -f REPOSITORY/IMAGE ID/NAMES 强制删除指定容器
Docker rm -f $(docker ps -qa)强制删除所有容器
退出容器
退出并在后台运行容器ctrl+p+q
退出并停止容器
Exeit
容器日志操作
进入容器
Dokcer attach 容器ID:直接进入容器并且可以在容器中进行操作
Docker exec 容器ID:后台操作容器(隔山打牛)
操作容器
打包容器为镜像文件
Docker commit -a=”作者” -m=”描述/注释” 打包的容器ID 命名空间/镜像名:版本号/标签
将文件复制到宿主机
Docker cp 容器ID:容器地址 宿主地址
端口映射
Tomcat端口映射
Docker run -p 对外暴露的端口号:容器端口号 tomcat
Docker run -p 8888:8080 tomcat
Docker run -P tomcat 随机分配端口号(大写P)
Dockerfile保留字命令
from | 基础镜像,当前新镜像是基于哪个镜像,类似于继承 |
|
Maintainer | 镜像维护者的姓名和邮箱地址 |
|
Run | 容器构建时需要运行的命令 |
|
Expose | 当前容器对外暴露的端口号 |
|
Workdir | 指定创建容器后,终端默认登录后的目录,一个落脚点 |
|
Evn | 用来构建镜像过程中设置环境变量 |
|
Add | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包 |
|
Copy | 类似ADD,将宿主机目录下的文件拷贝进镜像,但是不会自动处理url和解压tar压缩包 | Copy src dest Copy[“src”,”dest”] |
Volume | 容器数据卷,用于数据保存和持久化 |
|
Cmd | 指定一个容器启动时需要运行的命令,可以有多个cmd但是只有最后一个会生效 |
|
Entrypoint | 指定一个容器启动时要运行的命令和cmd一样,出现多个会追加而不是覆盖 |
|
Onbuild | 当构建一个被继承的dockfile时运行命令,父镜像在被子继承后父镜像的onbuild触发 |
|
自定义centos
原理
然后运行docker build -f dockerfile源文件 -t 新镜像名字:TAG. (tag是标签或版本)
注意最后有一个空格和.
自定义tomcat9
安装mysql配置
安装配置redis
https://mp.csdn.net/postedit/103232344
https://mp.csdn.net/postedit/103342952
docker------redis容器下的sentinel哨兵模式