Docker入门

Docker入门

本文部分是学习记录,B站UP主鲁斯菲尔的授课内容

https://space.bilibili.com/31137138?spm_id_from=333.788.b_765f7570696e666f.1

有自己的理解记录,如果有异议,欢迎评论指出

1. 简介

Docker类似于虚拟机,但是更强大, 一定程度上替代虚拟机用的

Docker 是使用Google公司推出的Go 语言开发的,属于 操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为 容器

Docker在容器的基础上,进行了进一步的分装,从文件系统,网络互联网到进程隔离等等,极大的简化了容器的创建的创建和维护.并比传统的虚拟机技术更轻便,快捷

Docker 是 C/S 架构(客户端和服务器)

1.1 Docker的概念

1.1.1 计算机软件的分类

  • 系统软件: DOS(Disk Operating System), Windows, Linux, Android, iOS
  • 应用软件:office, 腾讯,微信,淘宝,Docker

应用软件是安装在系统软件之中的

1.1.2 Docker 和传统虚拟化的区别

很明显, Docker 是属于应用软件, 是安装在系统软件中的; 而传统虚拟化是分离宿了主机部分硬件性能模拟出一台服务器, 在其上运行一个完整的系统软件

Docker 容器: 容器没有自己的内核,也没有进行硬件虚拟拆分, 容器内的应用进程直接运行于宿主的内核

从功能上Docker和虚拟机类似, 不同的是虚拟机是一台虚拟的服务器,需要装载操作系统 , 而Docker 则是运行在操作系统上的程序

2. 为什么使用Docker

警告: 下面是一堆文字讲述Docker的强大,有的地方看不懂没关系, 看能看懂的就行,知道Docker厉害就好

2.1 Docker 的优势

  • 更高效的利用系统资源

    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  • 更快速的启动时间

    Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

  • 一致的运行环境

    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

  • 持续交付和部署

    对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

    使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

    而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  • 更轻松的迁移

    由于 Docker 确保了执行环境的一致性,而不用担心运行环境的变化导致应用无法正常运行的情况

  • 更轻松的维护和扩展

    Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,**Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,**既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

    • 应用隔离, 在虚拟机操作系统上安装某个软件可能会导致其他软件的不可用, Docker 可以解决这个问题,实现应用隔离

2.2 Docker容器 对比传统虚拟机

特性容器虚拟机
启动秒级/毫秒级分钟级
硬盘使用一般为MB一般为GB
性能接近原生必然弱于原生
系统支持量单机上千一般几十

3. Docker 使用的相关概念

该块内容可能相对片面, 但是足够入门使用Docker

Docker 使用时可以大体上分为三块: 镜像, 容器, 仓库

3.1 Docker 镜像

Docker 镜像就像 Java中的类, 是一个模型, 无法直接运行

一个镜像可以包含一个完整的操作系统环境,例如: Ubuntu,CentOS; 也可以是一些应用级软件的镜像,例如:Tomcat ,Nginx等

我们可以书写一个DockerFile 文件,通过这个文件创建Docker镜像

3.1.1 DockerFile

获得Docker镜像的方法之二

  • 通过 docker pull XXX 从仓库下载镜像
  • 通过编写 DockerFile 文件, 生成一个Docker镜像

DockerFile 是一个文本文件, 文本内容由一行行指令组成,每一行指令都会创建Docker镜像的一层,最终构成我们需要的Docker镜像, 这可以为开发团队提供一致的开发环境

注意一个镜像不能超过 127 层

当编辑完一个DockerFile通过docker build 来生成Docker镜像

3.1.1.1 DockerFile 常用指令

请务必先跳过这一块, 用到了再回来看看即可
DockerFile指令大全

指令描述
FROM指定基础镜像
MAINTAINER指定镜像维护者信息
RUN用于执行指定脚本命令
CMD指定启动容器时执行的命令
EXPOSE指定容器暴露的端口
ENV指定环境变量
WORKDIR为后续的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目录
ADD将文件从宿主机复制到容器指定位置,同时对压缩文件有自动解压功能
COPY将文件从宿主机复制到容器指定位置
ENTRPOINT设置容器启动时需要运行的命令

3.2 Docker 容器

通过Docker镜像 创建 Docker容器, 容器就像是 Java中的对象

Docker 容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

3.3 Docker 仓库

存放 Docker 镜像的仓库

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

简单来讲, 就是有一个远程的公共的Docker 镜像仓库,里面提供了很多可以直接下载使用的Docker镜像, 我们也可以上传自己的镜像到远程仓库, 有点类似于 Git 和GitHub的感觉

3.4 Docker的关系总结整理

  • 容器与镜像的关系类似于面向对象编程中的对象与类。
Docker面向对象
容器对象
镜像
  • 仓库

    仓库就是一个可以上传下载Docker镜像的地方, 有公开公共的仓库 ,也可以自己搞个私有仓库

4. Docker的架构

看看就行, 看不懂也不影响入门使用

4.1 架构图

在这里插入图片描述

镜像(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 MachineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

5. Linux Ubuntu安装Docker

该块内容完全摘抄自千锋教育,图片部分我再次截图保存了,防止丢失http://www.qfdmy.com/#/courses/lesson/1240364147406635009/1242877435541536769

5.1 准备安装

卸载旧版本

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:

5.2 配置 Docker 镜像加速器

阿里云加速器(推荐)

点击链接获取

官方提供中国区镜像

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

5.3 运行第一个容器

我们以 Nginx 为例,体验 Docker 是如何运行容器的

# 下载镜像
docker pull nginx

# 创建并运行容器
docker run --name nginx-container -p 80:80 -d nginx

浏览器输入虚拟机地址即可访问 Nginx

在这里插入图片描述

6. 使用Docker 部署一个SpringBoot项目

6.1 Idea+Maven打包SpringBoot项目为 jar 包

6.1.1 前置条件(很重要)

首先要确保打包的项目可以正常运行

6.1.2 打包SpringBoot项目

在这里插入图片描述

6.1.2.1 打包结果

在这里插入图片描述

这里是打好的包的位置

6.1.2.2 使用maven打包可能出现的错误

这里最可能出现的错误就是maven配置文件中存在非法的字符, 按照提示删除的可以了

6.2. 阿里云服务器开放所有端口

阿里云服务器有安全组的设置, 如果不放开端口的话,将无法访问, 为了方便简单选择放开全部端口

在这里插入图片描述

6.3 上传 jar 到 Linux系统

这里选用Mobaxterm远程连接工具, 可以直接拖拽上传

这里我将 jar上传至 /opt/dockerdemo 文件夹中

在这里插入图片描述

6.4 创建DockerFile,并生成Docker镜像

# 创建文本文件
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

6.4.1 通过DockerFile创建镜像

docker build -f ./mpdockerfile -t mpdockermirror .
-f  = DockerFile文件路径
-t  = 生成的镜像名
.   = 路径
6.4.1.1 创建镜像成功显示结果

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

6.5 使用Docker镜像创建Docker容器并运行

docker run --name mpdmc1 -d -p  8081:9096 mpdockermirror
# --name 容器名
# -d参数是让容器后台运行 
# -p 是做端口映射,此时将服务器中的8081端口映射到容器中的9096(项目中端口配置的是9096)端口

6.6 公网访问测试

在这里插入图片描述

7. Docker 常用操作命令

只要是操作命令, 无外乎 增删改查

前面的内容并没了列出Docker对于镜像和容器的常用命令,这里列出

7.1 镜像操作命令

  • 下载镜像

    docker pull 镜像名
    
  • 查看已有镜像列表

    docker images
    
  • 删除镜像

    docker rmi 镜像名
    
    • 不能删除容器中存在实例的镜像
  • 查看 Docker 信息

    docker system df 
    

7.1.1 镜像的种类

  • 虚玄镜像

    当软件的版本号一致或迭代时, 上一个版本为虚玄镜像, 可以删除

    最新版本号显示为 latest

  • 中间层镜像

    被依赖的镜像, 显示和虚玄镜像都为 <none> 软件名, 中间层镜像不能删除.

7.2 容器的操作命令

  • 创建并启动容器 (就像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
    
    • 容器就是linux最小的运行环境, 一样使用
    • 退出 ctel + d
    • 终止程序 ctrl + c
  • 清除全部停止运行的容器

    docker container prune
    

8. 回顾

8.1 DockerFile总结

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

Dockerfile 的指令每执行一次都会在 docker 上新建一层。

通过 文件配置 定制自己的镜像 , 一个镜像即可部署项目

8.2 常用命令

指令功能
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拉取镜像

9 Docker Compose 简介

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 来进行编排管理。

9.1 Docker Compose 另开一章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值