学会Docker这一篇就够了

前言

Docker是一个快速交付应用、运行应用的技术:
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
启动、移除都可以通过一行命令完成,方便快捷

Docker和虚拟机的差异:
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

安装

安装教程

基础概念

镜像
将应用程序及其依赖、环境、配置打包在一起
容器
镜像运行起来就是容器,只是Docker会给容器做隔离,对外不可见,一个镜像可以运行多个容器
Docker结构:
服务端:接收命令或远程请求,操作镜像或容器
客户端:发送命令或者请求到Docker服务端
DockerHub
DockerHub是一个Docker镜像的托管平台,类似的还有阿里云镜像服务,统称为DockerRegistry
在这里插入图片描述

Docker基本操作

镜像操作

DockerHub镜像仓库
镜像名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像
在这里插入图片描述

docker images 查看镜像
docker rmi 删除镜像
docker pull 从服务拉取镜像
docker push 推送镜像到服务
docker save 保存镜像为一个压缩包 例如:docker save -o redis.tar redis:latest
docker load 加载压缩包为镜像 例如: docker load -i redis.tar
docker build 构建镜像
在这里插入图片描述

例子 :简单拉取nginx

  • 首先去镜像仓库搜索nginx镜像,比如DockerHub

在这里插入图片描述

  • 根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx ,未指定版本默认 latest最新

在这里插入图片描述

  • 通过命令:docker images 查看拉取到的镜像

在这里插入图片描述

容器操作

docker ps 查看所有运行的容器及状态 , -a 查看全部容器
docker logs -f 查看容器运行日志, 添加 -f 参数可以持续查看日志
docker exec 进入容器执行命令

docker exec -it mn bash

docker exec :进入容器内部,执行一个命令
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn :要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令

docker rm 删除指定容器, -f 强制删除
docker run 创建并运行容器,

docker run --name containerName -p 80:80 -d nginx

--name : 给容器起一个名字,比如叫做mn
-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx

docker start 启动容器
docker pause 暂停容器,不回收内存
docker unpause 取消暂停
docker stop 停止容器,释放内存
在这里插入图片描述

例子:使用docker创建redis并放条数据

docker run --name myredis -p 6379:6379 -d redis redis-server --appendonly yes

在这里插入图片描述

docker exec -it myredis bash
redis-cli

在这里插入图片描述

数据卷

容器与数据耦合的问题
1)不便于修改 :当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
2)数据不可复制:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
3)升级维护难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
默认存放:/var/lib/docker/volumes
核心: 将容器中的某个目录挂载到数据卷volumes进行关联,本质是和主机的/var/lib/docker/volumes进行关联,即便容器删除主机中的文件也不会删除,并且实现了多个容器间的数据共享。
在这里插入图片描述

操作数据卷

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume
  • inspect 显示一个或多个volume的信息, docker inspect html html是数据卷的名字
  • ls 列出所有的volume
  • prune 删除未使用的volume
  • rm 删除一个或多个指定的volume

在这里插入图片描述

挂载数据卷

-v volumeName: /targetContainerPath
docker volume create html
docker run --name xx -p 80:80 -v html:/usr/share/nginx/html -d nginx
# /usr/share/nginx/html 这个目录在官方镜像中告诉我们的

docker run :就是创建并运行容器
– name mn :给容器起个名字叫mn
-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
-p 8080:80 :把宿主机的8080端口映射到容器内的80端口
nginx :镜像名称

挂载后容器内的文件,会自动跑到主机目录,如果容器运行时volume不存在,会自动被创建出来。

宿主机目录挂载

核心: 与volume相比,它需要你自己去配指挂载的目录
案例:
提示:目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
实现思路如下:
1)在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像
2)创建目录/tmp/mysql/data
3)创建目录/tmp/mysql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/mysql/conf
4)去DockerHub查阅资料,创建并运行MySQL容器,要求:

  • 挂载/tmp/mysql/data到mysql容器内数据存储目录
  • 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
  • 设置MySQL密码
    在这里插入图片描述

在这里插入图片描述

总结
docker run的命令中通过 -v 参数挂载文件或目录到容器中:
-v volume名称:容器内目录
-v 宿主机文件:容器内文件
-v 宿主机目录:容器内目录

`
数据卷挂载与目录直接挂载的
数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

自定义镜像

镜像是分层结构,每一层称为一个Layer
BaseImage层:包含基本的系统函数库、环境变量、文件系统
Entrypoint:入口,是镜像中应用启动的命令
其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
在这里插入图片描述

什么是Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
在这里插入图片描述

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

总结

Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
Dockerfile的第一行必须是FROM,从一个基础镜像来构建
基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值