一、什么是docker?
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付,测试和部署代码的方法,您可以显着减少编写代码和在生产环境中运行代码之间的延迟。
通俗一点讲: Docker其实就是可以打包程序和运行环境(虚拟机,只能在linux下运行),
把环境和程序一起发布的容器。当你需要发布程序时你可以使用Docker将运行环境一起发布。
二、docker优势劣势
虚拟机和DocKer对比:
1.DocKer 启动速度是虚机万万不敢调戏的了,(这里声明一下,在同一台电脑)。
2.在资源的利用上也比虚机高多了,同一台机器上我相信能跑100台DocKer,咱们肯定不赶跑这么多台虚拟机,有效的节约资源。
3.传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
4.容器内的应用直接运行在宿主机的内部,容器是没有自己的内核的,也没有虚拟硬件,所以轻便
5.每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
应用更快速的交互和部署
传统:一堆帮助文档,安装程序
Docker: 打包镜像发布测试,一键运行
更便捷的升级和扩缩容
更简的系统运维
更高效的计算资源利用
三、docker的历史
2008年,Solomon Hykes与朋友共同创建了名为DotCloud的公司,是一个PaaS(平台即服务 Platform-as-a-Service)提供商,2013年,Docker问世,面向开源,开源之后,Docker迅速火爆,后面公司改名为Docker。
Docker的第一个执行环境是LXC,但从0.9版本开始被Libcontainer取代;LXC叫做LinuX Container,简称Linux的容器,是世界上第一个容器应用,Linux Container提供了在单一可控主机节点上支持多个相互隔离的Server Container同时执行的机制, Libcontainer为Docker封装了Linux提供的基础功能,后面又被RunC代替(runc 是一个 Linux 命令行工具,用于根据 OCI[开放容器联盟]容器运行时规范创建和运行容器)。
四、docker架构
Docker使用客户端-服务器架构。Docker客户端 与Docker守护进程 进行对话,该守护进程 完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。另一个Docker客户端是Docker Compose,它使您可以处理由一组容器组成的应用程序。
五、Docker守护程序
Docker守护程序(dockerd
)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
六、Docker客户端
Docker客户端(docker
)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run
,客户端会将这些命令发送到dockerd
,以执行这些命令。该docker
命令使用Docker API。Docker客户端可以与多个守护程序通信。
七、docker执行过程
名词解释:
①镜像:镜像是只读的文件,提供了运行程序完整的软硬件资源,是应用程序的"集装箱";
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
②容器:是镜像的实例,由 Docker 负责创建,容器之间彼此隔离;
Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的
启动,停止,删除,基本命令!
就目前可以把这个容器理解为一个简易的linux系统
③仓库: 存放镜像的地方
Docker Hub(默认是国外的)远程仓库地址: https://hub.docker.com/
阿里云,,,都有容器服务(配置镜像加速!)
④Docker file: 是一个配置文件 如何构建的步骤 来指定一个镜像是如何构建的,通过Docker build指令可以将Dockerfile构建成一个镜像。
八、centos安装docker
1、首先需要大家虚拟机联网,安装yum工具
bash
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
2、然后更新本地镜像源
bash
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
3、安装docker社区免费版
bash
yum install -y docker-ce
4、启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
bash
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
5、通过命令启动docker
bash
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
配置使用腾讯云 Docker 镜像源加速镜像下载(可跳过)
执行以下命令,打开 /etc/docker/daemon.json 配置文件
vim /etc/docker/daemon.json 按 i 切换至编辑模式,添加以下内容,并保存。
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] }
重启Docker systemctl restart docker
八、ubuntu安装docker
step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
#查看是否安装成功 查看容器的运行情况
docker ps
九、CentOS安装DockerCompose
1.Linux下需要通过命令下载:安装缓慢需要多等一会
bash
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
十、docker映射文件路径
在创建docker容器时,想要与本地 路径进行映射共享文件,使用docker run -v指令,例如我需要将本地的路径**/root/code映射到容器内的/data/code**路径(数据卷),使用如下命令,冒号前为宿主机的路径,冒号后为容器路径,其中xxx为镜像完整的路径
bash
docker run -it -v /root/code:/data/code xxx/bin/bash
十一、使用docker拉取镜像 nginx
1、如果不指定版本则默认拉取最新的镜像版本
bash
docker pull nginx
十二、查看本地docker镜像
bash
docker images
就能看到上面拉取的nginx的镜像了。
十三、运行容器
bash
docker run --name nginx-test -p 8080:80 -d nginx
参数说明:
--name nginx-test:容器名称。
-p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口
-d nginx: 设置容器在在后台一直运行。
列表参数说明:
Repository 镜像名称
Tag 镜像标签
Image Id 镜像 的ID
Created 镜像的创建日期
Size 镜像的大小
**注意:**镜像默认存放位置:/var/lib/docker目录下
1、在宿主机访问虚拟机地址将8080端口即可访问nginx
十四、查看镜像信息
bash
docker inspect 镜像id
十五、镜像命令
1.docker pull nginx:latest 拉取镜像
2.docker images 查看镜像
3.docker run -d -p 81:80 nginx 创建容器
--name="容器新名字":为容器指定一个名称:
-i:以交互模式运行容器,通常于-t一起使用
-t:为容器重新分配一个伪输入终端,通常于-i一起使用
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
4.docker ps 查看正在运行的容器
5.docker ps -a 查看所有的容器(包括没运行的容器)
6.docker exec -it 2d bash 登录容器
-i 让容器的标准输入保持打开
-t 让docker分配一个伪终端并保存到容器的标准输入
7.exit或者Ctrl+D 退出容器
8.docker rm -f 容器id 删除容器
9.docker commit 2d m1 将2d容器保存为m1镜像
10.docker rmi -f 镜像id 删除镜像
11.docker save m2>1.tar 将m1镜像保存到1.tar文件中(备份镜像)
12.docker load < 1.tar 将1.tar文件中加载为镜像(加载镜像)
13.docker tag 添加镜像标签
eg: docker tag nginx:latest nginx:lnmp #给nginx打上标签lnmp,原来的标签是latest
14.docker images -q 查询镜像的id
15.docker rmi `docker images -q` 批量删除所有镜像
16. docker build -t 镜像名称 . dockerfile构建镜像
制作镜像 docker build -t 10.10.1.15:8388/zskj/jenkins/pnpm:v8.15.6 .
最后推送镜像到仓库 docker push 10.10.1.15:8388/zskj/jenkins/pnpm:v8.15.6
17.docker container run 启动新容器
18.docker diff 查看容器文件系统改动详情。
19.docker ps -aq |wc -l 查找容器数量
20. docker info Docker实例的状态和配置
21.docker images grep npm 查询npm相关的镜像
22. docker -v 挂载项目
bash
# 挂载单个
$ docker run ... -v [主机目录]:[容器目录] [镜像名称]
# 挂载多个
$ docker run -v [主机目录1]:[容器目录1] -v [主机目录2]:[容器目录2] -v [主机目录3]:[容器目录3] [镜像名称]
十六、容器命令
1.docker container run
启动新容器的命令。该命令的最简形式接收镜像和命令作为参数。镜像用于创建容器,而命令则是希望容器运行的应用。
docker run -it -d -p 81:80 nginx #命令会在前台启动一个 Ubuntu 容器,并运行 Bash Shell。
2.docker container ls
列出所有在运行(UP)状态的容器。如果使用 -a 标记,还可以看到处于停止(Exited)状态的容器
3.docker container exec
用于在运行状态的容器中,启动一个新进程。该命令在将 Docker 主机 Shell 连接到一个运行中容器终端时非常有用。
eg: docker exec -it 97 bash #登录容器
4.docker container stop
grammer:docker stop container_ID
此命令会停止运行中的容器,并将状态置为 Exited(0)。
提示:该命令通过发送 SIGTERM 信号给容器内 PID 为 1 的进程达到目的。
如果进程没有在 10s 之内得到清理并停止运行,那么会接着发送 SIGKILL 信号来强制停止该容器。
5. docker container start
grammer: docker start container_ID
重启处于停止(Exited)状态的容器。可以在 docker container start 命令中指定容器的名称或者 ID。
6.docker container rm
删除停止运行的容器。可以通过容器名称或者 ID 来指定要删除的容器。推荐首先使用docker container stop 命令停止容器.然后使用 docker container rm 来完成删除(先停止再删除)
7. docker container inspect
显示容器的配置细节和运行时信息。
8、查询指定名称的容器
docker ps -f 'name=npm.*'
9、查询容器的状态
docker inspect --format '{{ .State.Status }}' 7583ada3cf9c(容器id)
十七、DockerFile构建镜像
1.Docker的引擎
Docker Engine(Docker引擎--发动机程序支持的核心组件)是Docker的核心部分,使用的是客户端---服务器(C/S)架构模式。其主要组成部分:
①、docker daemon:Docker的服务端组件,他是Docker架构中运行在后台的一个守护进程,可以接收并处理来自命令行接口及API接口的指令,然后进行相应的后台操作。
②、REST API:表示应用程序API接口,开发者通过该API接口可以与Docker的守护进程进行交互,从而指示后台进行相关操作。
③、docker CLI:表示Docker命令行接口,开发者可以在命令行中使用Docker相关指令与Docker守护进程进行交互,从而管理诸如image(镜像)、container(容器)、network(网络)和data volumes(数据卷)等实体。
2.Docker的底层容器运行原理:
①、客户端发送 docker pull tomcat 命令;
②、命令到达 Docker daemon(守护程序),守护进程首先检查本地是否有该 Tomcat 的镜像,如果没有,则从注册中心(仓库)拉取该镜像;
③、镜像拉取到本地后,客户端执行 docker run 命令,守护程序就会创建容器,启动应用。
Docker架构主要包括Client、Docker_HOST和Register三部分:
- Client(客户端) docker CLI
Client即Docker客户端,也就是上一小节Docker Engine中介绍的docker CLI。开发者通过这个客户端使用Docker的相关指令与Docker守护进程进行交互,从而进行Docker镜像的创建、拉取和运行等操作。
- DOCKER_HOST(Docker主机)
DOCKER_HOST即Docker内部引擎运行的主机,主要指Docker daemon(Docker守护进程)。可以通过Docker守护进程与客户端还有Docker的镜像仓库Registry进行交互,从而管理Images(镜像)和Containers(容器)等。
3.Registry(注册中心)
Registry即Docker注册中心,实质就是Docker镜像仓库,默认使用的是Docker官方远程注册中心Docker Hub,也可以使用开发者搭建的本地仓库。Registry中包含了大量的镜像,这些镜像可以是官网基础镜像,也可以是其他开发者上传的镜像。
我们在实际使用 Docker 时,除了会涉及图中的 3 个主要部分外,还会涉及很多Docker Objects(Docker对象),例如Images(镜像)、Containers(容器)、Networks(网络)、Volumes (数据卷)、Plugins(插件)等。其中常用的两个对象Image和Containers的说明如下。
·Images(镜像)
Docker镜像就是一个只读的模板,包含了一些创建Docker容器的操作指令。通常情况下,一 个Docker镜像是基于另一个基础镜像创建的,并且新创建的镜像会额外包含一些功能配置。 例如:开发者可以依赖于一个 Ubuntu 的基础镜像创建一个新镜像,并可以在新镜像中安装 Apache等软件或其他应用程序。
·Containers(容器)
Docker 容器属于镜像的一个可运行实例(镜像与容器的关系其实与 Java中的类与对象相似),开发者可以通过API接口或者CLI命令行接口来创建、运行、停止、移动、删除一个容器,也可以将一个容器连接到一个或多个网络中,将数据存储与容器进行关联。
3、认识dockerfile
镜像概念
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包组成。
镜像是分层结构,每一层称为一个Layer:
BaseImage: 包含基本的系统函数库、环境变量、文件系统等
Entrypoint: 入口,是镜像中应用启动的命令
其他:在BaseImage 基础上添加依赖、安装程序、完成整个应用的安装和配置
镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
Dockerfile概念
Dockerfile使用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
Dockerfile是自定义镜像的一套规则
Dockerfile由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层
Dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令。
Dockerfile支持以"#"为开头的注释
java
FROM XXX/jdk:8
MAINTAINER docker_user
ENV JAVA_HOME /usr/local/java
ADD apache-tomcat-8.0.32.tar.gz /usr/local/
RUN mv apache-tomcat-8.0.32 tomcat8
EXPOSE 8080
RUN chmod u+x /usr/local/tomcat8/bin/*.sh
CMD /usr/local/tomcat8/bin/catalina.sh start
4.Dockerfile 的基本结构分为4部分
- 基础镜像信息;
- 维护者信息;
- 镜像操作指令;
- 容器启动时执行指令
5.Dockerfile 指令
FROM
格式为 FROM <image> 或 FROM <image>:<tag>
Dockerfile 文件的第一条指令必须为 FROM 指令。
并且,如果在同一个 Dockerfile 中创建多个镜像时,
可以使用多个 FROM 指令(每个镜像一次);
如果from没有该镜像,则从镜像仓库中找
MAINTAINER
格式为 MAINTAINER <name>,指定维护者信息;
ENV
格式为 ENV <key> <value>,指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持;
ADD
格式为 ADD <src> <dest>;
复制指定的<src>到容器中的<dest>;
EXPOSE
格式为 EXPOSE <port> [<port>...]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用,在启动容
器时需要通过 -p 映射端口,Docker 主机会自动分配一个端口转发到
指定的端口;
RUN
格式为 RUN <command>
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用 \ 来换行;
CMD
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。
如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
WORKDIR
作用:切换到镜像中的指定路径,设置工作目录
在 WORKDIR 中需要使用绝对路径,如果镜像中对应的路径不存在,会自动创建此目录
一般用 WORKDIR 来替代 切换目录进行操作的指令
RUN cd <path> && <do something>
WORKDIR 指令为 Dockerfile 中跟随它的任何 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置工作目录
如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也会被创建。
ENTRYPOINT
Entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部。
ENTRYPOINT 有两种格式:
ENTRYPOINT ["executable", "param1", "param2"] (exec 格式,首选)
ENTRYPOINT command param1 param2 (shell 格式)
exec 格式
docker run image 后面跟的命令行参数将会添加到 ENTRYPOINT 所有参数的最后,且会覆盖掉所有 CMD 命令中的参数。这将允许运行时传递参数给 ENTRYPOINT 命令,例如 docker run image -d 会将 -d 参数传给 ENTRYPOINT 命令 。ENTRYPOINT 命令可以通过 docker run --entrypoint 参数来覆盖 。
shell 格式
会忽略所有 CMD 命令的参数和 docker run 的命令行参数,ENTRYPOINT 要运行的命令会作为 /bin/sh -c 的子命令运行,而且 /bin/sh 不会传递信号,也就是说 ENTRYPOINT 要运行的命令不是 PID 为 1 的进程,且不会收到 Unix 信号,所以你要执行的命令不会收到 docker stop 发出的 SIGTERM 信号。
CMD 和 ENTRYPOINT 命令都定义了容器运行时运行命令。下面有几条规则:
Dockerfile 必须有一条 CMD 或 ENTRYPOINT 命令
如果容器作为可执行程序运行,需要指定 ENTRYPOINT 命令,
CMD 命令应该用来定义 ENTRYPOINT 命令的默认参数
十八、通过dockerfile文件自定义java镜像
构建三步骤
1、编写Dockerfile文件
2、docker build命令构建镜像
3、docker run 依镜像运行容器实例
Dockerfile执行流程
- docker 从基础镜像运行一个容器
- 执行一条 指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令,直到所有的指令都执行完成
先下载对应的资料:
链接: https://pan.baidu.com/s/12XXUSOamR1uphXa-pOZl_Q 提取码: h744
镜像制作成功,启动镜像
docker run -d --name dd1 -p 8080:8080 docker-demo 启动成功
docker logs -f dd1 查查容器dd1的启动日志
http://192.168.32.16:8081/hello/count
十九、镜像删除
docker rmi image_id 这里的image_id可以根据docker images 查看
docker rm image_id 删除单个
docekr rmi image_id1/容器名1 image_id2/容器名2
docker rmi -f image_id 强制删除镜像