本文部分是学习记录,B站UP主鲁斯菲尔的授课内容
https://space.bilibili.com/31137138?spm_id_from=333.788.b_765f7570696e666f.1
有自己的理解记录,如果有异议,欢迎评论指出
Docker类似于虚拟机,但是更强大, 一定程度上替代虚拟机用的
Docker 是使用Google公司推出的Go 语言开发的,属于 操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为 容器 。
Docker在容器的基础上,进行了进一步的分装,从文件系统,网络互联网到进程隔离等等,极大的简化了容器的创建的创建和维护.并比传统的虚拟机技术更轻便,快捷
Docker 是 C/S 架构(客户端和服务器)
- 系统软件: DOS(Disk Operating System), Windows, Linux, Android, iOS
- 应用软件:office, 腾讯,微信,淘宝,Docker
应用软件是安装在系统软件之中的
很明显, Docker 是属于应用软件, 是安装在系统软件中的; 而传统虚拟化是分离宿了主机部分硬件性能模拟出一台服务器, 在其上运行一个完整的系统软件
Docker 容器: 容器没有自己的内核,也没有进行硬件虚拟拆分, 容器内的应用进程直接运行于宿主的内核
从功能上Docker和虚拟机类似, 不同的是虚拟机是一台虚拟的服务器,需要装载操作系统 , 而Docker 则是运行在操作系统上的程序
警告: 下面是一堆文字讲述Docker的强大,有的地方看不懂没关系, 看能看懂的就行,知道Docker厉害就好
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过
Dockerfile
来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。而且使用
Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。更轻松的迁移
由于 Docker 确保了执行环境的一致性,而不用担心运行环境的变化导致应用无法正常运行的情况
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,**Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,**既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
- 应用隔离, 在虚拟机操作系统上安装某个软件可能会导致其他软件的不可用, Docker 可以解决这个问题,实现应用隔离
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级/毫秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 必然弱于原生 |
系统支持量 | 单机上千 | 一般几十 |
该块内容可能相对片面, 但是足够入门使用Docker
Docker 使用时可以大体上分为三块: 镜像, 容器, 仓库
Docker 镜像就像 Java中的类, 是一个模型, 无法直接运行
一个镜像可以包含一个完整的操作系统环境,例如: Ubuntu,CentOS; 也可以是一些应用级软件的镜像,例如:Tomcat ,Nginx等
我们可以书写一个DockerFile 文件,通过这个文件创建Docker镜像
获得Docker镜像的方法之二
- 通过
docker pull XXX
从仓库下载镜像- 通过编写 DockerFile 文件, 生成一个Docker镜像
DockerFile 是一个文本文件, 文本内容由一行行指令组成,每一行指令都会创建Docker镜像的一层,最终构成我们需要的Docker镜像, 这可以为开发团队提供一致的开发环境
注意一个镜像不能超过 127 层
当编辑完一个DockerFile通过
docker build
来生成Docker镜像
请务必先跳过这一块, 用到了再回来看看即可
DockerFile指令大全
指令 | 描述 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 指定镜像维护者信息 |
RUN | 用于执行指定脚本命令 |
CMD | 指定启动容器时执行的命令 |
EXPOSE | 指定容器暴露的端口 |
ENV | 指定环境变量 |
WORKDIR | 为后续的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目录 |
ADD | 将文件从宿主机复制到容器指定位置,同时对压缩文件有自动解压功能 |
COPY | 将文件从宿主机复制到容器指定位置 |
ENTRPOINT | 设置容器启动时需要运行的命令 |
通过Docker镜像 创建 Docker容器, 容器就像是 Java中的对象
Docker 容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
存放 Docker 镜像的仓库
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用
push
命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull
下来就可以了。
简单来讲, 就是有一个远程的公共的Docker 镜像仓库,里面提供了很多可以直接下载使用的Docker镜像, 我们也可以上传自己的镜像到远程仓库, 有点类似于 Git 和GitHub的感觉
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
仓库
仓库就是一个可以上传下载Docker镜像的地方, 有公开公共的仓库 ,也可以自己搞个私有仓库
看看就行, 看不懂也不影响入门使用
镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
---|---|
容器(Container) | 容器是独立运行的一个或一组应用。 |
客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
该块内容完全摘抄自千锋教育,图片部分我再次截图保存了,防止丢失http://www.qfdmy.com/#/courses/lesson/1240364147406635009/1242877435541536769
卸载旧版本
apt-get remove docker docker-engine docker.io containerd runc
使用 APT 安装
apt install docker.io
查看docker 信息
docker version
# 输出如下
Client:
Version: 19.03.6
API version: 1.40
Go version: go1.12.17
Git commit: 369ce74a3c
Built: Fri Feb 28 23:45:43 2020
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 19.03.6
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: 369ce74a3c
Built: Wed Feb 19 01:06:16 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6-0ubuntu1~18.04.2
GitCommit:
runc:
Version: spec: 1.0.1-dev
GitCommit:
docker-init:
Version: 0.18.0
GitCommit:
阿里云加速器(推荐)
点击链接获取
官方提供中国区镜像
https://registry.docker-cn.com
配置加速器
以配置阿里云加速器为例,首先 登录阿里云(没有账号请先注册),搜索 容器镜像服务
找到你的专属加速器
通过修改 daemon 配置文件 /etc/docker/daemon.json
来使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
docker info
# 输出如下
Client:
Debug Mode: false
Server:
Containers: 15
Running: 12
Paused: 0
Stopped: 3
Images: 24
Server Version: 19.03.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version:
runc version:
init version:
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-96-generic
Operating System: Ubuntu 18.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.767GiB
Name: docker-services
ID: YZSB:WJFB:RS4K:V22L:IVGK:GZVZ:UQL4:MCCR:MQ4X:6HRE:T5RM:53M5
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://k7da99jp.mirror.aliyuncs.com/
https://dockerhub.azk8s.cn/
https://registry.docker-cn.com/
Live Restore Enabled: false
WARNING: No swap limit support
我们以 Nginx 为例,体验 Docker 是如何运行容器的
# 下载镜像
docker pull nginx
# 创建并运行容器
docker run --name nginx-container -p 80:80 -d nginx
浏览器输入虚拟机地址即可访问 Nginx
首先要确保打包的项目可以正常运行
这里是打好的包的位置
这里最可能出现的错误就是maven配置文件中存在非法的字符, 按照提示删除的可以了
阿里云服务器有安全组的设置, 如果不放开端口的话,将无法访问, 为了方便简单选择放开全部端口
这里选用Mobaxterm远程连接工具, 可以直接拖拽上传
这里我将 jar上传至 /opt/dockerdemo 文件夹中
# 创建文本文件
vi mpdockerfile
# DockerFile内容
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER hkzl
# 将jar包添加到容器中并更名为app.jar
ADD mpdemo-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
CMD java -jar app.jar
docker build -f ./mpdockerfile -t mpdockermirror .
-f = DockerFile文件路径
-t = 生成的镜像名
. = 路径
root@hkzl:/opt/dockerdemo# docker build -f ./mpdockerfile -t mpdockermirror .
Sending build context to Docker daemon 36.13MB
Step 1/4 : FROM java:8
---> d23bdf5b1b1b
Step 2/4 : MAINTAINER hkzl
---> Using cache
---> ae9d68f3bda9
Step 3/4 : ADD mpdemo-0.0.1-SNAPSHOT.jar app.jar
---> 92f1142fcb51
Step 4/4 : CMD java -jar app.jar
---> Running in 95dba72bb76a
Removing intermediate container 95dba72bb76a
---> 777a4947cf38
Successfully built 777a4947cf38
Successfully tagged mpdockermirror:latest
docker run --name mpdmc1 -d -p 8081:9096 mpdockermirror
# --name 容器名
# -d参数是让容器后台运行
# -p 是做端口映射,此时将服务器中的8081端口映射到容器中的9096(项目中端口配置的是9096)端口
只要是操作命令, 无外乎 增删改查
前面的内容并没了列出Docker对于镜像和容器的常用命令,这里列出
下载镜像
docker pull 镜像名
查看已有镜像列表
docker images
删除镜像
docker rmi 镜像名
查看 Docker 信息
docker system df
虚玄镜像
当软件的版本号一致或迭代时, 上一个版本为虚玄镜像, 可以删除
最新版本号显示为 latest
中间层镜像
被依赖的镜像, 显示和虚玄镜像都为
软件名, 中间层镜像不能删除.
创建并启动容器 (就像java中new对象并使用)
docker run -p8080:8080 --name mytomcat -d tomcat
docker run 基于镜像实例化容器
-p 8080:8080 对外提供服务必须有端口, 左边为宿主机端口, 右边为容器端口,访问服务通过宿主机ip 端口映射到docker容器
– name 自定义的容器名
-d 后台运行
软件名 镜像名
查看运行中的容器
docker ps
查看所有的容器
docker ps -a
停止容器运行
docker stop 容器id/容器名
开启容器运行
docker start 容器id/容器名
删除容器
docker rm 容器id/容器名
无法删除正在运行的容器
-f 可以强制删除正在运行的容器
docker rm -f 容器id
容器交互 ( 进入容器 )
docker exec -it 容器id /bin/bash
清除全部停止运行的容器
docker container prune
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 的指令每执行一次都会在 docker 上新建一层。
通过 文件配置 定制自己的镜像 , 一个镜像即可部署项目
指令 | 功能 |
---|---|
docker build -f 文件路径 -t 镜像名 . | DockerFile构建Docker镜像 |
docker run --name 容器名 -d -p 服务器端口:容器端口 镜像名 | 通过镜像创建并启动容器 |
docker images | 查看镜像列表 |
docker start 容器名 | 启动容器 |
docker stop 容器名 | 停止运行容器 |
docker ps -a | 查看所有正在运行的容器 |
docker ps | 查看所有容器 |
docker rm 容器名 | 删除容器 |
docker rm $(docker ps -a -q) | 删除所有容器 |
docker rmi -f $(docker images -q) | 强制删除所有镜像 |
docker pull | 拉取镜像 |
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
其代码目前在 https://github.com/docker/compose 上开源。
Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(Project)。Compose 中有两个重要的概念:
- 服务 (Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。