简介
基于GO语言,引擎基础linux容器技术
Slogan:“Build,Ship and Run Any App,Anywhere”“一次封装,到处运行”
Docker容器可以理解为一个沙盒,每个容器内运行一个应用,相互隔离互不干扰,容器又可以建立通信。
Docker 基于linux 多项开源技术提供了高效、快捷和轻量级的容器方案,并且支持了主流平台和本地系统的部署,docker为应用的开发和部署提供了一站式的解决方案
优势
快速的交付和部署,使用镜像快速的构建标准开发环境,docker快速创建删除容器,节约时间
高效资源利用,内核级虚拟化,更高性能,对资源额外需求很低
更轻松的迁移和扩展,兼容性好.多平台轻松转移
更简单的更新简管理,使用Dockerfile, 只需小小的配置修改,就可以替代以最大量更新工作
对比虚拟机
特性 | docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒 | 分钟 |
硬盘使用 | MB | GB |
性能 | 接近原生系统 | 弱于原生系统 |
系统支持量 | 上千容器 | 几十个 |
隔离性 | 完全隔离 | 完全隔离 |
核心概念
Docker 镜像,类似虚拟机镜像,面向docker引擎的只读模板,包含了文件系统,是创建容器的基础
Docker 容器,类似轻量级沙箱,docker利用容器来运行和隔离应用,容器是从镜像创建的运行实例,可以启动、开始、停止、删除,可以将容器当做一个简易的linux系统环境
Docker 仓库,类似代码仓库,docker集中存放镜像的场所,分为公开仓库,和私有仓库
安装
Docker 支持在主流平台上安装使用,包括Ubuntu,centos,windows,mac os等等,在linux原生系统表现最好
Centos 7
1
sudo yum install –y docker-ce
启动docker
1
sudo systemctl start docker
镜像
从远程仓库搜索镜像
1
2docker search IMAGE[:TAG]
docker search ubuntu:1.4.1获取镜像
1
2
3docker pull IMAGE[:TAG]
docker pull ubuntu 不明确tag默认最近的latest,从默认公有仓库下载
docker pull dl.dockerpool.com:5000/ubuntu:1.14.1 从确定的仓库下载查看镜像
1
2
3docker images
查看镜像详细信息
docker inspect 容器id 返回json类型数据添加标签
1
docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
删除镜像 (删除镜像前需停止删除容器)
1
docker rmi IMAGE
镜像存出
1
docker save –o ubuntu_14.04.tar ubuntu:14.04 将镜像存出为压缩包
镜像载入
1
docker load –input ubuntu_14.04.tar 或 docker load < ubuntu_14.04.tar
镜像上传
1
2docker push [name][tag] 默认上传dockerhub服务器
docker push xxxx.com:5000/name:tag 上传到url地址的私有仓库创建镜像 a.基于已有镜像的容器创建 b.基于本地模板导入 c.基于dockerfile创建
镜像创建
基于已有镜像的容器创建
1 | 命令:docker commit [OPTIONS] |
基于本地模板导入
利用模板压缩包导入 docker import1
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz|docker import – ubuntu:14.04
基于Dockerfile创建镜像
创建dockerfile配置文件,并编写相关的配置
创建镜像
1
2
3
4
5
6docker buid –t [tag] [选项] 路径 . (结束“.”不可省略,-t 指定镜像的标签)
例:dockerfile所在路径为 /tmp/docker_builder,指定标签 build_repo/first_image
sudo docker build –t build_repo/first_image /tmp/docker_builder .
如果当前所在路径即为dockerfile所在路径,后面的路径可省略
sudo docker build –t build_repo/first_image .
docker images 即可查询新创建的镜像
dockerfile
Dockerfile分为4部分:
基础镜像信息
1
FROM <IMAGE>:<TAG> 第一条指令必须为from,同一dockerfile文件创建多镜像可多from
维护者信息
1
MAINTAINER <NAME> 维护者信息
镜像操作指令
1
2RUN <COMMAND> 或 RUN [“executable”,”param1”,”param2”]
在当前镜像基础上执行的命令,命令长用“\”换行容器启动时执行指令
1
2
3CMD[“executable”,”param1”,”param2”] 或 CMD command param1 param2
CMD [“param1”,”param2”] 为ENTRYPOINT提供参数
ENTRYPOINT[“executable”,”param1”,”param2”] 或 ENTRYPOINT command param1 param2
dockerfile指令
1 | 开头注释 |
ENTRYPOINT和CMD对比
- 相同点:
都只能写1条,多条只有最后一条有效
都是容器启动时执行,运行时机相同 - 不同点:
ENTRYPOINT不会被运行的command覆盖,cmd会
两命令同时存在时,cmd不完整,cmd为ENTRYPOINT提供参数
两命令同时存在时,都完整命令,谁在后面谁生效
容器
新建容器:
1
docker create –it ubuntu:latest 镜像tag或者name
启动容器:
1
docker start 容器id 或 docker restart 容器id 重新启动
新建并启动容器:
交互模式(可执行命令行)
1
2
3
4
5docker run –name blog –p 8080:8080 –v /etc/blog/static:/app/static –it blog:latest
--name 命名容器
-p 端口映射,容器应用端口映射到服务器的端口,服务器端口:容器端口
-v 挂载,将容器的配置文件静态文件等挂载到服务器上,服务器:容器
-it 交互式启动容器守护态运行(不能执行命令行)
1
2docker run –d blog:latest
-d 守护态运行容器
中止容器
1
docker stop 容器id 或 docker kill 容器id 强制停止
查看容器
查看所有启动中的容器:
1
docker ps
查看所有容器:
1
docker ps -a
查看所有中止的容器:
1
docker ps –a -q
进入容器
1
2docker attach 容器id 多个窗口同时操同一个容器时,所有窗口都会同步显示,某个阻塞其他无法操作
docker exec –it 容器id bash 或 docker exec –it 容器id sh (退出容器 ctrl+p+q)删除容器(删除前需要先停止容器)
1
2docker rm 容器id
docker rm –f 容器id 强制删除查看容器运行日志
1
docker logs –f –t –tail 2000 容器id
导出容器
1
docker export 容器id > test.tar
导入容器
1
cat test.tar|docker import – test
容器互通
1
docker run –d –p –name web –link db:db 镜像 --link 连接的容器:别名
docker仓库
官方仓库,也是默认仓库 https://hub.docker.com
创建私有仓库
使用registry镜像创建私有仓库
1
docker run –d –p 5000:5000 registry 自动下载并启动一个registry容器,并创建私有仓库
私有仓库默认存放/tmp/registry,可-v挂载
1
docker run –d –p 5000:5000 –v /opt/data/registry:/tmp/registry registry
私有仓库管理
上传镜像
查看现有镜像
1
docker images
将镜像重打标签
1
2docker tag IMAGE[:TAG] [Registryhost/][username/]name[tag]
docker tag ubuntu:14.04 10.0.2.2:5000/test上传镜像
1
docker push 10.0.2.2:5000/test
查看仓库镜像
1
curl http://10.0.2.2:5000/v1/search
下载仓库镜像
1
docker pull 10.0.2.2:5000/test
docker命令关系图
部署springboot
阿里云分离部署springboot应用
分离打包springboot代码,将代码、lib、static、配置文件分离
编写dockerfile文件
1
2
3
4
5
6
7FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ARG DEPENDENCY=MyBlog
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.blog.MyBlogApplication"]在dockerfile所在路径创建镜像
1
docker build -t blog .
创建容器,外挂配置文件
1
docker run --name myblog -it -p 8081:8080 -v /etc/config/blog/META-INF:/app/META-INF -v /etc/config/blog/lib:/app/lib -v /etc/config/blog/static:/app/static -v /etc/config/blog/application.properties:/app/application.properties -d blog
查看应用运行日志
1
sudo docker logs -f -t --tail 2000 543b07175ece(容器id)