一、docker介绍
docker的优势
- 1、更高效的利用系统资源
- 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
- 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
- 2、更快速的启动时间
- 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
- 3、一致的运行环境
- 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
- 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
- 4、持续交付和部署
- 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
- 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
- 更轻松的迁移
- 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
- 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
容器的概念
-
容器三大基本概念
- 镜像 image
- 容器 container
- 仓库 repository
-
docker镜像
- image相当于一个root文件系统,比如官方镜像 ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
- image的分层存储
- 因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
- 因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
-
docker容器
- image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。
容器可以被创建、启动、停止、删除、暂停
- image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。
-
docker仓库
- 镜像构建完成后,可以很容易的在宿主机上运行,如果要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务。docker registry就是这样的服务。
一个docker registry可以包含多个仓库(repository),每个仓库有多个tag(标签),每个标签对应一个镜像。
一个仓库包含同一个软件不同版本的镜像,标签就是用于标记版本的。
如
ubantu:14.04
ubantu:16.05
不指定tag的话默认是
ubantu:latest
仓库名海会以 bob/nginx-proxy形式出现,表明docker registry多用户环境下的 用户名/软件名
- 镜像构建完成后,可以很容易的在宿主机上运行,如果要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务。docker registry就是这样的服务。
-
docker Registry
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。
CentOS安装docker
1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.设置存储库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.安装docker社区版
sudo yum install docker-ce
企业版是sudo yum install docker-ee
4.启动关闭docker
systemctl start docker
systemctl stop docker
systemctl status docker
查看docker状态
查看版本信息
docker version
系统环境准备
docker最低支持centos7且在64位平台上,内核版本在3.10以上
可以通过unamr -r
系统环境
docker 加速器
DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。
/etc/docker/daemon.json
#修改这个文件为如下内容
{
"registry-mirrors": [
"http://95822026.m.daocloud.io"
],
"insecure-registries": []
}
或者用这条命令curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
事后重启dockersystemctl restart docker
docker的常用命令
启动docker:systemctl start/stop/restart/status docker
启动/关闭/重启/查看状态docker
systemctl enable docker
设置开机启动docker
systemctl disable docker
取消开机启动
docker容器必须有后台进程在运行,如果没有运行的进程,docker容器实例就挂了
docker ps
查看 正在运行中的容器(存活)
docker ps -a
查看所有运行过的容器记录(挂掉的)
docker search ubuntu
查找ubuntu镜像
docker pull ubuntu
下载ubuntu镜像
docker image ls
或docker images
查看docker存在哪些镜像
docker rm 容器id
删除容器相关记录
docker rmi 镜像名(镜像id)
删除镜像记录
docker rm
docker ps -aq`` 批量删除容器记录
docker run hello-world
运行镜像,产生容器
docker exec -it 容器id
进入已经存在,且运行的容器
-
docker run -it --rm ubuntu bash
交互式运行docker容器,此条命令,会自动下载ubuntu镜像-
docker run
就是运行容器的命令 -
-it
-t:在新容器内指定一个伪终端或终端。-i:允许你对容器内的标准输入 (STDIN) 进行交互。 -
-rm
容器退出后将其删除。也可以不指定参数,手动docker rm,使用-rm可以避免浪费空间 -
ubuntu:14.04
这指的是镜像文件 -
bash
指定用交互式的shell,因此需要bash命令
-
-
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
docker在centos中运行一段shell脚本,后台运行- -d参数:后台运行容器,返回容器ID
docker容器常用命令
docker logs 容器id
查看容器内的标准输出日志
docker stop 容器id
停止容器运行
docker start 容器id
启动容器运行
构建自定义的镜像文件
1.我们进入交互式的centos容器中,发现没有vim命令
docker run -it centos
2.在当前容器中,安装一个vim
yum install -y vim
3.安装好vim之后,exit退出容器
exit
4.查看刚才安装好vim的容器记录
docker container ls -a
5.提交这个容器,创建新的image
docker commit 059fdea031ba chaoyu/centos-vim
6.查看镜像文件
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
docker运行一个web应用
- 1.运行一个python web app
docker run -d -P training/webapp python app.py
- 参数讲解
-
-d
后台运行容器 -
-P
随机端口映射, 将容器中暴露的端口 > 随机映射一个宿主机的端口 5000 > 92320
-
- 参数讲解
或docker run -d -p 9000:5000 training/webapp python app.py
-p
宿主机端口:容器端口, 小写的p是指定端口映射
- docker查看容器内的端口映射状态
docker port 容器id
5000/tcp -> 0.0.0.0:9000
docker运行一个flask web应用,暴露端口供给windows使用
1.启动centos
docker run -it centos
2. 安装 easy_install 命令,python2软件包管理
yum install python-setuptools
3.安装flask
easy_install flask
4.编写好flask web脚本
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Im flask web, im from docker !!!!!!! !</h1>'
#此脚本当做模块导入时候,__main__里代码不执行
#当做脚本文件直接运行的时候,执行__main__代码
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000)
5.退出容器,产生容器id记录
exit
6.提交此容器记录,构建镜像
docker commit 976 s12/flask_web
7.查看镜像
docker images
8.运行flask_web镜像,暴露端口访问
docker run -d -p 7000:9000 s12/flask-web python /home/flask-web.py
9.此时在windows浏览器访问 7000端口的 flask应用
docker hub的使用
1.docker提供了一个类似于github的仓库dockerhub
网址https://hub.docker.com/需要注册使用
2.注册docker id后,在linux中登录dockerhub
docker login
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag chaoyu/centos-vim yuchao163/centos-vim
语法是: docker tag 旧仓库名 yuchao163/仓库名
3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest
4.在dockerhub中检查镜像
https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件
docker pull yuchao163/centos-entrypoint-exec
docker私有仓库搭建:
-v
参数介绍
- 假设我要在docker容器中安装 nginx 软件,nginx软件有网页根目录
root /opt/static/nginx
,这个nginx静态文件,可以放在容器中管理,也可以通过-v参数挂载一个数据-v 宿主机/opt/staic/nginx 容器/opt/static/nginx
,容器中的nginx软件,读取数据时候,通过-v参数,去宿主机读取
1.下载docker 私有仓库镜像
docker pull registry
2.启动私有仓库容器实例
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
3.检查私有仓库的容器id
docker ps
4.修改本地镜像的tag,便于推送到本地镜像仓库
docker tag 镜像名 10.0.0.10:5000/镜像名
5.修改docker配置文件,因为他默认不让推送非https的镜像
- 1.找到本地docker文件
vim /etc/docker/daemon.json
- 2.写入配置,必须注意此文件是json格式!!!注意引号
{"registry-mirrors": ["http://95822026.m.daocloud.io"],
"insecure-registries":["10.0.0.10:5000"]
}
- 3.将此文件,添加到docker服务脚本中
vim /lib/systemd/system/docker.service
- 4.写入以下配置,注意!!!,写入到[Service]配置块中,加载此配置文件
[Service]
EnvironmentFile=/etc/docker/daemon.json
- 5.修改了docker配置文件,重新加载docker
systemctl daemon-reload
- 6.重启docker服务,使得生效
systemctl restart docker
- 7.由于重启了docker,所有的容器实例全挂了,因此要打开私有仓库的容器实例
- 检查私有仓库的容器记录
docker ps -a
- 检查私有仓库的容器记录
- 私有仓库的id
docker start
- 私有仓库的id
- 3.此时
docker ps
检查 私有仓库服务是否启动
- 8.推送本地镜像到私有docker仓库
docker push 10.0.0.10:5000/hello-world
- 9.docker私有仓库提供了API数据可供查看
http://10.0.0.10:5000/v2/_catalog
- 10.可以测试删除本地镜像,然后从私有仓库拖取镜像