Docker基础学习
作用概述
虚拟机的缺点
- 资源占用非常多
- 冗余步骤多
- 启动慢
容器化技术
并不是模拟一个完整的操作系统,有以下区别:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行应用
- 容器内的应用直接运行在宿主机的内核,容器没有自己的内核,也没有虚拟硬件,所以轻便
- 每个容器间互相隔离,每个容器内都有一个自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档、安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用Docker可以简化部署应用,就跟搭积木一样
- 升级环环境时:用了docker可以将各种技术打包整体升级
- 扩展:项目被打包成一个镜像,可以直接从一个服务器迁移到另一个,直接运行
更简单的系统运维
容器化后,开发测试环境高度一致
更高效的计算资源利用
Docker是 内核级别的虚拟化,可以在一个物理机上可以运行很多个容器实例,可以极致地利用服务器性能
入门
镜像与容器
当利用docker安装应用时,docker会自动搜索并下载应用镜像(image)
镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库
docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库
存储和管理镜像的平台,docker官方维护了一个公共仓库:Docker Hub
命令解读
以部署mysql为例
1 | docker run -d \ |
- docker run:创建并运行一个容器,-d是让容器在后台运行
- –name mysql:给容器起名字,必须唯一
- -p:设置端口映射(宿主机端口映射到容器内端口),第一个为宿主机容器,第二个为容器内部端口(容器的具有自己的网络空间,有自己的ip地址,但对外不可访问,将宿主机端口映射到容器端口时,访问宿主机的端口就会转到容器的端口)
- -e KEY=VALUE:是设置环境变量(可以在docker hub上找到对应镜像所需的环境变量)
- mysql:指定运行的镜像名称
镜像命名规范
- 镜像名称一般分为两部分:[repository]:[tag]
- 其中repository就是镜像名
- tag为镜像版本,未指定时默认为latest,即最新版
基础
常见命令
Reference documentation | Docker Docs
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
来查看
实例理解
1.DockerHub中搜索Nginx
nginx - Official Image | Docker Hub
2.拉取Nginx镜像
3.查看本地镜像列表
4.创建并运行Nginx实例
5.查看容器
6、7.停止容器并再次启动
8.进入Nginx容器
- -it:添加一个可输入的终端(用于进入容器后与之交互)
- bash:用bash交互
9.删除容器
不能直接删除运行中的容器
强制删除(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创建数据卷,docker就会在宿主机上创建数据卷对应的目录
- 同时让容器内相应的目录和数据卷做挂载,从而实现了宿主机文件系统和容器内文件的双向绑定,两端能够互相影响
相关指令
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | |
docker volume ls | 查看所有数据卷 | |
docker volume rm | 删除指定数据卷 | |
docker volume inspect | 查看某个数据卷的详情 | |
docker volume prune | 清除数据卷 |
- 在执行
docker run
命令时,使用-v 数据卷:容器内的目录
可以完成数据卷挂载 - 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
继续案例
去DockerHub官网上查找Nginx的介绍:
本地目录挂载
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程
类比理解镜像的构建
部署一个java应用的步骤
- 准备一个linux服务器
- 安装JRE并配置环境变量
- 拷贝Jar包
- 运行Jar包
构建一个Java镜像的步骤
- 准备一个linux运行环境
- 安装JRE并配置环境变量
- 拷贝Jar包
- 编写运行脚本
我的理解
在本地开发应用的过程中,我们的应用运行需要依赖于我们开发的环境
但是并非所有人都有和我们一样的环境去支持该应用的运行
为了在更多平台上使用,我们在打包时需要写好相关的内容,并编写运行脚本,从而在镜像构建过程中搭建好应用所需的环境,从而让应用正常运行
镜像结构
入口(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之间有空格)