一文快速入门Docker
Docker提供一种安全、可重复的环境中自动部署软件的方式,拉开了基于与计算平台发展方式的变革序幕。如今Docker在互联网公司使用已经非常普遍。本文用十分钟时间,带你快速入门Docker。
Docker是什么
Docker是什么?
官网首页的介绍:
Enterprise Container Platform for High-Velocity Innovation. Securely build, share and run any application, anywhere
百度百科告诉我们:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
《第一本DOCKER书》的简介:
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。由Docker公司(www.docker.com,前dotCloud公司,PaaS市场中的老牌供应商)的团队编写,基于Apache 2.0开源协议发行。
Docker的特别之处:
Docker是轻量级的虚拟化技术,启动速度快(大多数Docker容器只需不到1s即可完成启动),单台硬件上可以同时跑成百上千个容器,使得快速扩展,弹性伸缩变得简单。据说,在2016年,京东使用15万Docker集群来保证618高并发场景下的系统稳定。
Docker是跨平台的,支持Windows、Macos、Linux,可以做到“构建一次,到处运行”,解决开发环境和生产环境不一致带来的一系列问题,让开发人员和运维人员可以更加和谐相处。
Docker是开源的,托管于GitHub。
Docker思想
从docker的logo联想docker核心思想
Docker的logo是一个载着集装箱的大鲸鱼,这绝对是对Docker最形象的描述和解释。
对比运输业,在集装箱出现之前,货物无法用统一的标准方式进行搬运,比如有些货物易碎,需要轻拿轻放,有些则不需要。于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,解决了这个难题,任何货物货物都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子在运输过程中都是密封的,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。
Docker正式借鉴了标准集装箱的思想,将集装箱思想运用到了软件领域。Docker为代码提供了一个基于容器的标准化运输系统,可以将任何应用及其依赖的环境(如代码、配置文件、JDK、Tomcat等)打包成一个容器,这个容器可以在几乎所有的操作系统运行。
Docker核心概念
镜像
镜像是docker的基石,用户可以基于镜像来运行自己的容器。
镜像的基础是Docker的联合文件系统,该文件系统是分层的,每个镜像是一个层。由于每个层上面还以有其他层,也就是说,镜像可以在其他镜像(基础镜像)上面进行创建。借用一幅图来帮助理解。图片来源于网络,侵删。
仓库
仓库是保存用户镜像的地方,docker官方仓库地址为 https://hub.docker.com。在Docker Hub上面有许多镜像,包括最简单的hello-world,MySQL等等。当然我们也可以有自己私有的仓库。
容器
容器为应用程序提供了隔离的运行空间。每个容器内都包含一个独享的完整的用户环境,并且一个容器内的运行环境变动不会影响其他容器的运行环境,可以使应用程序在几乎任何地方以相同的方式运行。
容器是基于镜像启动的,容器中可以运行一个或多个进程。在创建容器进程时,指定了这个进程所需要的Namespace参数,使得容器就只能「看」到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。所以说,容器是一种特殊的进程而已,容器的本质就是进程。
Docker安装
以CentOS 7为例,进行安装Docker。
检查系统内核版本
Docker运行在 CentOS 7上,要求操作系统为 64 位,内核版本为 3.10 及以上。
确认本机已经安装了满足要求的Linux内核。使用命令uname -r
来检查内核版本信息。
[root@localhost ~]# uname -r
3.10.0-957.el7.x86_64
在CentOS 7中安装Docker
使用命令yum install -y docker
安装Docker,“-y”表示不询问,使用默认配置进行安装。
启动Docker服务,并设置为开机自启动
使用下列命令:
systemctl start docker.service
systemctl enable docker.service
查看版本信息
输入docker version
,返回版本信息表明Docker安装成功。
[root@localhost ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64
Experimental: false
Docker实战——Hello World
入门实战怎么能少得了经典的“Hello World”?
拉取镜像
其实DockerHub上已经有了这个镜像,名字叫“hello-world”。直接从DockerHub拉取镜像,命令和Git有些相似:docker pull hello-world
[root@localhost docker]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for docker.io/hello-world:latest
查看镜像
查看拉取到的Docker镜像:docker images
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest fce289e99eb9 5 months ago 1.84 kB
运行镜像
运行镜像:docker run hello-world
。看到打印出如下的内容,代表运行成功。
[root@localhost docker]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Docker常用命令
docker images : 列出本地的镜像
docker pull image_name:拉取镜像。如果没有指定具体的镜像标签,会自动拉取latest标签的镜像。
docker search image_name:在Docker Hub上查找镜像
docker start container:启动和运行容器
docker run [OPTIONS] image_name:基于镜像创建并启动一个容器
常用选项:
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
docker logs container:获取容器的日志信息
docker attach container:进入容器
exit:退出容器
docker exec container command:在运行的容器中执行命令
docker stop container:停止容器
docker rm container:删除容器
docker save -o image_name.tar image_name:导出镜像
docker ps:查看正在运行的容器
docker ps -a:查看系统中容器列表
docker top container:查看容器内的进程
docker stop daemon_dave:停止守护容器
Docker构建镜像
如何构建镜像?
构建一个自己的镜像需要两步:
编写Dockerfile。Dockerfile 告诉Docker如何制作镜像以及每一步是怎样的。
Docker执行Dockerfile中的指令的流程是这样的:- Docker从基础镜像运行一个容器
- 执行一条指令,对容器进行修改
- 提交到一个新的镜像层
- Docker再基于刚才提交的镜像运行一个新容器
- 执行Dockerfile中的下一条指令,知道所有指令执行完毕。
使用docker build命令构建。
编写Dockerfile
每个Dockerfile的第一条命令必须是FROM。FROM指令指定一个已经存在的镜像,告诉Docker后续的指令都是在这个基础上进行的。例如:FROM java:8
MAINTAINER 指令用来标志该镜像所有者和联系方式。例如:MAINTAINER James "×××@example.com"
VOLUME 指令用来向基于镜像创建的容器添加卷。一个卷可以是存在一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供共享数据和数据持久化的功能。
CMD 指令用来指定一个容器启动时要运行的命令。
ENTRYPOINT指令与CMD指令很相似。
WORKDIR 指令用来从镜像创建一个新容器的时候,在容器内部设置一个工作命令,ENTRYPOINT或CMD指令指定的程序会在这个目录下执行。
ENV 指令用来在在镜像构建过程中设置环境变量。例如:ENV TEST_PATH /home/test
RUN 指令用来在当前镜像中运行指定的命令。例如:RUN apt-get install -y nginx
EXPOSE 指令用来告诉Docker该容器内的应用程序将使用容器的指定端口。例如:EXPOSE 80
ADD 指令用来将构建环境下的文件和目录复制到镜像中。 例如:ADD docker-0.0.1-SNAPSHOT.jar app.jar
COPY 指令与ADD 类似,不同点在与COPY只关心在构建上下文中复制本地文件,而不会提取和解压。
LABEL 指令用于为Docker镜像添加元数据。例如:LABEL name=test description="a container is used to test"
Dockerfile实例:
FROM java:8
MAINTAINER James "×××@example.com"
VOLUME /tmp
ADD docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
执行docker build
执行docker build
命令后看到“BUILD SUCCESS”表明构建成功,可以使用docker run
命令来运行了。
总结
本文介绍了Docker是什么、Docker思想、Docker核心概念、Docker安装等内容,看完本文,Docker算是入门了,但是万里长征只走完了第一步,学无止境,共勉。
一文快速入门Docker的更多相关文章
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...
- 一文快速入门Shell脚本_了解Sheel脚本基本命令
通过代码和注释的形式,列举了shell的基础操作,快速入门.shell在线编辑器 注释 单行用#号:多行::<<' 多行注释... '.:<<a 多行注释... a.:< ...
- 30 分钟快速入门 Docker 教程
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 一.欢迎来到 Docker 世界 1. ...
- Docker三十分钟快速入门(上)
一.背景 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃.那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Dock ...
- Docker学习系列(二):Docker三十分钟快速入门(上)
一.背景 最近,Docker技术真是一片火热,它的出现也弥补了虚拟机资源消耗过高的问题,直接让虚拟化技术有了质的飞跃.那么本文我们来聊一聊Docker,和大家一起认识Docker,简单入门Dock ...
- Docker基础修炼1--Docker简介及快速入门体验
本文作为Docker基础系列第一篇文章,将详细阐述和分析三个问题:Docker是什么?为什么要用Docker?如何快速掌握Docker技术? 本系列文章中Docker的用法演示是基于CentOS7进行 ...
- Docker三十分钟快速入门(下)
一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...
- Docker快速入门(二)
上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...
- 【干货合集】Docker快速入门与进阶
收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...
随机推荐
- mfs分布式文件系统,分布式存储,高可用(pacemaker+corosync+pcs),磁盘共享(iscsi),fence解决脑裂问题
一.MFS概述 MooseFS是一个分布式存储的框架,其具有如下特性:(1)通用文件系统,不需要修改上层应用就可以使用(那些需要专门api的dfs很麻烦!).(2)可以在线扩容,体系架构可伸缩性极强. ...
- 区间DP复习
区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [ ...
- 模拟30A 题解
A. 树 联想起远古考试时做的题 记忆的轮廓. 树上走一些步数的期望. 显然可以直接解方程. 然而复杂度$O(qn^3)$,利用树上的性质优化一下, 直接一遍dfs过程中解出来,可以$O(qnlogm ...
- Vs2017添加.NET Standard项目出现黄色未引用的SDK
项目打开文件夹位置,按住shift键,执行dotnet restore命令
- 记一次 HttpClient 死锁问题
原文:http://blog.kail.xyz/post/2019-04-21/tools/httpclient-lock.html 最近遇到一个使用 Apache HttpClient 过程中的问题 ...
- Mybatis的if标签判断空字符串 == 0,参数为0时会自动转为空字符串
对于这个问题,有两种解决办法. 1.当传入的参数有0时,只判断!=null即可. 2.将0转化为String类型,就可以解决这个问题.
- 【转发】SqlServer数据库表生成C# Model实体类SQL语句
已知现有表T1 通过运行下面的sql即可,先配置表名. declare @TableName sysname = 'T1' declare @Result varchar(max) = ' /// & ...
- Java基础 awt Button 鼠标放在按钮上背景颜色改变,鼠标离开背景颜色恢复
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- 面试突击(八)——JVM的结构及内存模型,是怎么划分的?
声明:本文图片均来自网络,我只是进行了选择,利用一图胜千言的力量来帮助自己快速的回忆相关的知识点 0:再上一张Java代码的转换流程图 .java——Java程序员编写,给人看的 .class——Ja ...
- Scrapy爬虫Demo 爬取资讯分类
爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(sys) sys.se ...