什么是Docker?
Docker是一个开源项目,诞生于2013年初,最初是 dotcloud公司内部的一个业余项目。它基于Goolge公司推出的Go语言实现。项目后来加入了Linux基金会,遵从管理Apache2.0协议,项目代码在github上进行维护。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器等技术。
云计算兴起后,服务器硬件扩展非常便利,软件服务部署称为了瓶颈,docker乘势而兴起。
为什么需要Docker?
容器的启动可以在秒级实现,比传统的虚拟机方式要快的多,对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器。Docker的出现,让开发、测试、线上的环境部署,成为了便利一条龙。
1、 更快速的交付和部署
对于开发和运维(devop)来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以是使用一个标准的镜像来构建一套开发容器,开发完成后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快,容器的启动时间是秒级的,大量的节约开发、测试、部署的时间。
2、 更高效的虚拟化
Docker容器的运行不需要额外的hypervisor支持,他是内核级的虚拟化,因此可以实现更高的性能和效率。
3、 更轻松的迁移和扩展
Docker容器几乎可以在任何的平台上运行,包括物理机、虚拟机、共有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。
4、 更简单的管理
要用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
5、 对比传统虚拟机总结
Docker架构
Images:Docker镜像,用于创建Docker容器的模板
Container:Docker容器,独立运行的一个或一组应用
Client:Docker客户端,使用docker api于Docker的守护进程进行通信
Host:Docker主机,一个物理或者虚拟的机器,用于执行Docker守护进程和容器
Registry:Docker仓库,用来保存镜像
Machine:一个简化Docker安装的命令行工具
Docker环境安装
Docker支持Centos6及以后的版本
第一:卸载系统中是否安装过的Docker包
1.查询安装过的包
yum list installed | grep docker
docker-engine.x86_64 17.03.0.ce-1.el7.centos @dockerrepo
2.删除安装的软件包
yum -y remove docker-engine.x86_64
3.删除镜像/容器等
rm -rf /var/lib/docker
第二:安装系统的yum源
第一种方式:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
第二种方式:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
第三、安装Docker
默认安装
yum install –y docker
安装指定版本的docker
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io –y
查看Docker版本
docker version
查看docker信息
docker info
启动docker
service docker start
或者$systemctl start docker
systemctl enable docker
设置随系统启动
sudo chkconfig docker on
修改为阿里云的镜像仓库地址:
默认是docker官方的仓库,但是服务器在国外会很慢
运行第一个Docker容器
1、安装运行hello-world并运行容器
2、安装mysql容器
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
docker启动mysql容器
-d :在后台运行
–name:表示启动的容器的名称
-p 3306:3306 :表示将物理主机的3306端口开放给容器3306端口
-e MYSQL_ROOT_PASSWORD=root mysql:5.7:表示mysql容器的密码为root,安装的mysql版本为5.7
测试:
Docker基础操作
镜像、容器的关系
容器的使用
容器是独立运行的一个或者一组应用,以及他们运行态的环境
容器基础属性参数:
docker run 创建一个容器并运行
docker create 创建一个容器,但是不启动
-d:后台运行容器,并返回容器id
-i:已交互模式运行容器,通常与-t同时使用
-p:端口映射。格式为主机端口:容器端口
–name=“ngnix-lb”:为容器指定一个名称
–dns 8.8.8.8:指定容器使用的dns服务器,默认和宿主一致
-m:设置容器使用内存的最大值
–net=“bridge”:网络连接类型,支持bridge、none、host、container四种类型
–link=[]:添加链接到另一个容器
–expose=[]:开放一个端口或者一组端口
docker [run|start|stop|restart|kill|rm|pause|unpause]
run/create[镜像名]: 创建一个新的容器并运行一个命令
create:只创建容器,但是不运行
查询所有容器,并运行
run 创建并运行:
测试:
start/stop/restart [容器名]:启动/停止/重启一个容器
kill [容器名]: 直接杀掉容器,不给进程响应时间
rm [容器名]:删除已经停止的容器
pause/unpause [容器名]:暂停/恢复容器中的进程
docker [ps|inspect|exec|logs|export|import]
ps :查看容器列表(默认查看正在运行的容器,-a 查看所有容器)
inspect [容器名]:查看容器配置元数据
exec -it [容器名] /bin/bash:进入容器环境中交互操作
logs --since=“2019-02-01” -f --tail=10 [容器名]:查看容器日志
cp path1 [ 容器名]:path 容器与主机之间的数据拷贝
将主机文件下的home文件夹复制到nginx4 容器下/etc/nginx/conf.d 目录下:
将容器nginx2中的文件复制到宿主机home同级文件中:
容器nignx4之前的目录下也会同步复制default.conf文件
export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个 tar 归档文件
import test.tar [ 镜像名: 版本号]:(不使用)
镜像的使用docker images|rmi|tag|build|history|save|load]
a、当用镜像模板创建容器时,是直接在镜像的文件层级上,加一层容器读写层
b、反过来,如果想要创建一个新的镜像,直接把容器对应的所有文件层,转为只读层
images :列出本地镜像列表
去docker中央仓库去寻找需要安装的docker镜像
rmi [镜像名:版本]:删除镜像
1、首先需要删除镜像是否关联相关容器
2、首先删除该镜像关联的容器,然后在删除镜像
tag [镜像名:版本] [仓库]/[镜像名:版本]: 标记本地镜像,将其归入某一仓库
build -t [镜像名:版本] [path] :Dockerfile 创建镜像
history [镜像名:版本] : 查看指定镜像的创建历史
save -o xxx.tar [镜像名:版本] / save [镜像名:版本] >xxx.tar : 将成 镜像保存成 tar 归档文件
load --input xx.tar / docker load<xxx.tar : (不使用)
镜像的制作方法
1、由容器制作镜像
(1)创建tomcat容器
(2)向其中添加一个项目的war包
测试容器:
2、要复用这个容器,使用commit创建一个新镜像
以新建的镜像,创建容器
测试容器
2、Dockerfile使用
虽然使用容器,可以转换为镜像,但不是常规手段,
一般情况下,我们使用dockerfile方式创建容器:
Dockerfile指令:
FROM:
FROM {base 镜像}
必须放在Dockerfile的第一行,表示从哪个baseimage开始构建
MAINTAINTER:
可选的,用来标识image作者的地方
RUN:
RUN都是启动一个容器,执行命令、然后提交存储层文件变更
第一层RUN command1的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件的修改。
而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更是完全没有关系,自然不可能继承前一层构建过程中的内存变化。
而如果需要将俩条命令或者多条命令联合起来执行需要加上&&
如:cd /usr/local/src && wget XXX
CMD:
CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
当运行container的时候声明了command,则不在用image中的CMD默认所定义的命令
一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
EXPOSE:
EXPOSE指令时申明运行时容器提供服务端口,这只是一个申明,在运行时不会因为这个声明应用就会开启这个端口的服务。在Dockerfile中写入这样的声明有俩个好处:一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一用处则是在运行时随机端口映射时,也就是docker run –p是,会自动随机映射EXPOSE的端口。
ENTRYPOINT(默认使用这个命令作为入口命令):
Entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部。
每个Dockerfile只能包含一个entrypoint,多个entrypoint只有最后一个有效
当定义了entrypoint以后,CMD只能够作为参数进行传递。
ADD©
把host上的文件或者目录复制到image中(能够进行自动解压压缩包)
ENV
用来设置环境变量,后续的RUN可以使用它来创建的环境变量
WORKDIR
用来指定当前的工作目录(或者成为当前目录)
USER
运行RUN指令的用户
VOLUME
用来创建一个在image之外的mount point
Dockerfile的使用实例
1、用dockerfile方式创建War包容器
(1)创建Dockerfile脚本文件
(2)构建镜像
(3)构建容器并运行
仓库的使用
1、私有仓库的使用:
搭建
下载 registry 镜像:docker pull registry
启动
配置http传输
私服默认只能使用https,需要配置开放http
配置完毕重启下 docker 服务
systemctl daemon-reload
systemctl restart docker
私服仓库推送镜像
查询镜像
Docker镜像的结构
1、一组只读目录组成一个镜像
2、每一个目录是一个layer,多个layer按照一定的顺序组成一个stack
3、在容器创建时,docker增加在stack之上加一个thin和writable layer
1、lower和upper目录最终被挂载到merged目录
2、upper覆盖lower的同名文件
3、upper合并lower的同目录文件