同步开发人员的项目环境和项目内容,通过镜像实现。
应用更快的交付和部署
传统: 一堆帮助文件,安装程序。
docker: 打包镜像发布测试,一键部署。
docker的工作原理: docker 是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问,DockerServer接收到的Docker-Client的指令,就会执这个指令。
Docker为什么比VM快?
1.Docker有着比虚拟机更少的抽象层。
2.Docker利用的是宿主的内核,而VM需要自己的操作系统。
3.新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载操作系统,分钟级别的,而Docker是利用宿主的操作系统,省略了这个复杂的过程,是秒级的。
帮助命令:
docker version --查看docker版本号
docker info --显示docker的系统信息,包括镜像信息
docker --docker的指令信息
镜像命令:
docker images --查看本地的镜像
PEPOSITORY: 镜像的仓库源。
#解释
TAG: 镜像的标签。
IMAGE ID: 镜像的ID。
CREATED: 镜像的创建时间。
SIZE: 镜像的大小。
#可选项
-a, --all #列出所有的镜像
-q, --quiet #只显示镜像的id
docker search 对应的镜像名 --搜索镜像
--filter=STARS=3000 --搜索出来的镜像就是STARS大于3000的镜像
docker pull 对应的镜像名 [:tag] -- 下载对应的镜像
如果没有加tag信息就会下载最新版本的
docker rmi --删除镜像
docker rmi -f 容器id --删除指定的容器
docker rmi -f 容器id 容器id 容器id -- 删除指定多个的容器
docker rmi -f $(docker images -aq) --删除全部的容器
容器命令:
要有镜像才可以创建容器。
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 tomcat1,tomcat2, 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进行容器查看内容
-p 指定容器的端口 8080
列出所有在运行的容器
docker ps --列出当前正在运行的容器
-a #列出当前正在运行的容器 + 历史运行过的容器
-n=? #显示最近的运行的容器
-q #显示对应容器的编号
退出容器
exit --直接停止并退出容器
Ctrl + P + Q -- 容器不停止并退出
删除容器
docker rm 对应容器的id #删除指定的容器,不能删除正在运行的容器,如果要强制删除就使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q | xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 对应容器的id #启动容器
docker restart 对应的容器id #重启容器
docker stop 对应的容器id #停止对应运行的容器
docker kill 对应的容器id #强制停止对应运行的容器
常用的其他命令:
后台启动容器
docker run -d 对应的容器名
#问题docker ps, 发现对应的容器停止了
#docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志
docker logs
-tf #显示日志
-tail number #要显示的日志条数
查看容器内部的进程信息
docker top 对应的容器id
查看镜像的元数据
docker inspect 对应的容器id
进入当前正在运行的容器
docker exec -it 对应的容器id [对应的路径]
docker attach 对应的容器id [对应的路径]
#exec和attach的区别:exec指令会进入容器后开启一个新的终端,可以在里面操作(常用),而attach指令则是会进入容器正在执行的终端,不会启动新的进程。
从容器内拷贝文件到主机上
docker cp 对应的容器id:容器内文件的路径 目的主机的路径
例子1: 安装nginx
1. 搜索nginx的镜像使用 docker search Nginx
2. 下载对应的镜像 docker pull Nginx
3.运行测试 docker run -d --name 自定义的名字 -p 开放的端口号 nginx
-d #后台运行
--name #自定义名字 #指定容器的名称
-p #开放的端口
-P #随机开放一个端口
docker run -it --rm 对应镜像名 #表示用完即删除
images找到的是镜像,不是容器,镜像和容器的区别是 利用镜像可以创建多个容器 通俗点理解为你只安装了一个QQ程序,但你可以登录多个账号
我们会发现容器中少了很多的Linux的命令。
原因:阿里云镜像的原因,默认使用最小的镜像,所以不必要的会全部剔除掉,保证最小的可运行环境。
安装 portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
镜像: 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含了运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
镜像下载到使用的流程图:
docker commit 提交一个容器成为新的副本
#命令和git相似
docker commit -m="提交的描述信息" -a="作者名" 容器对应的id 目标镜像名:[TAG]
其是一种同步技术,实现容器的持久化和同步的操作,容器间实现数据共享。
方法一 :直接使用命令挂载 -v
docker run -it -v 主机的目录:容器的目录
#类似-p 的端口号映射
例子1:
测试效果:
其两个文件是相互关联的,但并不是同个文件,所有占用双倍的空间。
例子2: 安装mysql
docker run -d -p 8082:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
通过navicat测试连接
#匿名挂载(在-v的时候就只写了容器内的路径,而没有写容器外的路径)
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有volume的情况
docker volume ls
#具名挂载(在-v的时候 卷名:对应的路径)
docker run -d -P --name nginx02 -v jvming:/etc/nignx nginx
docker volume inspect 对应的卷名 #查看对应卷的基本信息
匿名挂载结果:
查看对应卷信息:
所有docker卷在没有指定容器外路径时,其卷信息都会存放在 /var/lob/docker/valumes/xxxxx。
如何区分 匿名挂载,具名挂载,指定路径挂载?
#匿名挂载
-v 容器内部路径
#具名挂载
-v 卷名:容器内部路径
#指定路径挂载
-v /宿主机路径:容器内部路径
拓展:
作用:DockerFile 就是用来构建docker镜像的构建文件,通过对应脚本制作对应的镜像。
DockerFile构建步骤:
1.编写一个DockerFile文件。
2.docker build 构建成一个镜像。
3.docker run 运行镜像。
4.docker push 发布镜像。(docker Hub, 阿里云镜像仓库)
dockerFile构建过程:
1.每个关键字都要大写。
FROM #基础镜像,一切从这里开始
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #构建镜像的时候需要运行的指令
ADD #添加内容
WORKDIR #镜像的工作路径
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
EVN #构建的时候设置环境变量
2.指令从上到下执行。
3.#表示注释。
4.每一个指令都会创建提交一个新的镜像层,并提交。
dockerFile基本指令:
实战测试:
Docker Hub 中99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建的。
创建一个自己的centos
DockerFile脚本:
例子:
创建脚本:
执行指令:
docker build -f dockerFile01 -t hfw/centos:1.0 .
效果:
启动镜像:
作用将多个容器间的数据连通起来。
测试:
#数据卷容器间挂载
docker run -it --name docker02 --volumes-from 父容器的名字 对应镜像名:版本号
容器1:
注意:这些容器的数据卷都挂载在宿主主机上,如果把宿主主机中的文件删除,那么其他容器的数据就不会同步了。
总结: 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。一但持久化到本地以后,这时候本地的数据是不会删除的。
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
cmd会被覆盖,entrypoint不会被覆盖。
例子:
两者都在dockerFile内部执行 ls -a。
对cmdtest进行 "-l" 追加,结果发生错误,说明此追加是将原命令进行覆盖。
对entrypointtest进行追加"-l",结果正常执行,执行命令为:"ls -a -l",说明ENTRYPOIN 是将指令进行拼接。
1.发布到DockerHub上
登录DockerHub
#登录
docker login -u DockerHub对应账号 -p DockerHub对应密码
#登出
docker logout
上传镜像:
docker push (用户名)/(文件名):(版本号)。
上传注意事项:
镜像名称要改为注册用户名/镜像名形式,否则被拒绝。
镜像更改名字指令:
docker tag 对应镜像ID (用户名)/(文件名):(版本号)
将镜像上传到DockerHub效果图:
2.发布到阿里云镜像服务上
1. 创建命名空间。
2. 创建容器镜像。
3.创建容器镜像
4.上传本地的镜像
$ docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ostkaka/ostkaka-work:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ostkaka/ostkaka-work:[镜像版本号]