Docker逐渐成为虚拟化技术的佼佼者,Java架构师之路接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能。java
什么是Dockerlinux
Docker 是一个开源的应用容器引擎,基于Go语言,诞生于2013年初,最初发起者是dotCloud公司,开发者能够打包应用到一个轻量级、可移植的容器中,而后发布到主流Linux系统上运行。git
为何用Dockergithub
持续交付和部署:使用Docker能够经过定制应用镜像来实现持续集成,持续交付,部署。开发人员构建后的镜像,结合持续集成系统进行集成测试,而运维人员则能够在生产环境中快速部署该镜像,也能够结合持续部署系统进行自动部署。 更高效的资源利用:Docker是基于内核级的虚拟化,能够实现更高效的性能,同时对资源的额外需求很低,相比传统虚拟机方式,相同配置的主机可以运行更多的应用。 更轻松的迁移和扩展:Docker容器几乎能够在任何平台上运行,同时支持主流的操做系统发行版本。 更快速的启动时间:传统的虚拟机技术启动应用服务每每须要数分钟,而Docker容器应用,因为直接运行于宿主内核,无需启动完整的操做系统,所以能够作到妙级,甚至毫秒级的启动时间,大大的节约了开发,测试,部署的时间。
Docker与传统虚拟机差别docker
传统虚拟化方式centos
Docker虚拟化方式bash
传统虚拟化是在硬件层面实现虚拟化,须要有额外的虚拟机管理应用和虚拟机操做系统层,而Docker容器是在操做系统层面实现虚拟化,直接复用本地主机操做系统,更加轻量级。cookie
核心概念架构
Docker镜像:相似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,使用镜像能够建立容器,能够理解为镜像是容器的基石。 Docker容器:是由Docker镜像建立的运行实例,相似于轻量级的沙箱,每一个容器之间都是相互隔离的。支持的操做有启动,中止,删除等。 Docker仓库:相似于常常使用的代码仓库,如github,它是Docker集中存放镜像文件的仓所,国内也有网易,阿里等镜像仓库。 镜像操做指令 获取镜像: docker pull centos (默认获取centos最新的镜像) docker pull centos:7 (获取指定标签镜像) 查看本地镜像: docker images 查看镜像详细信息: docker inspect centos:7 查看镜像历史: docker history centos:7 删除镜像: A:使用标签删除:docker rmi centos B:使用ID删除:docker rimi 构建镜像: A:使用docker commit命令 B:使用Dockerfile构建 使用docker commit 例:构建一个带有jdk的镜像 按照以下步骤操做 [root@localhost ~]# docker run -it centos:7 /bin/bash [root@060793baf536 /]# yum install wget [root@060793baf536 /]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm [root@060793baf536 /]# rpm -ivh jdk-8u131-linux-x64.rpm Preparing... ################################# [100%] Updating / installing... 1:jdk1.8.0_131-2000:1.8.0_131-fcs ################################# [100%] Unpacking JAR files... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... [root@060793baf536 /]# exit [root@localhost ~]# docker commit 060793baf536 centos/jdk:2.0 经过docker images命令能够看到新增了centos/jdk 标签为2.0的镜像 使用Dockerfile构建 实际使用中不推荐使用docker commit构建,应使用更灵活和强大的Dockerfile构建docker镜像,直接举例来认识Dockerfile。 例:构建一个带有jdk的centos7镜像 [root@localhost Dockerfile]# mkdir Dockerfile [root@localhost Dockerfile]# cd Dockerfile 编写Dockerfile: FROM centos:7 MAINTAINER Java-Road "Java-Road@qq.com" RUN mkdir /usr/local/jdk COPY jdk-8u171-linux-x64.rpm /usr/local/jdk/ RUN rpm -ivh /usr/local/jdk/jdk-8u171-linux-x64.rpm 执行以下指令: [root@localhost Dockerfile]# docker build -t centos/jdk . 运行结果以下: docker images能够看到新生成的centos/jdk镜像。 容器操做指令 建立启动容器: [root@localhost ~]# docker run centos:7 /bin/echo'hello world' 容器运行完后直接退出 交互形式建立启动容器 [root@localhost ~]# docker run -it centos:7 /bin/bash [root@802e3623e566 /]# ps PID TTY TIME CMD 1 ? 00:00:00 bash 13 ? 00:00:00 ps [root@802e3623e566 /]# exit 执行exit才能退出容器 守护状态运行容器 [root@localhost ~]# docker run -d centos:7 /bin/sh -c "while true; do echo hello world; sleep 1; done" 启动已有的容器: docker start 容器ID 例: [root@localhost ~]# docker start 802e3623e566 中止运行的容器: docker stop 容器ID 例: [root@localhost ~]# docker stop 802e3623e566 删除容器: [root@localhost ~]# docker stop 89566e38c7fb [root@localhost ~]# docker rm 89566e38c7fb 进入运行的容器: [root@localhost ~]# docker exec -it cbd8b1f35dcc /bin/bash 导出容器: 导出容器cbd8b1f35dcc到centos_test.tar文件 [root@localhost ~]# docker export -o centos_test.tar cbd8b1f35dcc 导出的tar文件能够在其余机器上,经过导入来从新运行 导入容器: 把导出的文件centos_test.tar经过docker import导入变成镜像 [root@localhost ~]# docker import centos_test.tar test/centos 经过docker images命令能够看到增长了个test/centos镜像