Docker阳哥系列1—Docker基础(全)
本文最后更新于 460 天前,如有失效请评论区留言。

1 docker 简介

1.1 docker解决了什么问题:

解决了运行环境和配置问题,

方便做持续集成并有助于整体发布。

1.2 容器与虚拟机:

虚拟机的缺点:资源占用多 、冗余步骤多、启动慢

容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

Docker 和传统虚拟化方式的不同之处:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

1.3 docker 的优势:一次构建,随处运行

更快速的应用交付和部署:传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

更便捷的升级和扩缩容:随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

更简单的系统运维:应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

更高效的计算资源利用:Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

2 docker 安装

2.1 前提条件

CentOS 是Docker 安装前提条件,目前CentOS 仅发行版本中的内核支持 Docker,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用 Centos7.x ,查看自己的内核uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

2.2 下载:

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

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

2.3 Docker 的基本组成:

镜像(image):Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。

容器(container):从面向对象角度Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。从镜像容器角度可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库(repository): 仓库(Repository)是集中存放镜像文件的场所。 类似于Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

需要正确的理解仓库/镜像/容器这几个概念:Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。 image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。 镜像文件 image 文件生成的容器实例,本身也是一个文件,称为镜像文件。容器实例 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器仓库* 就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。

2.4 底层原理:为什么docker会比vm虚拟机快

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

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

2.5 安装步骤:

centos 安装docker: https://docs.docker.com/engine/install/centos/

确定系统版本:

cat /etc/redhat-release

卸载旧版本:

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

yum安装gcc相关:

1、centos能链接外网
2、安装gcc依赖
yum -y install gcc
yum -y install gcc-c++

安装需要的软件包:

yum install -y yum-utils

设置stable镜像仓库:

大坑:官网给的国外镜像仓库,我们根本连不上。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 报错:1   [Errno 14] curl#35 - TCP connection reset by peer  2   [Errno 12] curl#35 - Timeout

推荐使用国内镜像仓库:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件包索引

yum makecache fast

安装docekr-ce

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

启动docker

systemctl start docker

测试

docker version
docker run hello-world

卸载

systemctl stop docker 
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

2.6 阿里云镜像加速:

是什么:https://promotion.aliyun.com/ntms/act/kubernetes.html

注册一个阿里云账号(可复用淘宝账号)

获取加速器地址连接

登录阿里云开发者平台-->点击控制台-->选择容器镜像服务-->获取加速器地址

{
  "registry-mirrors": ["https://skg9ytev.mirror.aliyuncs.com"]
}

添加加速器配置

vim  /etc/docker/daemon.json

重启服务器

systemctl daemon-reload
systemctl restart docker

3 docker 常用命令

3.1 帮助启动类命令:

启动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

3.2 镜像命令:

3.2.1 列出本机上的镜像

[root@gitlab ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB 

各个字段说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号IMAGE 
ID:镜像
IDCREATED:镜像创建时间
SIZE:镜像大小

[root@gitlab ~]# docker images -a #列出本地所有的镜像
[root@gitlab ~]# docker images -q #只显示镜像ID

同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

3.2.2 搜索某个镜像

docker search 某个镜像名,(从仓库寻找:https://hub.docker.com)
命令:
--limit 只列出n个镜像
[root@gitlab ~]# docker search mysql  --limit 4 

image-20240927142236333

3.2.3 拉取某个镜像

命令:
docker pull 镜像名字[:TAG]
docker pull 镜像名字
  #没有TAG就是最新版,等价于 docker pull 镜像名字:latest

举例:
[root@gitlab ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete 
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

[root@gitlab ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        latest    ba6acccedd29   2 years ago   72.8MB
hello-world   latest    feb5d9fea6a5   2 years ago   13.3kB

3.2.4 查看镜像/容器/数据卷所占的空间

命令:
docker system df  

举例:
[root@gitlab ~]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         0         72.79MB   72.79MB (100%)
Containers      0         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

3.2.5 删除镜像

命令:
docker rmi

删除单个:docker rmi -f 镜像ID
删除多个:docker rmi -f 镜像ID1:TAG 镜像ID2:TAG
删除全部:docker rmi -f $(docker images -qa)

3.2.6 虚悬镜像

仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image

3.3 容器命令

有镜像才能创建容器,这是根本前提。

下载镜像
[root@gitlab ~]# docker pull centos

新建/启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

#OPTIONS说明(常用):有些是一个减号,有些是两个减号 
--name="容器新名字"       为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行); 
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互); 
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p

#使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash  
参数说明: 
  -i: 交互式操作。
  -t: 终端。
  centos : centos 镜像。
  /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
  要退出终端,直接输入 exit: 

列出容器

docker ps [OPTIONS]

OPTIONS说明(常用): 
  -a :列出当前所有正在运行的容器+历史上运行过的
  -l :显示最近创建的容器。
  -n:显示最近n个创建的容器。
  -q :静默模式,只显示容器编号。

退出容器

方法1:exit
方法2:ctrl+p+q

容器启停

启动容器:docker start 容器ID或者容器名
重启容器:docker restart 容器ID或者容器名
停止容器:docker stop 容器ID或者容器名
强制停止:docker kill 容器ID或者容器名
删除容器:docker rm 容器ID

注意:

1、有镜像才能启动容器

2、启动守护式容器(后台)
  大部分场景,我们希望docker的服务是后台运行的,通过-d指定
  docker run -d 容器名

3、redis启动示例
前台:docker run -it redis:6.0.8
后台:docker run -id  redis:6.0.8

4、查看容器日志
docker logs 容器ID

5、查看容器内运行的进程
docker top 容器ID

6、查看容器内部细节
docker inspect 容器ID

7、进入正在运行的容器并已命令式交互
docker exec -it 容器ID /bin/bash
docker exec -it 容器ID redis-cli

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

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

容器 --> 主机
公式:docker cp  容器ID:容器内路径 目的主机路径 

3.5 导入和导出容器

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

docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

3.6 常用命令

attach    # 当前 shell 下 attach 连接指定运行镜像
build     # 通过 Dockerfile 定制镜像
commit    # 提交当前容器为新的镜像
cp        # 从容器中拷贝指定文件或者目录到宿主机中
create    # 创建一个新的容器,同 run,但不启动容器
diff      # 查看 docker 容器变化
events    # 从 docker 服务获取容器实时事件
exec      # 在已存在的容器上运行命令
export    # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history   # 展示一个镜像形成历史
images    # 列出系统当前镜像
import    # 从tar包中的内容创建一个新的文件系统映像[对应export]
info      # 显示系统相关信息
inspect   # 查看容器详细信息
kill      # kill 指定 docker 容器
load      # 从一个 tar 包中加载一个镜像[对应 save]
login     # 注册或者登陆一个 docker 源服务器
logout    # 从当前 Docker registry 退出
logs      # 输出当前容器日志信息
port      # 查看映射端口对应的容器内部源端口
pause     # 暂停容器
ps        # 列出容器列表
pull      # 从docker镜像源服务器拉取指定镜像或者库镜像
push      # 推送指定镜像或者库镜像至docker源服务器
restart   # 重启运行的容器
rm        # 移除一个或者多个容器
rmi       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run       # 创建一个新的容器并运行一个命令
save      # 保存一个镜像为一个 tar 包[对应 load]
search    # 在 docker hub 中搜索镜像
start     # 启动容器
stop      # 停止容器
tag       # 给源中镜像打标签
top       # 查看容器中运行的进程信息
unpause   # 取消暂停容器
version   # 查看 docker 版本号
wait      # 截取容器停止时的退出状态值 

4 docker 镜像

4.1 docker 是什么

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

分层的镜像: 以我们的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要采用这种分层结构呢: 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.2 重点理解

Docker镜像层都是只读的,容器层是可写的

当容器启动时,一个新的可写层被加载到镜像的顶部。

这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。“容器层”之下的都叫“镜像层”。所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

4.3 docker 镜像commit 操作案例

docker commit提交容器副本使之成为一个新的镜像

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

案例演示ubuntu安装vim
1、从Hub上下载ubuntu镜像到本地并成功运行,原始的默认Ubuntu镜像是不带着vim命令的
外网连通的情况下,安装vim
2、docker容器内执行上述两条命令:
  apt-get update
  apt-get -y install vim  
3、安装完成后,commit我们自己的新镜像 
4、启动我们的新镜像并和原来的对比
  官网是默认下载的Ubuntu没有vim命令
  我们自己commit构建的镜像,新增加了vim功能,可以成功使用。 

4.4 小总结

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层

5 本地镜像发布到阿里云

5.1 镜像的生产方法

基于当前容器创建一个新的镜像,新功能增强

方法一:
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

OPTIONS说明:
  -a :提交的镜像作者;
  -m :提交时的说明文字;本次案例centos+ubuntu两个,当堂讲解一个,家庭作业一个,请大家务必动手,亲自实操。 

方法二:dockerfile (后面学)

5.2 将本地镜像推送到阿里云

阿里云开发者平台:https://promotion.aliyun.com/ntms/act/kubernetes.html

选择控制台,进入容器镜像服务

!
选择个人实例

image-20240927142359740

设置Registry密码 --> 创建命名空间 --> 创建仓库 -->进入管理界面获得脚本

5.2 将镜像推送至阿里云

举例:需输入密码才能登录
docker login --username=zzy registry.cn-hangyss.aliyuncs.com
docker tag cea1bb40441c registry.cn-hangyss.aliyuncs.com/yss/myubuntu:1.1
docker push registry.cn-hangyss.aliyuncs.com/yss/myubuntu:1.1

5.3 从阿里云上下载镜像到本地

docker pull registry.cn-guangzhou.aliyuncs.com/yangshangsong/yangshangsong:[镜像版本号]

6 本地镜像发布到私有库

6.1 什么是容器私有库

(1)官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

(2)Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

(3)Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

6.2 将本地镜像推送至私有仓库

下载镜像 registry

docker pull registry 

运行本地镜像 registry

 docker run -d -p 5000:5000  -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
#默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调

创建一个新镜像centos安装vim,wget命令

1、从Hub上下载Centos镜像到本地并成功运行
2、原始的Centos镜像是不带ifconfig命令
3、外网连通的情况下,安装vim,wget命令
docker容器内执行上述两条命令:
yum update
yum -y install vim
yum -y install wget

4、安装完成后,提交新镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
命令:在容器外执行,记得
docker commit -m="ifconfig cmd add" -a="zzyy" a69d7c825c4f zzyyubuntu:1.2

5、提交完成后,新的镜像默认有vim,wget功能

6.3 验证私有镜像库上有什么镜像

curl -XGET http://192.168.52.199:5000/v2/_catalog
可以看到,目前私服库没有任何镜像上传过。。。。。。

6.4 将新生成的镜像修改符合私服规范的tag

按照公式: docker   tag   镜像:Tag   Host:Port/Repository:Tag
使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.52.199:5000/zzyyubuntu:1.2

docker tag  zzyyubuntu:1.2  192.168.111.162:5000/zzyyubuntu:1.2

6.5 修改配置文件使支持http

registry-mirrors 配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。2个配置中间有个逗号 ','别漏了,这个配置是json格式的。

vim命令新增如下内容:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.111.162:5000"]
}

上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker

6.6 推送镜像到镜像仓库

docker push 192.168.111.162:5000/zzyyubuntu:1.2

curl查看私服上有什么镜像
pull到本地运行

7 docker 容器数据卷

7.1 一个大坑--privileged=true

--privileged=true

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true参数即可  如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

7.2 容器数据卷是什么

1、有点类似我们Redis里面的rdb和aof文件
2、将docker容器内的数据保存进宿主机的磁盘中

运行一个带有容器卷存储功能的容器实例

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

7.3 容器数据卷能干嘛

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

特点:

1:数据卷可在容器之间共享或重用数据;

2:卷中的更改可以直接实时生效,爽;

3:数据卷中的更改不会包含在镜像的更新中;

4:数据卷的生命周期一直持续到没有容器使用它为止。

7.4 容器卷怎么用

宿主vs容器之间映射添加容器卷

#直接命令添加:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录      镜像名

#查看容器卷是否挂载成功:
docker inspect 容器ID  #可以看到以下内容
"Mounts": [
            {
                "Type": "bind",
                "Source": "/root/yss",
                "Destination": "/root",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }

#容器与宿主机之间数据共享:
1  docker修改,主机可以同步获得
2 主机修改,docke可以同步获得
3 docker容器stop,主机修改,docker容器重启,数据也同步获得,说明二者是同一个文件。

容器镜像卷的读写规则映射添加说明

#既然有卷的概念,那么就必然有读写权限
#1、读写权限:rw
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw      镜像名
#注:不配置权限,默认就是读写权限

#2、只读权限:ro
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro      镜像名

#容器实例内部被限制,只能读取不能写
#/容器目录:ro 镜像名 就能完成功能,此时容器自己只能读取不能写   ro = read only 此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

容器卷的继承和共享

#1、容器1与宿主机启动映射
docker run -it  --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu

#2、容器2继承容器1的卷规则
docker run -it  --privileged=true --volumes-from 容器1 --name u2 ubuntu

--volume-from : 共享目标容器的容器镜像卷,可以实现一个配置文件,多个容器共用。

8 docker 常规安装与简介

8.1 总体步骤

1、搜索镜像
2、拉取镜像
3、查看镜像
4、启动容器-端口映射,卷映射
5、停止容器
6、移除容器

8.2 案例1:安装tomcat

1、从docker hup上寻找tomcat镜像
docker search tomcat

2、从docker hub上拉取tomcat镜像到本地
docker pull billygoo/tomcat8-jdk8

3、查看是否有拉取到的tomcat
docker images

4、使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

-p:小写,主机端口:docker容器端口
-P:大写,随机分配端口
 i:交互
 t:终端
 d:后台

5、访问猫首页

image-20240927142740031

8.3 案例2:安装msyql

1、docker hub上面查找mysql镜像
2、从docker hub上(阿里云加速器)拉取mysql镜像到本地,标签为5.7
3、使用mysql5.7镜像创建容器(也叫运行镜像)

简单版本

1、使用msyql镜像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker ps
docker exec -it 容器ID /bin/bash
mysql -uroot -p"123456"

2、建库建表插入数据
3、外部Win10也来连接运行在dokcer上的mysql容器实例服务
4、插入中文数据试试

image-20240927142756687

为什么会报错?
docker上默认字符集编码隐患
docker里面的mysql容器实例查看,内容如下: SHOW VARIABLES LIKE 'character%'

5、删除容器后,里面的mysql数据如何办
容器实例一删除,你还有什么?
删容器到跑路。。。。。?

实战版本

1 新建容器实例(宿主机上会自动创建相关目录)
docker run -id -p 3306:3306 --privileged=true \
-v /data/jumpserver/mysql/log:/var/log/mysql \
-v /data/jumpserver/mysql/data:/var/lib/mysql \
-v /data/jumpserver/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456  \
--name mysql mysql:5.7

2 新建my.cnf,通过容器卷同步给容器实例
[client]
default_character_set=utf8

[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8 

3 重新启动mysql容器实例再重新进入并查看字符编码是utf8。
   之前的DB输入中文无效,修改字符集操作+重启mysql容器实例之后的DB输入中文有效,但是表需要新建。
  结论:docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据。

4 假如将当前容器实例删除,再重新来一次,之前建的db01实例还有吗?trytry

8.4 案例3:安装redis

1 从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
docker pull redis:6.0.8

2 命令提醒,容器卷记得加 --privileged=true
  Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true参数即可

3 在CentOS宿主机下新建目录/root/yss/redis
将一个redis.conf文件模板拷贝进/root/yss/redis目录下

4 使用redis6.0.8镜像创建容器(也叫运行镜像)
 docker run  -p 16379:6379 --name redis --privileged=true \
-v /data/redis2/conf/redis.conf:/etc/redis/redis.conf \
-v /data/redis2/data:/data \
-id redis:6.0.8 
redis-server /etc/redis/redis.conf

5 测试redis-cli连接
docker exec -it 运行着Redis容器ID 
redis-cli

6 验证一下docker启动使用了我们自己指定的配置文件
  修改我们使用的数据库,默认是16
  重启redis容器
  测试redis-cli连接
版权声明:除特殊说明,博客文章均为cuckooyang原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 | 博客订阅:RSS | 广告招租:留言板 | 博客VPS |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇