1.Docker 基本概念
Docker容器是资源分割和调度的基本单位,封装这个服务的运行时环境,用于构建、发布和运行应用。是一个跨平台、可移植并且简单的容器解决方案。docker基于go语言开发并基于apache 2.0协议。
docker可以快速自动化的部署应用,并通过操作系统内核技术(namespace/cgroup等)为容器提供资源隔离和安全保障。docker作为轻量级虚拟技术,实现了Pass平台的高效部署、运行和维护。
2. 为什么使用docker
-
持续部署和测试
docker消除了线上线下环境的差异性,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现环境和应用的构建,开发完成后通过镜像迁移,测试和运维人员可以直接部署镜像来测试和发布,大大简化了持续集成、测试和发布的过程。
docker重新定义了软件开发、测试、交付和部署的流程。交付的内容不再是代码、配置文件、表结构等,而是整个应用服务及其应用环境。
-
优异的跨平台性
docker在linux的基础上,将应用机器依赖的运行环境打包成镜像,可以跨平台使用,实现“构建一次,在各种平台运行”(build once,run everywhere)。而且,越来越多的云平台支持docker,用户无需担心受到云平台的捆绑,让应用实现对平台混合部署成为可能。
-
高效资源利用率和隔离
docker没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例。同时,docker拥有不多的资源隔离和限制能力,保证容器之间不会相互影响。
-
环境标准化和版本控制
可以使用类似git的工具对docker镜像进行获取、分发和更新,相比基于代码的版本控制,能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比于虚拟机镜像,docker压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。
-
应用镜像仓库
docker官方提供了镜像仓库,提供了成千上万常用的镜像版本,所有人都可以根据需要自由下载。
2. docker应用场景
-
简化配置
docker能够将运行环境和配置放在代码中部署,同一个docker的配置可以在不同的环境中使用,降低硬件的要求和应用环境之间的耦合性。
-
代码流水线管理
代码从开发者到生产环境,经历很多的中间环境,每一个中间环境都有微笑的差别,docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变的更加简单。
-
提高开发效率
不同的开发环境中,docker可以把2件事做好,一是开发环境、生产环境之间直接迁移,二是可以快速搭建开发环境。
-
隔离应用
有很多种原因在一台机器上运行不同的应用,docker非常适合在较低的成本下实现多种应用的隔离。
-
整合服务器
docker隔离应用的能力可以使得docker能够整合多个服务器以降低成本。通常数据中心的资源使用率只有30%,通过使用docker并进行有效的资源分配,能够大幅提供资源的使用率。
-
调试能力
docker提供了很多工具,包括可以为容器设置检查点、设置版本和查看2个容器之间的差别,可以帮助调试bug。
-
多租户环境
使用docker可以为每一个租户的应用层的多个实例创建隔离的环境。
-
快速部署
在虚拟机之前,购置新的硬件资源需要数天的时间,虚拟化技术将这个时间缩短到分钟级,而docker通过仅仅创建一个进程而无需启动一个操作系统,将部署的时间缩短到秒级。
4. docker常用命令

4.1 镜像命令
- 获取镜像
- docker pull [仓库地址/]Image[:Tag|@Digest] 从镜像仓库拉取镜像,可以配置仓库地址,默认从docker.hub中拉取
- 查看镜像
- docker images/docker image ls 列出镜像列表
- docker inspect Container/Image 显示容器/镜像的详细信息
- 搜寻镜像
- docker search Image 从镜像仓库搜索镜像
- 删除镜像
- docker image rm Image/docker rmi Image/ docker image rmi Image 删除镜像
- docker image prune 删除虚悬镜像
- 创建镜像
-
docker commit Container Image:tag 把容器打包成镜像,用于实现在通用容器启动后,对各种个性化设置保存成新的镜像 docker commit rabbitmq registry.cn-beijing.aliyuncs.com/buyimoutianxia/rabbitmq:V3.7.25
-
docker save Image -o file.tar 把镜像保存为tar文件
-
docker load -i file.tar 把tar文件load成镜像文件
-
docker history Image 显示镜像创建的过程
- 上传镜像
-
docker login 登录到镜像仓库,默认是docker hub docker login --username=buyimoutianxia registry.cn-beijing.aliyuncs.com
-
docker logout 从镜像仓库退出登录
-
docker tag 给对应的镜像打标签 docker tag [ImageId] registry.cn-docker tag 3b38d20c7a23 registry.cn-beijing.aliyuncs.com/buyimoutianxia/jenkins:latest
-
docker push 把本地镜像推送到远程仓库 docker push registry.cn-beijing.aliyuncs.com/buyimoutianxia/jenkins:latest
4.2 容器命令
- 创建容器
-
docker create Image
创建容器
-
docker run Image 创建容器并启动 -v 使用volume -d 后台执行 -p 宿主机和容器端口映射 -it 交互终端
- 终止容器
-
docker stop Container 停止容器
-
Docker kill Container
停止容器
- 启动容器
-
docker start Container 启动容器
-
docker restart Container 重启容器
- 进入容器
- docker exec Container 进入容器
- 删除容器
- docker rm Container 删除容器
- 导入和导出容器
-
docker export Container
把容器导出为tar文件
-
docker import TarFile
把tar文件导入成镜像
- 其他命令
-
docker ps/docker container ls 列出容器列表
-
docker logs Container 显示容器的执行日志
-
docker top Container 显示容器中的运行进程
-
docker cp 宿主机和容器之间的文件交互
- 宿主机文件拷贝到容器 docker cp test.txt 0ba520ec12de:/home
- 容器文件拷贝到宿主机 docker cp 0ba520ec12de:/home/test1.txt .
-
docker stats 显示容器使用的资源情况(包括:cpu/内存/网络/IO信息)
4.3 仓库命令
搭建私有仓库
5. 数据卷
数据卷是一个可供一个或多个容器使用的特殊目录 特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改立即生效
- 对数据卷的修改不会影响容器
- 数据卷会一直存在,即使容器被删除
volume使用方式
- 使用docker run -v 选项
- dockerfile中VOLUME指令
-
docker volume create Volume 创建数据卷
-
docker volume ls 列出volume
-
docker volume inspect Volume 显示volume信息
-
docker volume rm Volume 删除Volume
-
docker network ls 列示docker的网络信息
-
docker network inspect NetworkId 显示docker网络详细信息
数据卷容器实现容器的继承 docker run -it --name centos01 centos docker run -it --name centos02 ----volumes-from=centos01 centos
6. Dockerfile
常用关键字
-
FROM
-
MAINTAINER/LABEL
-
ENV
-
WORKDIR
-
VOLUME
-
COPY
-
ADD
-
EXPOSE
-
RUN
-
CMD
-
ENTRYPOINT
-
USER
-
docker build Dockerfile 根据dockerfile生成镜像
dockerfile示例
FROM java:8
LABEL "name"="xyz"
RUN java -version
VOLUME /tmp
COPY mydockerdemo-1.0-SNAPSHOT.jar mydocker.jar
ENTRYPOINT ["java", "-jar", "/mydocker.jar"]
在idea中通过maven完成dockerfile的编写和容器的部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.2.5.RELEASE</version>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.xyz.MyDockerDemo</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--设置镜像的名称和tag-->
<imageName>${project.artifactId}:${project.version}</imageName>
<!--设置基础镜像-->
<baseImage>java:8</baseImage>
<!--设置maintainer-->
<maintainer>xyz</maintainer>
<!--设置工作目录-->
<workdir>/</workdir>
<!--执行java -version命令-->
<cmd>["java", "-version"]</cmd>
<!--执行java -jar XX.jar命令-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--拷贝宿主机的jar包到镜像中-->
<resources>
<resource>
<!-- <targetPath>/</targetPath>-->
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!--绑定docker的build到maven的package阶段-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>