Docke学习笔记

Docke学习笔记

一、docker简介

学习之前先思考一个问题:为什么会出现docker?

假如我们在本地开发一个项目,该项目有特定的配置,如jdk 1.8,mysql 8.x+,还有一系列的支持文件,如果项目开发完毕后,在本机运行成功,但是运维人员运行失败,运维人员本机的配置不一致,运维人员想要成功运行还需配备与开发人员相同的配置,这样势必会产生环境配置的开销。

为了确保应用能够在不同环境中运行,并且在部署过程中不出现令人头疼的版本、配置问题,docker诞生了,docker给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。

举例:假如你需要搬家,新家的环境与旧环境大概率不一样,因此整理行李的时候避免不了会丢弃一些生活用品,到了新家也需要重新规划。因此何不直接搬房子(假定可行),这样就避免了额外的整理,你只需要找一块平地即可。docker就充当这个房子的角色。

Docker三要素:仓库、镜像、容器。

  • 仓库:类似于maven仓库,存放镜像的地方。
  • 镜像(文件):Mysql、Redis都可以是一个镜像(类似于java中的一个Book类)。
  • 容器(实例):镜像的一个实例(类似于new Book()的一个实例)。

Docker官网:http://www.docker.com

Docker Hub官网: https://hub.docker.com/


二、CentOS-7安装Docker

安装前准备:

如果之前安装过docker,需将docker卸载干净

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

官网卸载说明:https://docs.docker.com/engine/install/centos/

1 查看gcc环境

在这里插入图片描述

2 安装gcc环境(有则跳过)

yum -y install gcc
yum -y install gcc-c++ 

3 安装docker库,官网要求

yum install -y yum-utils

在这里插入图片描述

4 设定本地仓库

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述

5 更新yum软件包索引

yum makecache fast

6 安装docker ce(即docker community editor社区版)

docker engine分为docker CE和docker EE,docker ce为docker community editor,docker ee为docker enterprise editor。即,一个为社区版一个为企业版。也就是说,如果要使用最新的docker,就只有用docker ce或者docker ee。

yum -y install docker-ce docker-ce-cli containerd.io

在这里插入图片描述

7 启动docker

systemctl start docker

8 查看安装的docker

docker version

在这里插入图片描述


三、镜像加速配置

登录阿里云->控制台->左上角点击三横线列表->找到容器镜像服务->左边镜像工具->镜像加速器,然后复制镜像加速器。

在这里插入图片描述

1 创建文件夹,mkdir -p用于创建多级文件夹

mkdir -p /etc/docker

2 创建daemon.json文件

vim  /etc/docker/daemon.json 

加入如下:

#阿里云,复制上面复制的链接
{
  "registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
} 

然后保存,退出。

或者采用便捷指令:会自动把配置加入该文件

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF   

3 重启服务器

systemctl daemon-reload
systemctl restart docker

注意:如果重启docker报错:

在这里插入图片描述

并且查看docker运行状态,也显示没有启动:

在这里插入图片描述

解决:

进入到etc/docker文件夹,把daemon.json改成daemon.conf即可

cd /etc/docker
mv daemon.json daemon.conf

在这里插入图片描述

4 测试hello world

docker run hello world

在这里插入图片描述

发现第一个指令,给出提示之后就报错了。run 干了什么?

在这里插入图片描述

结合上图分析,运行第一条指令时(docker run hello world),由于本地及docker hub仓库里都没有hello world镜像,因此报错了,而运行第二天指令(docker run hello-world),由于我之前运行过一次,所以自动下载了这个镜像,因此能成功运行。


四、浅谈底层原理

docker类似于vm ware虚拟机,vm ware虚拟机是在windows/mac上模拟一个linux系统,需要使用到windows的硬件资源,docker更像是一个安装在linux里的软件。

1 docker有着比虚拟机更少的抽象层

由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

2 docker利用的是宿主机的内核,而不需要加载操作系统OS内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。


五、docker常用命令
  • 帮助启动类命令

启动docker: systemctl start docker

停止docker: systemctl stop docker

重启docker: systemctl restart docker

查看docker状态: systemctl status docker

开机启动: systemctl enable docker

查看docker概要信息: docker info

查看docker总体帮助文档: docker --help

查看docker命令帮助文档: docker 具体命令 --help

  • 镜像命令

1 docker images:列出本地主机上的镜像

docker images -a //列出本地所有的镜像(含历史映像层)
docker images -p //只显示镜像ID

在这里插入图片描述

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签版本号

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

2 docker search 镜像名:查找docker hub上该镜像是所有

docker search 镜像名 //从https://hub.docker.com该镜像网站查找镜像,一般下载第一个
docker search --limit 5 镜像名 //只列出5个该镜像,默认25个   

在这里插入图片描述

NAME:镜像名称

DESCRIPTION:镜像说明

STARS:点赞数量

OFFICIAL:是否是官方的

AUTOOMATED:是否是自动构建的

3 docker pull 镜像名:下载镜像

docker pull 镜像名字 : 版本号 //没有版本号默认下载latest最新版

4 docker system df:查看镜像/容器/数据卷所占的空间

5 docker rmi 镜像ID:删除某个镜像

docker rmi 镜像ID    //删除某个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG    //删除多个镜像
docker rmi -f $(docker images -qa)    //直接运行,删除全部镜像
  • 容器命令

1 运行容器

docker run 
--name="容器新名字" 
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
-i:以交互式模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用    
-P:随机端口映射,大写P
-p:指定端口映射,小写p

例:在docker中安装一个ubuntu,并且返回一个窗口操作此ubuntu

docker run -it ubuntu /bin/bash

在这里插入图片描述

如上图所示已经进入了ubuntu系统。

2 查看运行的容器

docker ps

3 退出容器

ducker run进去的,可采用exit退出并停止容器,采用组合键ctrl + p + q退出但不停止容器。

4 启动已停止运行的容器

docker start 容器ID或者容器名

5 重启容器

docker restart 容器ID或者容器名

6 停止容器

docker stop 容器ID或者容器名

7 强制停止容器

docker kill 容器ID或容器名

8 删除已停止的容器

docker rm 容器ID
//一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

9 查看容器日志

docker logs 容器ID

注意:有镜像才有容器,这是根本前提。

10 查看容器内运行的进程

docker top 容器ID

11 查看容器内部细节

docker inspect 容器ID

12 进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell
(docker exec -it 容器ID /bin/bash)    

13 attach 与 exec的区别

docker attach 容器ID 与 docker exec 容器ID

  • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
  • exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
  • 推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

14 从容器内拷贝文件到主机上

docker cp  容器ID:容器内路径 目的主机路径

15 导入和导出容器

  • export 导出容器的内容留作为一个tar归档文件[对应import命令]
  • import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

案例:

假如把docker中的某个容器打成一个tar包,进行备份。

docker export 容器ID > 文件名.tar //tar包在当前执行指令的目录

假如需要迁移至另一台服务器的docker中

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 //镜像用户可随便写

就完成了容器的备份。

注意:此处备份的这个镜像,再次以docker run启动的时候,有可能会报错,百度许久,网上有人说这可能是docker的一个bug,废话不多说,直接上我的报错和我的解决方案!

在这里插入图片描述

解决方案:在run后增加额外前台运行指令即可,如bash、top、ping等

docker run -itd fll/redis:6.0.8 bash

在这里插入图片描述


六、docker镜像之深入理解

镜像

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

每一个容器都可以看着简易版的linux环境。

分层的镜像

当我们在pull某个镜像的时候,会看到docker的镜像好像是在一层一层的下载。UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

docker commit

docker提交一个容器使之形成一个新的镜像。

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

例如,在docker里pull一个centos或ubuntu镜像,这个精简的centos/ubuntu系统是没有额外的功能的,比如vim指令都没有,因此可以手动在里面安装vim指令后进行commit


七、本地镜像发布到阿里云

1 首先在阿里云进行配置:

控制台->容器镜像服务->实例列表(点进个人版)->命名空间(创建一个命名空间)->镜像仓库(创建镜像仓库,命名空间选择刚创建的命名空间)。

创建镜像仓库的时候注意:地区可选离自己最近的地区,创建镜像仓库下一点过后选择本地仓库。

在这里插入图片描述

2 创建本地仓库成功后会弹出一个页面,根据该页面提示直接复制指令即可。

在这里插入图片描述

3 设置仓库密码

在这里插入图片描述

4 docker images查看docker中的所有镜像

在这里插入图片描述

这里将演示把这个redis发布到阿里云镜像仓库。

5 登录(指令早上图步骤2中,直接复制)

docker login --username=我是一只小松鼠 registry.cn-shenzhen.aliyuncs.com

在这里插入图片描述

6 选择具体的镜像

docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/oldfoo/my_docker_images:[镜像版本号]

ImageID、镜像版本号,改为docker中的镜像一致即可。

7 推送至阿里云镜像仓库

docker push registry.cn-shenzhen.aliyuncs.com/oldfoo/my_docker_images:[镜像版本号]

8 可以在阿里云镜像仓库查看上传的镜像

在这里插入图片描述

9 删除docker里的镜像,尝试从阿里云镜像仓库拉取下来

docker rmi -f 镜像ID

10 拉取阿里云镜像仓库上的镜像

docker pull registry.cn-shenzhen.aliyuncs.com/oldfoo/my_docker_images:[镜像版本号]

在这里插入图片描述


八、本地镜像发布到私有库

已经有了docker hub和阿里云这样的公共仓库,为什么还要引入私有库这个东西?

1、docker hub服务器在国外,国内访问太慢了,有被阿里云所取代的趋势。

2、docker hub和阿里云都是公共镜像仓库,对于一些涉及机密的公司,不可能把自己的镜像发布在公共平台供别人使用。

所以需要创建一个本地私人仓库供团队内部使用,基于公司内部项目搭建镜像。

1 下载私有库registry

docker pull registry //下载私有库registry

2 运行私有库Registry,相当于本地有个私有Docker hub

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

默认情况,仓库被创建在容器的/var/lib/registry目录下。

3 查看私有库是否有镜像

curl -XGET http://192.168.91.8:5000/v2/_catalog

在这里插入图片描述

显示没有。

4 将新镜像修改符合私服规范的Tag

docker tag 镜像:Tag Host:Port/Repository:Tag
docker tag redis:latest 192.168.91.8:5000/redis:latest

5 修改/etc/docker/daemon.conf

//加入 "insecure-registries": ["192.168.91.8:5000"]
告诉虚拟机本机的5000端口是可用的,可以接受。

如果未生效,可重启docker。

6 push推送到私服库

docker push 192.168.91.8:5000/fllredis:6.0.8

步骤6报错了,百度的帖子都是daemon.json,但是会有报错,按照百度解决方案。需把daemon.json该为daemon.conf,但是这个步骤老是报错,此处先不演示,后期我找到问题所在后会及时更新笔记。

7 可再次查看镜像是否push成功

curl -XGET http://192.168.91.8:5000/v2/_catalog

8 从私有库拉取镜像

docker pull 192.168.91.8:5000/镜像名:版本号

九、docker容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的,Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能保存数据在docker中我们使用卷。

//docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /temp/host_data:/temp/docker_data --name=u1 ubuntu

此时在主机的/temp/host_data路径下创建/删除一个文件,会自动及时拷贝或删除docker里/temp/docker_data路径下的文件。

查看挂载的地方:

docker inspect 容器id

此处跳过更多讲解,经做一点描述。


十、DockerFile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

官网:https://docs.docker.com/engine/reference/builder/

构建三步骤

  • 编写Dockerfile文件

  • docker build命令构建镜像

  • docker run依镜像运行容器实例

1 DockerFile构建过程解析

​ 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

​ 2:指令按照从上到下,顺序执行

​ 3:#表示注释

​ 4:每条指令都会创建一个新的镜像层并对镜像进行提交

2 Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器作出修改

(3)执行类似docker commit的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像运行一个新容器

(5)执行Dockerfile中的下一条指令直到所有指令都执行完成

3 Dockerfile关键字解释:

dockerhub镜像仓库里,每一个镜像反解析都是一个Dockerfile,例如如下dockerhub展示tomcat9,基于jdk8镜像的Dockerfile:
https://github.com/docker-library/tomcat/blob/9fd0c865c16751a144216186720dae7cfc9113bd/9.0/jdk8/temurin-jammy/Dockerfile

请添加图片描述
关键字解释:
(1) FROM: 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM。
(2) MAINTAINER: 镜像维护者的姓名和邮箱地址。
(3) RUN: 容器构建时需要运行的命令,一般有两种格式,shell格式,exec格式。
(4) EXPOSE: 当前容器对外暴露出的端口。
(5) WORKDIR: 指定在创建容器后,终端默认登录进来的工作目录,就是一个落脚点。
(6) USER: 指定该镜像以什么样的用户去执行,如果都不指定,默认是root。
(7) ENV:
(8) VOLUME: 容器数据券,用于数据保存和持久化工作。
(9) ADD: 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包。
(10) COPY: 类似于ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置。
(11) CMD: 指定容器启动后要干的事,也存在两种格式:shell、exec,且Dockerfile中有多个cmd指令,但只有最后一个生效,CMD会被docker run最后一个参数替换。
CMD和RUN的区别:CMD是在docker run时运行,RUN是在docker build时运行。
DockerFile案例:centos镜像安装jdk8 + vim + ifconfig
(12) ENTRYPOINT: 也是用来指定一个容器启动时要运行的命令,类似于CMD命令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。

4 Dockerfile案例演示:安装centos7镜像,并且具备vim+ifconfig+jdk8三个环境。
(1) 编写Dockerfile文件:

FROM centos
MAINTAINER oldfoo@163.com

ENV MYPATH /usr/local
WORKDIR $MYPATH

#修改yum源,否则底下yum会报错
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "自定义Dockerfile=====>success"
CMD /bin/bash

(2)构建Dockerfile,指令:(注意结尾TAG后面有个 · )

构建时须保证Dockerfile文件和jdk压缩包在同一文件夹下

docker build -t 新镜像名字:TAG .
例如:docker build -t my-centos:1.0 .

总共20个步骤,每个步骤都执行完成则最终构建完成,也出现了事先在Dockerfile文件中定义的那句话。
请添加图片描述
查看镜像,已出现自定义构建的my-centos:
请添加图片描述

(3)验证构建的镜像my-centos:1.0
请添加图片描述
发现vim命令能正常使用,java环境也安装好了,验证成功。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值