作用概述

虚拟机的缺点

Docker基础学习1

  1. 资源占用非常多
  2. 冗余步骤多
  3. 启动慢

容器化技术

Docker基础学习2
并不是模拟一个完整的操作系统,有以下区别:

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行应用
  • 容器内的应用直接运行在宿主机的内核,容器没有自己的内核,也没有虚拟硬件,所以轻便
  • 每个容器间互相隔离,每个容器内都有一个自己的文件系统,互不影响

DevOps(开发、运维)

应用更快速的交付和部署
传统:一堆帮助文档、安装程序
Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容
使用Docker可以简化部署应用,就跟搭积木一样

  1. 升级环环境时:用了docker可以将各种技术打包整体升级
  2. 扩展:项目被打包成一个镜像,可以直接从一个服务器迁移到另一个,直接运行

更简单的系统运维
容器化后,开发测试环境高度一致

更高效的计算资源利用
Docker是 内核级别的虚拟化,可以在一个物理机上可以运行很多个容器实例,可以极致地利用服务器性能

入门

镜像与容器

当利用docker安装应用时,docker会自动搜索并下载应用镜像(image)
镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库
docker会在运行镜像时创建一个隔离环境,称为容器(container)

镜像仓库

存储和管理镜像的平台,docker官方维护了一个公共仓库:Docker Hub

Docker基础学习3

命令解读

以部署mysql为例

1
2
3
4
5
6
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ = Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD = 123 \
mysql
  • docker run:创建并运行一个容器,-d是让容器在后台运行
  • –name mysql:给容器起名字,必须唯一
  • -p:设置端口映射(宿主机端口映射到容器内端口),第一个为宿主机容器,第二个为容器内部端口(容器的具有自己的网络空间,有自己的ip地址,但对外不可访问,将宿主机端口映射到容器端口时,访问宿主机的端口就会转到容器的端口)
  • -e KEY=VALUE:是设置环境变量(可以在docker hub上找到对应镜像所需的环境变量)
  • mysql:指定运行的镜像名称

镜像命名规范

  • 镜像名称一般分为两部分:[repository]:[tag]
    • 其中repository就是镜像名
    • tag为镜像版本,未指定时默认为latest,即最新版

基础

常见命令

Reference documentation | Docker Docs

Docker基础学习4

systemctl start docker:此命令用于启动 Docker 服务。

systemctl stop docker :此命令用于停止 Docker 服务。

systemctl restart docker:此命令用于重启 Docker 服务。

systemctl status docker:此命令用于查看 Docker 服务的当前状态。

systemctl enable docker:此命令用于设置 Docker 服务在系统启动时自动运行。

docker pull: 将镜像仓库中的镜像拉取到本地

docker push:将本地镜像推到仓库

docker images : 查看本地有哪些镜像

docker rmi:移除本地镜像

docker build:根据写好的dockerfile构建自己的镜像

docker save:把镜像打包成一个压缩文件

docker load:把save的文件加载到镜像当中

docker run:创建并运行容器(镜像不存在时会先去自动拉取)

docker stop:停止容器中的进程(但是容器还在)

docker start:启动容器中停止的进程

docker ps:查看当前容器的运行状态

docker rm:删除容器

docker log:查看容器运行日志

docker exec:执行命令进入容器内部(exit退出)

对于某些命令的具体使用,可以在命令末尾加入--help来查看

实例理解

Docker基础学习5

1.DockerHub中搜索Nginx

nginx - Official Image | Docker Hub
Docker基础学习6

2.拉取Nginx镜像

Docker基础学习7

3.查看本地镜像列表

Docker基础学习8

4.创建并运行Nginx实例

Docker基础学习9

5.查看容器

Docker基础学习10

6、7.停止容器并再次启动

Docker基础学习11

8.进入Nginx容器

  • -it:添加一个可输入的终端(用于进入容器后与之交互)
  • bash:用bash交互
    Docker基础学习12

9.删除容器

Docker基础学习13
不能直接删除运行中的容器
强制删除(docker rm container_name -f)

命令别名

有些命令过长不方便写,可以设置别名

1
vi ~/.bashrc

在该文件下可以为指令添加别名,例如

1
alias rm = 'rm -i' #前面为别名,''内为原始命令

别名添加后通过下面的指令让别名生效

1
source ~/.bashrc

数据卷

案例

  • 创建Nginx容器,修改Nginx容器内的html目录下的index.html文件,查看变化
  • 将静态资源部署到Nginx的html目录

概念

数据卷(volume)是一个虚拟目录,是容器内目录和宿主机目录之间映射的桥梁。
它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据
Docker基础学习14

如何挂载数据卷

  • 使用docker创建数据卷,docker就会在宿主机上创建数据卷对应的目录
  • 同时让容器内相应的目录和数据卷做挂载,从而实现了宿主机文件系统和容器内文件的双向绑定,两端能够互相影响

相关指令

命令 说明 文档地址
docker volume create 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷
  • 在执行docker run命令时,使用 -v 数据卷:容器内的目录 可以完成数据卷挂载
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

继续案例

去DockerHub官网上查找Nginx的介绍:
Docker基础学习15

本地目录挂载

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程

类比理解镜像的构建

部署一个java应用的步骤

  1. 准备一个linux服务器
  2. 安装JRE并配置环境变量
  3. 拷贝Jar包
  4. 运行Jar包

构建一个Java镜像的步骤

  1. 准备一个linux运行环境
  2. 安装JRE并配置环境变量
  3. 拷贝Jar包
  4. 编写运行脚本

我的理解

在本地开发应用的过程中,我们的应用运行需要依赖于我们开发的环境
但是并非所有人都有和我们一样的环境去支持该应用的运行
为了在更多平台上使用,我们在打包时需要写好相关的内容,并编写运行脚本,从而在镜像构建过程中搭建好应用所需的环境,从而让应用正常运行

镜像结构

Docker基础学习16

入口(Entrypoint)

镜像运行入口,一般是程序启动的脚本和参数

层(Layer)

添加安装包、依赖、配置等,每次操作都会形成新的一层

基础镜像(BaseImage)

应用依赖的系统函数库、环境、配置、文件等

Dockerfile语法

  • Dockerfile是一个文本文件,包含一个个的指令,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像,常见指令如下:
    Dockerfile reference | Docker Docs
    常见指令如下:
指令 说明 示例
From 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./jrell.tar.gz /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

构建镜像

当编写好了Dockerfile,可以利用下面的命令构建镜像:

1
docker build -t myImage:1.0 .

-t:是给镜像起名字,格式依然是repository:tag的格式,不指定tag默认为latest
.:是指Dockerfile所在目录,如果就在当前目录则指定为”.”(.和tag之间有空格)