Docker的基本概念
Docker的基本概念
1.什么是容器?
先来看看容器较为官方的解释:
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
如果需要通俗的描述容器的话,容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。
2.容器 VS 虚拟机
简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
虚拟机技术:是虚拟出一套计算机硬件后,在这套硬件上安装并运行一个完整的操作系统,然后就可以像使用一台真实计算机一样,在该机器上安装被运行各种应用。
容器技术:是一个共享操作系统内核的虚拟化技术。不会虚拟化硬件,容器的运行要依赖于宿主的内核,容器内没有自己的内核。因此容器要比传统虚拟机更为轻便。
容器与虚拟机 (VM) 总结
- 容器: 用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
- 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢 。
两者有不同的使用场景,虚拟机更擅长于彻底隔离整个运行环境。
并且两者也可以共存的:
3 什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上。
英文官网:
中文社区:
4 Docker的优点
(1) 上手快、体积小、性能高
用户只需要几分钟,就可以把自己的程序"Docker化"。就可以创建容器来运行程序了,大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
(2)职责的逻辑分类
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题 (测试环境都是正常,一上线就出问题肯定是运维的问题)
(3)快速高效的开发生命周期
Docker的目标之一就是是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可一致性,易于构建,并易于协作。(通俗点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取)
(4)鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单。
5.Docker中的基础概念
1.Docker服务器与客户端
Docker是一个客户端/服务端(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发送请求,服务器或者守护进程完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套的Restful API。 你可以在同一台宿主机上运行Docker守护进程和客户端。也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程
2.Docker的组件
镜像(Image)——一个特殊的文件系统
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)——镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
注册中心(Registry)——集中存放镜像仓库的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository);
每个仓库可以包含多个标签(Tag);
每个标签对应一个镜像。
所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。
Docker Registry 分为 公开服务和私有服务的概念:
Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。
最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。在国内访问Docker Hub可能会比较慢国内也有一些云服务商提供类似于Docker Hub的公开服务。
Image镜像操作
1 查看镜像
# 查看本地已有的镜像
docker images
根据仓库名字和标记来列出本地镜像,
#列出"centos"仓库中的所有镜像:
docker images centos
2 查找镜像
# 查询在注册中心中有没有需要的镜像。
docker search [选项] 关键字
示例:
列出Docker Hub上包含“centos”关键字的的镜像:
docker search centos
该命令一般只用于查看是否存在拥有关键字的镜像。
- NAME:仓库名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
3 拉取镜像
#从注册中心上拉取下载需要的镜像。
docker pull 镜像名称[:标记]
【示例】
(1)拉取centos仓库中的镜像
docker pull centos
docker pull 注册中心/仓库名字:标记
docker pull centos
docker镜像名字组成:注册中心/仓库名字:标记
,如:docker.io/library/centos:7.6.1810
但如果是从官方docker hub下载镜像,可以省略注册中心,可以写成:仓库名字:标记
,例如centos:7.6.1810
标记一般是类似于版本号的组成方式,它支持x.y.z
语义化版本方式,并能自动识别。
比如拉取镜像操作中的使用:
centos:7.6.1810----->下载的就是7.6.1810
centos:7.6 ------->下载7.5.最高版本 的版本
centos:7 ------->下载7系列最高的版本
centos:6 ------->下载6系列最高的版本
centos:latest ------->下载最高的版本
centos ------->下载最高的版本,省略版本号时就是latest
如果要下载指定版本的镜像,可以执行命令:
docker pull centos:7.6.1810
对于本案例,标记不写,将使用默认的标记latest,即下载的是centos最新版本,即相当于下载的命令为:
docker pull centos:latest
因为最新版本不断的会更新,因此,企业中使用Docker一般会使用完整的语义化版本的标记方式。
4 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
【示例】
删除centos的镜像
# 通过镜像的名字删除
docker rmi centos
# 通过镜像ID删除
docker rmi fce289e99eb9
删除所有镜像(慎用)
docker rmi `docker images -q`
Container容器操作
1 查看容器
docker ps [OPTIONS]
【示例】
(1)列出所有正在运行的容器:
docker ps
(2)显示所有容器,包括正在运行的和停止的。
docker ps -a
2 容器的创建
语法:
docker run [选项] 镜像名称:版本号 [命令] [ARG...]
常用选项:
-i: 表示创建好容器后直接运行容器
--name: 创建容器的名称
-v: 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录的映射。注意:做好映射后,最好在宿主机中更改文件
-t: 表示容器启动后会进入其命令行。加入这两个参数后,容器创建好后就能登录到容器中。并分配一个伪终端
-d: 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样容器创建后,就不会登陆到容器中)
-p: 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
根据平时的使用方式,我们分别以交互式容器和守护式容器的创建来讲解:
(一)交互式容器
创建一个用于测试的容器,容器创建成功后自动分配伪终端,可进行人机交互。
创建运行一个centos的容器:
docker run -it --name=mycentos centos /bin/bash
#或
docker run -i -t --name=mycentos centos /bin/bash
# 退出容器
exit
bash:分配伪终端时要在容器上执行的命令,这里使用的linux的bash脚本命令,该命令完整写法为`/bin/bash`。
提示:
`run`和镜像名字之间的选项没有顺序,但命令必须放到镜像名字之后。
优点:
创建完容器后,自动运行容器,并可以直接进入到子容器系统中操作了,主要用于测试使用。
缺点:
当退出子容器后,该容器会自动停止运行。
(二)守护式容器:
创建一个需要长期运行的容器,就可以创建一个守护式容器(后台运行的容器),下面的命令用于在后台创建运行容器并打印容器ID:
docker run -id --name=mycentos2 centos:7.6.1810
#或
docker run -id --name mycentos2 centos:7.6.1810
- -d:在后台运行容器并打印容器ID。
登录守护式容器方式:
docker exec -it container_name (或者 container_id) /bin/bash(exit退出时,容器不会停止)
比如:
方式1:使用名字进入
docker exec -it mycentos2 bash
[root@2c32a5cb4a71 /]#
方式2:使用id进入
docker exec -it 2c32a5cb4a71 bash
[root@2c32a5cb4a71 /]#
优点:
从守护式容器中退出,并不影响容器的运行。
缺点:
必须的手动命令进入到容器。
小结:
【理解】
run命令的本质是两个命令的结合:create+start
3 容器的停止启动挂起
一、容器的停止
# 停止一个或多个正在运行的容器
docker stop 容器名称/容器ID
二、容器的启动
# 启动一个或多个停止的容器
docker start 容器名称/容器ID
三、重启容器
# 重启一个或多个容器
docker restart 容器名称/容器ID
四、暂停容器
docker pause 容器名称/容器ID
四、取消暂停容器
docker unpause 容器名称/容器ID
4 文件的拷贝
说明:
在容器和本地文件系统之间复制文件/文件夹。
# 如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
如:将宿主机的文件拷贝到mycentos2中
#在宿主机上创建一个空文件test.txt
touch test.txt
#将test.txt拷贝到mycentos2容器的根目录中:
docker cp test.txt mycentos2:/
验证效果:进入到容器中,可以查看到刚拷贝的文件。
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录或文件 需要拷贝的文件或目录
如:从mycentos2容器拷贝文件到宿主机器的当前目录中:
#在宿主机先删除test.txt文件
rm -f test.txt
#将mycentos2容器中的根目录的test.txt拷贝到宿主机的当前目录中:
docker cp mycentos2:/test.txt ./
5 目录挂载
说明:
宿主机的目录的挂载映射到容器中。
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
语法:
docker run -v `宿主机目录`:`容器目录` image
- -v:将当前工作目录装载到容器中。绑定装载卷的宿主机目录不存在时,Docker会自动在宿主机上为您创建这个目录。
【示例】
将宿主机上的/root/myvolume
目录挂载到mycentos3
中的/myvolume
目录中:
#进入到宿主机目录,建立新目录和新的文件:
#mkdir myvolume
docker run -id --name=mycentos3 -v /root/myvolume:/myvolume centos:7.6.1810
或
docker run -id --name=mycentos3 -v $(pwd)/myvolume:/myvolume centos:7.6.1810
提示:宿主机的目录必须是以/
或~
开头。
6 容器的删除
# 删除一个或多个容器
docker rm 容器名称/容器ID
【示例】
(1)先停止运行的mycentos3的容器,再删除它。
docker stop mycentos3
docker rm mycentos3
提示:
上述命令默认只能删除停止了的容器。若容器是启动的状态,则可以先停止容器,再删除。
(2)直接强制删除正在运行的mycentos2容器
docker rm -f redis
#或者
docker rm --force redis
(3)强制删除所有的容器
docker rm -f `docker ps -qa`
#或
docker rm -f $(docker ps -a -q)
Dockerfile构建镜像
什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础(原始)镜像并最终创建一个自定义的新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
常用命令(参考)
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
EXPOSE port1 prot2 | 用来指定端口,使容器内的应用可以通过端口和外界交互 |
CMD argument | 在构建容器时使用,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 入口点,容器启动后会执行的命令,比如启动mysql。效果和CMD相似,但是并不会被docker run指定的参数覆盖 |
VOLUME | 将本地文件夹或者其他容器的文件挂载到容器中 |
使用脚本创建镜像
目标:创建一个安装有jdk1.8的spring-boot-docker项目的镜像
步骤:
(1)创建目录,用来存放脚本、要安装的资源等。
mkdir -p /home/docker
(2)创建文件Dockerfile,并上传Dockerfile到 /home/docker目录中
FROM java:8
VOLUME /tmp
ADD springboot-docker-0.0.1-SNAPSHOT.jar /heima.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","heima.jar"]
(3)上传springboot-docker-0.0.1-SNAPSHOT.jar到 /home/docker目录中
(4)执行命令构建镜像
参考命令:
# 注意后边的空格和点,不要省略
docker build -t heima .
执行情况:
[root@localhost docker]# docker build -t heima .
Sending build context to Docker daemon 25.82MB
Step 1/4 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
---> d23bdf5b1b1b
Step 2/4 : VOLUME /tmp
---> Running in d6e40917cef9
Removing intermediate container d6e40917cef9
---> 847c80860254
Step 3/4 : ADD springboot-docker-0.0.1-SNAPSHOT.jar /heima.jar
---> effd171b8b8b
Step 4/4 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","heima.jar"]
---> Running in 570c787d9cee
Removing intermediate container 570c787d9cee
---> 624d7e1ba47d
Successfully built 624d7e1ba47d
Successfully tagged heima:latest
运行:
docker run -d -p 8081:8081 heima
访问:
此项目已上线,感兴趣点击:https://tool.u3uyoo.ltd/
整合IntelliJ
修改pom,在properties中 加入
<properties>
<java.version>1.8</java.version>
<!--docker镜像的前缀-->
<docker.image.prefix>itcast</docker.image.prefix>
</properties>
加入插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<dockerHost>http://192.168.206.99:2375</dockerHost>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
复制Dockerfile到:src/main/docker中:
执行清理,打包
推荐一下个人的公众号:
【注】在微信里搜索“满目山河m”或者微信扫描二维码都可以关注微信公众号。