Docker(1) | Docker简介

186 阅读7分钟

1.Docker 基本概念

Docker容器是资源分割和调度的基本单位,封装这个服务的运行时环境,用于构建、发布和运行应用。是一个跨平台、可移植并且简单的容器解决方案。docker基于go语言开发并基于apache 2.0协议。

docker可以快速自动化的部署应用,并通过操作系统内核技术(namespace/cgroup等)为容器提供资源隔离和安全保障。docker作为轻量级虚拟技术,实现了Pass平台的高效部署、运行和维护。

2. 为什么使用docker

  1. 持续部署和测试

    docker消除了线上线下环境的差异性,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现环境和应用的构建,开发完成后通过镜像迁移,测试和运维人员可以直接部署镜像来测试和发布,大大简化了持续集成、测试和发布的过程。

    docker重新定义了软件开发、测试、交付和部署的流程。交付的内容不再是代码、配置文件、表结构等,而是整个应用服务及其应用环境。

  2. 优异的跨平台性

    docker在linux的基础上,将应用机器依赖的运行环境打包成镜像,可以跨平台使用,实现“构建一次,在各种平台运行”(build once,run everywhere)。而且,越来越多的云平台支持docker,用户无需担心受到云平台的捆绑,让应用实现对平台混合部署成为可能。

  3. 高效资源利用率和隔离

    docker没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例。同时,docker拥有不多的资源隔离和限制能力,保证容器之间不会相互影响。

  4. 环境标准化和版本控制

    可以使用类似git的工具对docker镜像进行获取、分发和更新,相比基于代码的版本控制,能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比于虚拟机镜像,docker压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。

  5. 应用镜像仓库

    docker官方提供了镜像仓库,提供了成千上万常用的镜像版本,所有人都可以根据需要自由下载。

2. docker应用场景

  1. 简化配置

    docker能够将运行环境和配置放在代码中部署,同一个docker的配置可以在不同的环境中使用,降低硬件的要求和应用环境之间的耦合性。

  2. 代码流水线管理

    代码从开发者到生产环境,经历很多的中间环境,每一个中间环境都有微笑的差别,docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变的更加简单。

  3. 提高开发效率

    不同的开发环境中,docker可以把2件事做好,一是开发环境、生产环境之间直接迁移,二是可以快速搭建开发环境。

  4. 隔离应用

    有很多种原因在一台机器上运行不同的应用,docker非常适合在较低的成本下实现多种应用的隔离。

  5. 整合服务器

    docker隔离应用的能力可以使得docker能够整合多个服务器以降低成本。通常数据中心的资源使用率只有30%,通过使用docker并进行有效的资源分配,能够大幅提供资源的使用率。

  6. 调试能力

    docker提供了很多工具,包括可以为容器设置检查点、设置版本和查看2个容器之间的差别,可以帮助调试bug。

  7. 多租户环境

    使用docker可以为每一个租户的应用层的多个实例创建隔离的环境。

  8. 快速部署

    在虚拟机之前,购置新的硬件资源需要数天的时间,虚拟化技术将这个时间缩短到分钟级,而docker通过仅仅创建一个进程而无需启动一个操作系统,将部署的时间缩短到秒级。

4. docker常用命令

4.1 镜像命令

  1. 获取镜像
  • docker pull [仓库地址/]Image[:Tag|@Digest] 从镜像仓库拉取镜像,可以配置仓库地址,默认从docker.hub中拉取
  1. 查看镜像
  • docker images/docker image ls 列出镜像列表
  • docker inspect Container/Image 显示容器/镜像的详细信息
  1. 搜寻镜像
  • docker search Image 从镜像仓库搜索镜像
  1. 删除镜像
  • docker image rm Image/docker rmi Image/ docker image rmi Image 删除镜像
  • docker image prune 删除虚悬镜像
  1. 创建镜像
  • 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 显示镜像创建的过程

  1. 上传镜像
  • 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 容器命令

  1. 创建容器
  • docker create Image

    创建容器

  • docker run Image 创建容器并启动 -v 使用volume -d 后台执行 -p 宿主机和容器端口映射 -it 交互终端

  1. 终止容器
  • docker stop Container 停止容器

  • Docker kill Container

    停止容器

  1. 启动容器
  • docker start Container 启动容器

  • docker restart Container 重启容器

  1. 进入容器
  • docker exec Container 进入容器
  1. 删除容器
  • docker rm Container 删除容器
  1. 导入和导出容器
  • docker export Container

    把容器导出为tar文件

  • docker import TarFile

    把tar文件导入成镜像

  1. 其他命令
  • docker ps/docker container ls 列出容器列表

  • docker logs Container 显示容器的执行日志

  • docker top Container 显示容器中的运行进程

  • docker cp 宿主机和容器之间的文件交互

    1. 宿主机文件拷贝到容器 docker cp test.txt 0ba520ec12de:/home
    2. 容器文件拷贝到宿主机 docker cp 0ba520ec12de:/home/test1.txt .
  • docker stats 显示容器使用的资源情况(包括:cpu/内存/网络/IO信息)

4.3 仓库命令

搭建私有仓库

5. 数据卷

数据卷是一个可供一个或多个容器使用的特殊目录 特性:

  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改立即生效
  3. 对数据卷的修改不会影响容器
  4. 数据卷会一直存在,即使容器被删除

volume使用方式

  1. 使用docker run -v 选项
  2. 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>

参考