当前位置: 首页 > news >正文

Docker与微服务实战(基础篇)

Docker与微服务实战(基础篇)

  • 1、Docker简介
  • 2、Docker安装步骤
    • 1.Centos7及以上的版本
    • 2.卸载旧版本
    • 3.yum安装gcc相关
    • 4.安装需要的软件包
    • 5.设置stable镜像仓库【国内aliyun】
    • 6.更新yum软件包索引--以后安装更快捷
    • 7.安装Docker-Ce
    • 8.启动Docker
    • 9.测试
    • 10.卸载
    • 11.配置阿里云镜像加速
  • 3.Docker常用命令
    • 帮助启动类命令
    • 镜像命令
      • 面试题:谈谈虚悬镜像是什么,怎么删除?
    • 容器命令【演示用ubuntu】
      • 1.拉取镜像
      • 2.新建+启动容器
      • 3.启动交互式容器(前台命令行)
      • 4.列出当前所有正在运行的容器
      • 5.退出容器--两种退出方式
      • 6.启动已停止运行的容器
      • 7.重启容器
      • 8.停止容器
      • 9.强制停止容器
      • 10.删除已停止的容器
    • 下载一个Redis6.0.8镜像演示
      • 1.启动守护式容器(后台服务器)
      • 2.前台交互式启动【不建议】
      • 3.查看容器日志
      • 4.查看容器内运行的进程
      • 5.查看容器内部细节
      • 6.进入正在运行的容器并以命令交互
      • 7.从容器内拷贝文件到主机上
      • 8.导入和导出容器
    • 常用命令小结
  • 4.Docker镜像
    • 分层的镜像
    • UnionFS联合文件系统
    • Docker镜像加载原理
    • 为什么Docker镜像采用这种分层结构呢?
    • 重点理解
    • docker镜像commit操作案例--演示ubuntu安装vim
    • 总结
  • 5.本地镜像发布到阿里云
    • 本地镜像发布到阿里云流程
    • 镜像的生成方法
    • 将本地镜像推送到阿里云
    • 将阿里云的镜像下载本地
  • 6.CentOS7安装DockerCompose
    • 6.1.下载
    • 6.2.修改文件权限
    • 6.3.Base自动补全命令:
  • 7.本地镜像发布到私有库--Docker Registry
    • 1.下载镜像--创建registry容器并开放端口
    • 2.案例演示创建一个新镜像,ubuntu安装ifconfig命令
    • 3.curl验证私服库上有什么镜像
    • 4.将新镜像ubuntu;修改符合私服规范的Tag
    • 5.修改配置文件使之支持http-配置Docker信任地址
    • 6.带有图形化界面版本--更改私有库
    • 7.push推送到私服库
    • 8.curl验证私服库上有什么镜像
    • 9.pull到本地并运行
  • 8.Docker容器数据卷
    • 1.运行一个带有容器卷存储功能的实例
    • 2.宿主vs容器之间映射添加容器卷
      • 绑定映射目录
      • 查看数据卷是否挂载成功
      • 容器和宿主机之间数据共享
    • 3.容器数据卷读写规则映射添加说明
    • 4.卷的继承和共享
      • 容器1完成和宿主机的映射
    • 容器2继承容器1的卷规则
  • 9.Docker常规安装简介
    • 1.总体步骤
    • 2.安装Tomcat【新版本webapps已改为webapps.dist】
      • 1.docker hub上面查找tomcat镜像
      • 2.从docker hub上拉取tomcat镜像到本地
      • 3.docker images查看是否有拉取到的tomcat
      • 4.使用tomcat镜像创建容器实例(也叫运行镜像)
      • 5.访问猫首页
      • 6.免修改版说明
    • 3.安装mysql:5.7
      • 简单版
        • 1.查询拉取mysql镜像
        • 2.使用mysql镜像
        • 3.建库建表插入数据
        • 4.外部win10连接运行在docker上的Mysql容器实例服务
        • 5.中文字符集问题
    • 实战版本
      • 1.新建mysql容器实例
      • 2.新建my.cnf--通过容器卷同步给mysql容器实例
      • 3.重新启动mysql容器实例再重新进入并查看字符编码
      • 4.再新建库新建表再插入中文测试
    • 4.安装redis
      • 1.下载redis镜像到本地标签为6.0.8
      • 2.入门命令
      • 3.命令提醒:容器卷记得加入 --privileged=true
      • 4.在Centos宿主机下新建目录/app/redis
      • 5.将一个redis.conf文件模板拷贝进/app/redis
      • 6. /app/redis目录下修改redis.conf文件
      • 7.使用redis6.0.8镜像创建容器(也叫运行镜像)
      • 8.测试redis-cli连接上来
      • 9.请证明docker启动使用了我们自己指定的配置文件
      • 10.测试redis-cli连接上来第2次
    • 5.安装Nginx
  • endl

编码开发微服务
上线部署容器化
时时刻刻要监控
devops

1、Docker简介

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

Docker hub 安装docker镜像的仓库
Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

在这里插入图片描述
在这里插入图片描述

2、Docker安装步骤

Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个Linux环境

1.Centos7及以上的版本

uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)

[root@192 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@192 ~]# 
[root@192 ~]# uname -r
3.10.0-1160.el7.x86_64

Docker的基本组成:镜像(image)、容器(container)、仓库(repository)

2.卸载旧版本

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

在这里插入图片描述

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

3.yum安装gcc相关

Centos7能上网yum -y install gccyum -y install gcc-c++

4.安装需要的软件包

在这里插入图片描述

# 国外网址,容易报错,建议不要照着国外安装
sudo yum install -y yum-utils
sudo 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工具

yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken

5.设置stable镜像仓库【国内aliyun】

然后更新本地镜像源:

# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

在这里插入图片描述
在这里插入图片描述

6.更新yum软件包索引–以后安装更快捷

# 更新yum软件包索引
yum makecache fast

7.安装Docker-Ce

在这里插入图片描述
然后输入命令:

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

或者

yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

8.启动Docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

在这里插入图片描述

systemctl start docker  # 启动docker服务systemctl stop docker  # 停止docker服务systemctl restart docker  # 重启docker服务

9.测试

[root@192 docker]# ps -ef | grep docker
root       2001      1  7 13:40 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       2291   1475  0 13:41 pts/0    00:00:00 grep --color=auto docker
[root@192 docker]# 
[root@192 docker]# docker -v
Docker version 24.0.7, build afdd53b
[root@192 docker]# 
[root@192 docker]# docker version

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.卸载

在这里插入图片描述
在这里插入图片描述

# 关闭docker
sudo systemctl stop dockersudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras# 卸载第三方库包
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

11.配置阿里云镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
https://promotion.aliyun.com/ntms/act/kubernetes.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://hjisj8si.mirror.aliyuncs.com"]
}
EOF# 查看文件内容
cat /etc/docker/daemon.json sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker

在这里插入图片描述

3.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

镜像命令

# 列出本地主机上的镜像
docker images
#列出本地所有的镜像(含历史映像层)
docker images -a
# 只显示镜像ID
docker images -q# 查找镜像
docker search [POTIONS]镜像名字
#只列出N个镜像,默认是25个
docker search --limit
#只列出5个redis镜像
docker search --limit 5 redis# 下载镜像
docker pull 镜像名字[:TAG]   {TAG:镜像的标签版本号}
#没有TAG就是最新版本
docker pull 镜像名字
docker pull 镜像名字:latest
docker pull ubuntu
docker pull redis:6.0.8# 查看镜像/容器/数据卷所占的空间
docker system df#删除某个镜像
docker rmi 某个镜像名字ID
#强制删除某个镜像
docker rmi -f 某个镜像名字ID
#强制删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
#强制删除多个镜像
docker rmi -f $(docker images -qa)

在这里插入图片描述
在这里插入图片描述

面试题:谈谈虚悬镜像是什么,怎么删除?

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

在这里插入图片描述
对于这样的虚悬镜像一定要删除。

查看虚悬镜像命令

docker images ls -f dangling=true

命令结果:

在这里插入图片描述

这种虚悬镜像已经失去了存在价值,可以删除。

删除虚悬镜像命令:

docker image prune

在这里插入图片描述

容器命令【演示用ubuntu】

下载一个ubuntu或者Centos镜像演示

1.拉取镜像

#拉取镜像
docker pull centos
docker pull ubuntu

2.新建+启动容器

#新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字"     为容器指定一个名称;
-d : 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i : 以交互模式运行容器,通常与-t同时使用;
-t : 为容器重新分配一个伪输入终端,通常与-i同时使用;也即启动交互式容器(前台有伪终端,等待交互);

3.启动交互式容器(前台命令行)

#启动交互式容器(前台命令行) 
docker run -it ubuntu bash
docker run -it ubuntu /bin/bash
docker run -it --name=myu1 ubuntu bash

4.列出当前所有正在运行的容器

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

5.退出容器–两种退出方式

#退出容器--两种退出方式
exit  run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止

6.启动已停止运行的容器

#启动已停止运行的容器
docker satrt 容器ID或者名字

7.重启容器

#重启容器
docker resatrt 容器ID或者名字

8.停止容器

#停止容器
docker stop 容器ID或者名字

9.强制停止容器

#强制停止容器
docker kill 容器ID或者名字

10.删除已停止的容器

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

下载一个Redis6.0.8镜像演示

1.启动守护式容器(后台服务器)

docker pull redis:6.0.8
#启动守护式容器(后台服务器)
-d : 表示服务后台运行模式
docker run -d 容器名

2.前台交互式启动【不建议】

#前台交互式启动【不建议】
docker run -it redis:6.0.8
#启动后台守护式启动(后台运行)
docker run -d redis:6.0.8

3.查看容器日志

#查看容器日志
docker logs 容器ID

4.查看容器内运行的进程

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

5.查看容器内部细节

#查看容器内部细节
docker inspect 容器ID

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

#进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell
或者重新进入【不建议】:
docker attach 容器ID
attach : 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
exec : 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
e58709da98ef   redis     "docker-entrypoint.s…"   14 minutes ago   Up 14 minutes   6379/tcp   vigilant_williams
[root@192 soft]# docker exec -it e58709da98ef /bin/bash
root@e58709da98ef:/data# 
root@e58709da98ef:/data# redis-cli -p 6379
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> exit
root@e58709da98ef:/data# exit
exit
[root@192 soft]# 

在这里插入图片描述

在这里插入图片描述

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

#从容器内拷贝文件到主机上
容器->主机
docker cp 容器ID:容器内路径 目的主机路径

在这里插入图片描述

[root@192 soft]# docker run -it ubuntu /bin/bash
root@38933ab36249:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@38933ab36249:/# pwd
/
root@38933ab36249:/# cd /tmp
root@38933ab36249:/tmp# touch a2024.txt
root@38933ab36249:/tmp# ll
total 0
drwxrwxrwt. 1 root root 23 Jan  7 10:11 ./
drwxr-xr-x. 1 root root 17 Jan  7 10:08 ../
-rw-r--r--. 1 root root  0 Jan  7 10:11 a2024.txt
root@38933ab36249:/tmp# 
[root@192 soft]# 
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
38933ab36249   ubuntu    "/bin/bash"               3 minutes ago    Up 3 minutes               boring_brahmagupta
e58709da98ef   redis     "docker-entrypoint.s…"   27 minutes ago   Up 27 minutes   6379/tcp   vigilant_williams
[root@192 soft]# docker cp 38933ab36249:/tmp/a2014.txt /app/soft
Error response from daemon: Could not find the file /tmp/a2014.txt in container 38933ab36249
[root@192 soft]# docker cp 38933ab36249:/tmp/a2024.txt /app/soft
Successfully copied 1.54kB to /app/soft
[root@192 soft]# 
[root@192 soft]# ll
总用量 2761172
-rw-r--r--. 1 root root          0 17 18:11 a2024.txt[root@192 soft]# docker exec -it 38933ab36249 /bin/bash
root@38933ab36249:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@38933ab36249:/# exit
exit
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
38933ab36249   ubuntu    "/bin/bash"               6 minutes ago    Up 6 minutes               boring_brahmagupta
e58709da98ef   redis     "docker-entrypoint.s…"   31 minutes ago   Up 31 minutes   6379/tcp   vigilant_williams
[root@192 soft]# 

8.导入和导出容器

#导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tarimport 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号cat ubuntu-001.tar | docker import - user/ubuntu:001

在这里插入图片描述

[root@192 soft]# docker rm -f 38933ab36249
38933ab36249
[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS      NAMES
e58709da98ef   redis     "docker-entrypoint.s…"   39 minutes ago   Up 39 minutes   6379/tcp   vigilant_williams
[root@192 soft]# 
[root@192 soft]# cat ubuntu-001.tar | docker import - user/ubuntu:001
sha256:d7ff238c9005c659f4c5819554181bf5c5e56e15c2ad36db66af1acb347423fe
[root@192 soft]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
user/ubuntu   001       d7ff238c9005   15 seconds ago   72.8MB
redis         latest    7614ae9453d1   2 years ago      113MB
ubuntu        latest    ba6acccedd29   2 years ago      72.8MB
redis         6.0.8     16ecd2772934   3 years ago      104MB
[root@192 soft]# docker run -it d7ff238c9005 /bin/bash
root@493bd15c2a4c:/# cd /tmp
root@493bd15c2a4c:/tmp# ll
total 0
drwxrwxrwt. 2 root root 23 Jan  7 10:11 ./
drwxr-xr-x. 1 root root 18 Jan  7 10:26 ../
-rw-r--r--. 1 root root  0 Jan  7 10:11 a2024.txt
root@493bd15c2a4c:/tmp# 
[root@192 soft]# 

常用命令小结

attach  Attach to a running container  #当前shell 下 attach 连接指定运行镜像
build   Build an image from a Dockerfile  #通过Dockerfile定制镜像
commit  Create a new image from a container changes   #提交当前容器为新的镜像
Copy    files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create  Create a new container  #创建一个新的容器,同run,但不启动容器
diff    Inspect changes on a container's filesystem  #查看docker容器变化
events  Get real time events from the server  #从docker服务获取容器实时事件
exec    Run a command in an existing container #在已存在的容器上运行命令
export  Stream the contents of a container as a tar archive #导出容器的内容流作为一个tar归档文件[对应import]
history Show the history of an image #展示一个镜像形成历史
images  List images #列出系统当前镜像
import  Create a new filesystem image from the contents of a tarball #从tar包中的内容创建一个新的文件系统映像[对应expor]
info    Display system-wide information #显示系统相关信息
inspect Return low-level information on a container #查看容器详细信息
kill    Kill a running container  # kill指定docker容器
load    Load an image from a tar archive #从一个tar包中加载一个镜像[对应save]
login   Register or Login to the docker registry server #注册或者登陆一个docker源服务器logout  Log out from a Docker registry server #从当前Docker registry退出
logs    Fetch the logs of a container #输出当前容器日志信息
port    Lookup the public-facing port which is NAT-ed to PRIVATE_PORT #查看映射端口对应的容器内部源端口
pause   Pause all processes within a container  #暂停容器
ps      List containers#列出容器列表
pull    Pull an image or a repository from the docker registry server #从docker镜像源服务器拉取指定镜像或者库镜像
push    Push an image or a repository to the docker registry server #推送指定镜像或者库镜像至docker源服务器
restart Restart a running container #重启运行的容器
rm      Remove one or more containers #移除一个或者多个容器
rmi     Remove one or more images #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run     Run a command in a new container #创建一个新的容器并运行一个命令
save    Save an image to a tar archive #保存一个镜像为一个tar包[对应load]
search  Search for an image on the Docker Hub #在docker hub中搜索镜像
start   Start a stopped containers #启动容器
stop    Stop a running containers #停止容器
tag     Tag an image into a repository #给源中镜像打标签
top     Lookup the running processes of a container #查看容器中运行的进程信息
unpause Unpause a paused container #取消暂停容器
version Show the docker version information #查看docker版本号
wait    Block until a container stops, then print its exit code #截取容器停止时的退出状态值

4.Docker镜像

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

分层的镜像

以我们的pu为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载>
在这里插入图片描述

UnionFS联合文件系统

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

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

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

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

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?
在这里插入图片描述
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。

为什么Docker镜像采用这种分层结构呢?

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

重点理解

Docker镜像层都是只读的,容器层是可写的
当容器启动时一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层"之下的都叫“镜像层”。

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
在这里插入图片描述

docker镜像commit操作案例–演示ubuntu安装vim

docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID要创建的目标镜像名:[标签名]

从Hub上下载ubuntu镜像到本地并成功运行

docker pull ubuntu

原始的默认ubuntu镜像是不带着vim命令的

[root@192 soft]# docker run -it ubuntu /bin/bash
root@7878b5ae864f:/# 
root@7878b5ae864f:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@7878b5ae864f:/# vim a.txt
bash: vim: command not found

外网连通的情况下,安装vim

#先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vim

在这里插入图片描述
在这里插入图片描述

root@7878b5ae864f:/# cd /tmp
root@7878b5ae864f:/tmp# vim a.txt
root@7878b5ae864f:/tmp# cat a.txt
this is a docker

安装完成后,commit我们自己的新镜像
docker commit -m="vim cmd add ok" -a="lb" 139727b83d29 itcast/myubuntu:1.1
-a: 指定镜像作者
-m: 自定义的提交描述信息
-139727b83d29: 容器名字,这里也可以用容器ID代替
-itcast/myubuntu:1.1: 指定要创建目标镜像的自定义名字(这里为itcast/myubuntu)和自定义版本(1.1)

[root@192 soft]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
139727b83d29   ubuntu    "/bin/bash"   3 minutes ago   Up 3 minutes             flamboyant_hellman
[root@192 soft]# docker commit -m="vim cmd add ok" -a="ldy" 139727b83d29 itcast/myubuntu:1.1
sha256:1fd9ce6dfd6992d8c7033dccb9d2898e4dc2b99f1babf631db620474e11e2336
[root@192 soft]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
itcast/myubuntu   1.1       1fd9ce6dfd69   58 seconds ago   189MB
ubuntu            latest    ba6acccedd29   2 years ago      72.8MB

启动我们的新镜像并和原来的对比

原来72.8MB 现在189MB

总结

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

5.本地镜像发布到阿里云

本地镜像发布到阿里云流程

在这里插入图片描述

镜像的生成方法

基于当前容器创建一个新的镜像,新功能增强
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

commit我们自己的新镜像
docker commit -m="vim cmd add ok" -a="lb" 139727b83d29
-a: 提交的镜像作者
-m: 提交的说明文字

将本地镜像推送到阿里云

在这里插入图片描述
阿里云开发者平台:https://promotion.aliyun.com/ntms/act/kubernetes.html

创建仓库镜像:选择控制台,进入容器镜像服务;选择个人实例;命名空间;仓库名称;进入管理界面获得脚本

在这里插入图片描述
在这里插入图片描述

将阿里云的镜像下载本地

在这里插入图片描述

6.CentOS7安装DockerCompose

6.1.下载

Linux下需要通过命令下载:

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

在这里插入图片描述

如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:

在这里插入图片描述

上传到/usr/local/bin/目录也可以。

6.2.修改文件权限

修改文件权限:

# 修改权限
chmod +x /usr/local/bin/docker-compose

6.3.Base自动补全命令:

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

在这里插入图片描述

7.本地镜像发布到私有库–Docker Registry

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

1.下载镜像–创建registry容器并开放端口

docker pull registry
  • 运行私有库Registry,相当于本地有个私有Docker hub

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:

docker run -d \--restart=always \--name registry	\-p 5000:5000 \-v registry-data:/var/lib/registry \--privileged=true \registry# -p指定端口,一内一外
# -v表示挂载,前者是宿主机,后者是容器
# Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–prvileged=true命令,扩大容器的权限解决挂载目录没有权限的
问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
在这里插入图片描述

2.案例演示创建一个新镜像,ubuntu安装ifconfig命令

在这里插入图片描述

[root@192 soft]# docker run -it ubuntu /bin/bash
root@e65d61ff09d8:/# ifconfigroot@e65d61ff09d8:/# apt-get -y install net-toolsroot@e65d61ff09d8:/# ifconfig

在这里插入图片描述

[root@192 soft]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                       NAMES
e65d61ff09d8   ubuntu         "/bin/bash"               3 minutes ago    Up 3 minutes                                                objective_leakey
daafa6a212e1   registry       "/entrypoint.sh /etc…"   7 minutes ago    Up 7 minutes    0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
98d2c389f54a   1fd9ce6dfd69   "/bin/bash"               26 minutes ago   Up 26 minutes                                               objective_meninsky
[root@192 soft]# 
[root@192 soft]# docker commit -m="ifconfig cmd add" -a="ldy" e65d61ff09d8 ubuntu:1.2
sha256:811d655579989129269df684b6f4f1fcda542f69988de2005e19a9b610bfd050
[root@192 soft]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED         SIZE
ubuntu                                                        1.2       811d65557998   5 seconds ago   122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1   1.1       1fd9ce6dfd69   2 hours ago     189MB
ubuntu                                                        latest    ba6acccedd29   2 years ago     72.8MB

3.curl验证私服库上有什么镜像

指令格式如下所示:

curl -XGET http://主机映射的网络地址:主机映射网络端口/v2/_catalog

防踩坑:如果记得自己映射的主机Registy网络地址就可以直接输入;如果不记得,可以使用docker ps -a查看私服库Registry的网络映射信息(映射网络地址和映射端口)。

[root@192 soft]# curl -XGET http://192.168.229.129:5000/v2/_catalog
{"repositories":[]}
[root@192 registry-ui]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx"]}

可以看到,目前私服库http://192.168.229.129:5000/v2/_catalog没有任何镜像上传过。。。。。。。【空的】
如下图所示,我的本地私有库Registry的网络地址为0.0.0.0,映射端口为5000。
在这里插入图片描述

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

推送镜像到私有镜像服务必须先tag,步骤如下:
重新tag本地镜像,名称前缀为私有仓库的地址:192.168.229.129:5000docker tag nginx:latest 192.168.229.129:5000/nginx:1.0 
使用命令docker tag 将 tag nginx:latest 这个镜像修改为 192.168.229.129:5000/nginx:1.0 
#自己host主机ip地址
按照公式:docker tag  镜像ID或镜像名:Tag Host:Port/Repository:Tag

上面代码的参数含义如下所示:

(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字;
(2)Tag:要上传的镜像版本号;
(3)Host:本地私有库的映射网址(本文为0.0.0.0);
(4)Post:本地私有库的映射端口(本文为5000);
(5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。

[root@192 soft]# docker tag ubuntu:1.2 192.168.229.129:5000/ubuntu:1.2
[root@192 soft]# 
[root@192 soft]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED         SIZE
192.168.229.129:5000/ubuntu                                   1.2       811d65557998   7 minutes ago   122MB
ubuntu                                                        1.2       811d65557998   7 minutes ago   122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1   1.1       1fd9ce6dfd69   2 hours ago     189MB
ubuntu                                                        latest    ba6acccedd29   2 years ago     72.8MB
[root@192 soft]# 

5.修改配置文件使之支持http-配置Docker信任地址

安装的docker只支持阿里云镜像加速网址的http连接,为了实现镜像上传到私有库Registry,我们还要配置支持本地安装私有库Registry的http连接
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# registry-mirrors配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。
# vim命令添加内容:http://192.168.229.129:8080为自己设置的私服库地址
"insecure-registries":["http://192.168.229.129:8080"]
#上述理由: docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====>修改完后如果不生效.建议重启docker
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.带有图形化界面版本–更改私有库

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=个人私有仓库- REGISTRY_URL=http://registry:5000depends_on:- registry
[root@192 soft]# mkdir registry-ui
[root@192 soft]# cd registry-ui/
[root@192 registry-ui]# ll
总用量 0
[root@192 registry-ui]# touch docker-compose.yml
[root@192 registry-ui]# vim docker-compose.yml
[root@192 registry-ui]# 
[root@192 registry-ui]# cat docker-compose.yml
version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=个人私有仓库- REGISTRY_URL=http://registry:5000depends_on:- registry
[root@192 registry-ui]# ll
总用量 4
-rw-r--r--. 1 root root 322 18 07:27 docker-compose.yml
[root@192 registry-ui]# docker-compose up -d
Creating network "registry-ui_default" with the default driver
Pulling ui (joxit/docker-registry-ui:static)...
static: Pulling from joxit/docker-registry-ui
540db60ca938: Pull complete
197dc8475a23: Pull complete
39ea657007e5: Pull complete
37afbf7d4c3d: Pull complete
0c01f42c3df7: Pull complete
d590d87c9181: Pull complete
3333c94ae44f: Pull complete
33d7cca6fc9f: Pull complete
076b2dd9bdd1: Pull complete
b70198f04ee7: Pull complete
1fb6c5acc953: Pull complete
Digest: sha256:b0657b6be748173583516e411bd71552e54cb7d5dda94964726297ce8774415c
Status: Downloaded newer image for joxit/docker-registry-ui:static
Creating registry-ui_registry_1 ... done
Creating registry-ui_ui_1       ... done
[root@192 registry-ui]# 
[root@192 registry-ui]# 
[root@192 registry-ui]# docker-compose logs -f
Attaching to registry-ui_ui_1, registry-ui_registry_1
ui_1        | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
ui_1        | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
ui_1        | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
ui_1        | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
ui_1        | /docker-entrypoint.sh: Launching /docker-entrypoint.d/90-docker-registry-ui.sh
ui_1        | /docker-entrypoint.sh: Configuration complete; ready for start up
registry_1  | time="2024-01-07T23:31:22.196329571Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.196463852Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.200039301Z" level=info msg="Starting upload purge in 12m0s" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.203727763Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 
registry_1  | time="2024-01-07T23:31:22.20447663Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1 

在这里插入图片描述

7.push推送到私服库

命令格式为:

docker push 符合私服规范的Tag的镜像名称或ID:版本号
docker tag nginx:1.0 192.168.229.129:8080/nginx:1.0 
docker push 192.168.229.129:8080/nginx:1.0 
docker tag ubuntu:1.2 192.168.229.129:8080/ubuntu:1.2
docker push 192.168.229.129:8080/ubuntu:1.2

8.curl验证私服库上有什么镜像

上传私服库完成,在终端输入命令curl -XGET http://192.168.229.129:8080/v2/_catalog查看私服库上是否有推送的镜像
[root@192 soft]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx","ubuntu"]}

9.pull到本地并运行

使用docker pull命令从私有库拉取镜像到docker中:

docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号
docker pull 192.168.229.129:8080/nginx:1.0 

防踩坑:上面的curl指令只显示了私服库上的镜像名字,如为了获得版本号,需要如下指令,需要注意的ubuntu-advanced是要拉取的镜像名字:

curl -XGET http://192.168.229.129:8080/v2/nginx/tags/list

在这里插入图片描述

8.Docker容器数据卷

将docker容器内的数据保存进宿主机的磁盘中
在这里插入图片描述

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

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

将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效,爽
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

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

绑定映射目录

#读写默认
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --name myubt --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash

在这里插入图片描述

查看数据卷是否挂载成功

docker inspect 容器ID

在这里插入图片描述

容器和宿主机之间数据共享

1 docker修改,主机同步获得
2 主机修改,docker同步获得
3 docker容器stop,主机修改,docker容器重启看数据成功同步。

在这里插入图片描述

在这里插入图片描述

3.容器数据卷读写规则映射添加说明

# 可读可写
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
# 容器实例内部被限制,只能读取不能写
docker run -it --privileged=true  -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

ro = read only
此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。
在这里插入图片描述

4.卷的继承和共享

容器1完成和宿主机的映射

docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData --name u1 ubuntu /bin/bash

在这里插入图片描述

容器2继承容器1的卷规则

 docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntudocker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

在这里插入图片描述
在这里插入图片描述

9.Docker常规安装简介

1.总体步骤

搜索镜像
拉取镜像
查看镜像
启动镜像 - 服务端口映射
停止容器
移除容器

2.安装Tomcat【新版本webapps已改为webapps.dist】

https://hub.docker.com/

1.docker hub上面查找tomcat镜像

在这里插入图片描述

在这里插入图片描述

2.从docker hub上拉取tomcat镜像到本地

在这里插入图片描述

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

在这里插入图片描述

4.使用tomcat镜像创建容器实例(也叫运行镜像)

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

在这里插入图片描述

5.访问猫首页

在这里插入图片描述

可能没有映射端口或者没有关闭防火墙
在这里插入图片描述

把webapps.dist目录转成webapps
在这里插入图片描述
在这里插入图片描述

6.免修改版说明

docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

在这里插入图片描述
在这里插入图片描述

3.安装mysql:5.7

简单版

1.查询拉取mysql镜像
docker search mysql# 不加版本号5.7,默认拉取的是最新版
docker pull mysql:5.7docker images mysql:5.7

在这里插入图片描述

在这里插入图片描述

2.使用mysql镜像
docker run -p 3306:3306 --name mq -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7docker psdocker exec -it 容器ID /bin/bashmysql -u root -p

在这里插入图片描述

3.建库建表插入数据

在这里插入图片描述

4.外部win10连接运行在docker上的Mysql容器实例服务

在这里插入图片描述

5.中文字符集问题
show variables like 'character%';

在这里插入图片描述
在这里插入图片描述

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

实战版本

1.新建mysql容器实例

docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-d \
mysql:5.7
--name : 起名字
--privilege=true : 容器数据卷权限开启
-p : 端口映射
-d : 后台运行

或者

docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

编写hmy.cnf

[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000

在这里插入图片描述

2.新建my.cnf–通过容器卷同步给mysql容器实例

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

在这里插入图片描述

3.重新启动mysql容器实例再重新进入并查看字符编码

在这里插入图片描述

4.再新建库新建表再插入中文测试

show databases;create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,'zs'),(2,'lisi'),(3,'王五');select * from t1;show variables like 'character%';drop database db01;

在这里插入图片描述

4.安装redis

1.下载redis镜像到本地标签为6.0.8

docker search redis --limit 5docker pull redisdocker images redis

在这里插入图片描述

2.入门命令

在这里插入图片描述

3.命令提醒:容器卷记得加入 --privileged=true

4.在Centos宿主机下新建目录/app/redis

mkdir -p /app/redis

5.将一个redis.conf文件模板拷贝进/app/redis

在这里插入图片描述

  • 开启redis验证
requirepass 123456
  • 允许redis外地连接,必须注释掉 #bind 127.0.0.1

在这里插入图片描述

  • daemonize no 后台启动设置为no
将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败

在这里插入图片描述

  • 开启redis数据持久化appendonly yes可选

在这里插入图片描述

6. /app/redis目录下修改redis.conf文件

默认出厂的原始redis.conf
在这里插入图片描述

7.使用redis6.0.8镜像创建容器(也叫运行镜像)

docker run \
--name mr \
--privileged=true \
-p 6379:6379 \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 \
redis-server /etc/redis/redis.conf命令说明
docker run \ # 创建并运行docker 容器实例
--name mr \  # 给容器起个名称
--privileged=true \  # Docker会赋予容器几乎与主机相同的权限,即获取宿主机root用户权限
--appendonly yes \ # 开启AOF持久化功能
-v /app/redis/redis.conf:/etc/redis/redis.conf \ #容器卷,宿主机地址:docker容器内部地址  redis配置文件挂载
-v /app/redis/data:/data \  #redis数据文件挂载
--net host \			# 使用宿主机的ip和端口,指定网络类型为host,即与宿主机使用同一网络,默认
-d redis:6.0.8 \  # 后台运行 redis镜像和版本号
redis-server /etc/redis/redis.conf \  #运行容器 并使用配置文件启动容器内的 redis-server
--cluster-enabled yes \ # 是否开启redis集群
--port 6386 \ # redis端口号
# -p 6380:6379 \  #宿主机端口号:容器端口	端口映射
# --requirepass 123456 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置,不然容易中病毒)

在这里插入图片描述
在这里插入图片描述

8.测试redis-cli连接上来

在这里插入图片描述

9.请证明docker启动使用了我们自己指定的配置文件

在这里插入图片描述
在这里插入图片描述

10.测试redis-cli连接上来第2次

在这里插入图片描述

5.安装Nginx

docker search nginx --limit 5docker pull nginxdocker run --name mn -p 80:80 -d nginx# docker run 启动一个镜像
# -d 表示后台允许
# --name mn  表示为当前容器起一个别名
# -p 80:80 表示将本机的80端口映射到nginx镜像的80端口
进入Nginx容器当中
docker exec -it nginx /bin/bash
命令详解:
# docker exec 在运行的容器中执行命令
# -i 以交互模式运行容器,通常与 -t 同时使用;例如-it
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;例如-it
# nginx 容器名
# /bin/bash 其实就是表示载入容器后运行bash(命令语言解释程序), 因为docker中必须要保持一个进程(运行的程序)的运行,要不然整个容器就会退出,所以说,bash就担任起了docker中运行的那个进程的角色!
#而/bin/bash则是bash在linux下的位置

endl

相关文章:

Docker与微服务实战(基础篇)

Docker与微服务实战&#xff08;基础篇&#xff09; 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…...

「实用分享」如何用Telerik UI组件创建可扩展的企业级WPF应用?

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…...

【Docker基础三】Docker安装Redis

下载镜像 根据自己需要下载指定版本镜像&#xff0c;所有版本看这&#xff1a;Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…...

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…...

vue项目心得(复盘)

在编写项目过程中&#xff0c;首先是接手一个需要优化的项目&#xff0c;需要查看vue.config.js环境配置地址&#xff0c;确认好测试地址后进行开发&#xff0c;目前在开发过程中&#xff0c;遇到的最多的问题就是关于组件间的&#xff0c; 组件间传值 1、父组件异步传值&…...

Linux——firewalld防火墙(一)

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙&#xff08;或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现&#xff0e;具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…...

JMeter之Windows安装

JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…...

用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

Retrieval-Augmented Generation&#xff08;RAG&#xff09;是一种强大的技术&#xff0c;能够提高大型语言模型&#xff08;LLM&#xff09;的性能&#xff0c;使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…...

正则表达式的语法

如果要想灵活的运用正则表达式&#xff0c;必须了解其中各种元素字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…...

MyBatis分页插件的实现原理

MyBatis 分页插件的实现原理是通过拦截器&#xff08;Interceptor&#xff09;来实现的。拦截器可以在 SQL 执行前后对 SQL 进行拦截和处理。 简单来说&#xff0c;就是通过在查询语句中添加额外的参数和逻辑&#xff0c;以支持分页功能。它的核心思想是将分页参数传递给插件&…...

Winform、WPF如何解决前端卡死问题

在WinForms和WPF中&#xff0c;前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法&#xff1a; 使用异步操作&#xff1a;将长时间的计算或阻塞操作放在后台线程中执行&#xff0c;以避免阻塞UI线程。可以使用Task、async/await等异步…...

python内app自动化测试的局限性,该如何破局?

Python在App自动化测试方面非常流行&#xff0c;尤其对于移动应用&#xff08;Android和iOS&#xff09;的测试&#xff0c;可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而&#xff0c;即使使用Python这样的强大语言&#xff0c;App自动化测试也存在一些局限…...

k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain

node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配&#xff0c;不走调度策略&#xff0c;node01 nodeSelector:根据节点的标签选择&#xff0c;会走调度的算法 只…...

IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具&#xff0c;在开发过程中需要经常用到数据库&#xff0c;如Mysql数据库&#xff0c;但是在IDEA中只能连接本…...

GIT - 清除历史 Commit 瘦身仓库

目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长&#xff0c;分支较多&#xff0c;且分支内包含很多不同的大文件&#xff0c;随着时间的推移&#xff0c;历史 Git 库的容量日渐增发&#xff0c…...

物联网产品中,终端、网关、协议、PaaS、SaaS之间的关系

在互联网产品中&#xff0c;经常提到的终端、网关、协议、PaaS、SaaS之间&#xff0c;到底有什么关系呢&#xff1f; 一、基本概念 在百度/其他地方搜集的信息中&#xff0c;对于终端、网关、协议、PaaS、SaaS的解释各有不同&#xff0c;整理如下&#xff1a; 终端&#xff1…...

6款实用的Git可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。我们在团队开发中统一某个开发工具能够降低沟通成本&#xff0c;提高协作效率。今天给大家分享6款实用的Git可视化管理工具。 Git是什么&…...

python_selenium零基础爬虫学习案例_知网文献信息

案例最终效果说明&#xff1a; 去做这个案例的话是因为看到那个博主的分享&#xff0c;最后通过努力&#xff0c;我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据&#xff0c;并且遍历数据将其导出到一个CSV文件中&#xff0c;代码是很简单的&#xff0c;没有…...

MindSpore Serving基于昇腾910B实现大模型部署

一、Why MindSpore Serving 大模型时代&#xff0c;作为一个开发人员更多的是关注一个大模型如何训练好、如何调整模型参数、如何才能得到一个更高的模型精度。而作为一个整体项目&#xff0c;只有项目落地才能有其真正的价值。那么如何才能够使得大模型实现落地&#xff1f;如…...

mysql原理--InnoDB的Buffer Pool

1.缓存的重要性 对于使用 InnoDB 作为存储引擎的表来说&#xff0c;不管是用于存储用户数据的索引&#xff08;包括聚簇索引和二级索引&#xff09;&#xff0c;还是各种系统数据&#xff0c;都是以 页 的形式存放在 表空间 中的&#xff0c;而所谓的 表空间 只不过是 InnoDB 对…...

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中&#xff0c;本地环境&#xff08;dev&#xff09;和开发环境&#xff08;feature&#xff09;会共同使用相同的中间件&#xff08;本篇拿Redis举例&#xff09;&#xff0c;对于不同环境中的&#xff0c;图片、视频、语音等资源类型的预览地址url&#xff0c;需要配…...

MySQL之导入、导出远程备份

一、Navicat工具导入、导出 1.1 导入 第一步&#xff1a; 右键&#xff0c;点击运行SQL文件 第二步&#xff1a; 选择要运行的SQL&#xff0c;点击开始 第三步&#xff1a; 关闭即可 1.2 导出 第一步&#xff1a; 右键选择&#xff0c;导出向导 第二步&#xff1a; 选择SQL脚…...

OpenGL学习笔记-Blending

混合方程中&#xff0c;Csource是片段着色器输出的颜色向量&#xff08;the color output of the fragment shader&#xff09;&#xff0c;其权重为Fsource。Cdestination是当前存储在color buffer中的颜色向量&#xff08;the color vector that is currently stored in the …...

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…...

欧拉Euler release 21.10 (LTS-SP2)升级openssh至9版本记录

背景&#xff1a;安扫漏洞&#xff0c;需要对openssh经行升级 1.先查看升级前的openssh版本 2.避免升级失败断开远程登录&#xff0c;先开启telnt服务用于远程连接&#xff08;这步可查看其他博客&#xff09; 3.从欧拉官网下载rpm包&#xff0c;https://www.openeuler.org/zh…...

php 数组中的元素进行排列组合

需求背景&#xff1a;计算出数组[A,B,C,D]各种排列组合&#xff0c;希望得到的是数据如下图 直接上代码&#xff1a; private function finish_combination($array, &$groupResult [], $splite ,){$result [];$finish_result [];$this->diffArrayItems($array, $…...

Python从入门到网络爬虫(OS模块详解)

前言 本章介绍python自带模块os&#xff0c;os为操作系统 operating system 的简写&#xff0c;意为python与电脑的交互。os 模块提供了非常丰富的方法用来处理文件和目录。通过使用 os 模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强…...

人机交互不是人机融合智能

一、人机交互和人机融合智能是两个不同的概念 人机交互是指人类与计算机之间的信息交流和操作方式&#xff0c;包括输入和输出界面、交互技术、用户体验等方面。人机交互的目标是提供用户友好的界面和自然的交互方式&#xff0c;使人类能够与计算机更加高效地进行沟通和协作。 …...

RabbitMQ解决消息丢失以及重复消费问题

文章目录 1、概念2、基于ACK/NACK机制2.1 基于Spring AMQP框架整合ACK/NACK机制2.2 测试消费失败1.02.3 测试结果1.02.4 测试MQ宕机2.5 测试结果2.0 3、RabbitMQ 如何实现幂等性设计3.1 幂等服务设计思路3.1.1 通过雪花算法生成分布式唯一ID3.1.2 通过枚举类&#xff0c;设计Me…...

docker 安装redis集群

一、准备6台机器 二、6台机器分别拉取镜像&#xff1a; docker pull redis三、6台机器分别建立挂载文件夹 mkdir -p /home/redis/data四、6台机器分别执行容器操作 docker run --restartalways -d --name redis-node-1 --net host --privilegedtrue -v /home/redis/data:/da…...

wordpress 443端口/谷歌平台推广外贸

原文 如何将经纬度利用Google Map API显示C# VS2005 Sample Code 日前写了一篇如何用GPS抓取目前所在,并回传至资料库储存,这篇将会利用这些回报的资料,将它显示在地图上,这个做法有两种,最简单的就是直接传值到Google Maps上. 举例来说,当我们知道经纬度后,只要将数据套到以下…...

梅山建设局网站/推广小程序拿佣金

asp.net压缩解压缩&#xff0c;需要服务器安装WinRar&#xff0c;并且把Rar.exe拷贝到网站根目录。 asp.net压缩文件夹调用示例&#xff1a;rar("e:/www.svnhost.cn/", "e:/www.svnhost.cn.rar"); asp.net解压缩rar文件调用示例&#xff1a;unrar("e:…...

wordpress 另类主题/防晒霜营销软文

简介不知从什么时间起&#xff0c;“共享单车”这一概念在忽然间火遍了全国&#xff0c;ofo小黄车&#xff0c;摩拜单车……逐渐走入到我们的生活中。特别是在一线城市&#xff0c;共享单车成为广大白领们不可或缺的交通工具。今天我们就kaggle上的共享单车数据集进行分析。分析…...

主页去掉wordpress/外链图片

本文实例讲述了jQuery插件FusionCharts绘制的3D环饼图效果。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、index.html页面&#xff1a;/p>"http://www.w3.org/TR/html4/loose.dtd">FusionCharts Doughnut3D$(function(){var doughnut3D new Fusio…...

桂林商品房做民宿在哪个网站登记好/软文推广广告

...

网站标题怎么做/提高网站收录的方法

计算机的发展、类型及其应用领域。计算机(computer)是一种能自动、高速进行大量算术运算和逻辑运算的电子设备。 其特点为&#xff1a;速度快、精度高、存储容量大、通用性强、具有逻辑判断和自动控制能力。第一台计算机&#xff1a;ENIAC&#xff0c;美国&#xff0c;1946年 宾…...