开启端口
firewall-cmd –zone=public –add-port=2181/tcp –permanent
编码开发微服务
上线部署容器化
时时刻刻要监控
Docker基于Go语言实现
Docker的主要目标是:Build, Ship and Run Any App, Anywhere
,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行。
将源码 + 配置 + 环境 + 版本打包成为一个镜像文件
docker: DevOps
传统虚拟机和容器
传统虚拟机
- 虚拟机主要是虚拟出各种硬件 在虚拟机上面安装操作系统,在操作系统中安装各种应用
- 占用资源多,启动慢
容器
- 容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
- 容器不是模拟一个完整的操作系统,而是对进程进行隔离
- 容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。
yum config-manager--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Docker运行快的原因:
- Docker有比虚拟机更少的抽象层:
- Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源
- Docker利用的是宿主机的内核,而不需要加载操作系统OS内核
- Docker容器的本质就是一个进程
Docker的基本组成部分:
镜像(image)
- Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
容器(container)
- 容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例
仓库(repository)
- 集中存放镜像文件的场所。
Docker架构
Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。
Docker运行的基本流程为:
- 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
- Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作
每个容器就是一个job
Docker指令
docker指令 中 一般是两道杠 一到杠是简写
单个字母是一个杠,否则两个杠
systemctl start docker docker启动
systemctl stop docker 停止Docker
systemctl restart docker 重启Docker
systemctl status docke 查看状态
systemctl enable docker 设置开机自启
帮助类命令
docker version 查看Docker版本
docker info 查看Docker概要信息
docker --help 查看Docker总体帮助文档
docker 具体命令 --help 查看docker具体命令帮助文档
镜像命令
docker images 列出本地主机上的镜像
● -a:列出所有镜像(含历史镜像)
● -q:只显示镜像ID
● -f:过滤
docker search 镜像名称 在远程仓库中搜索镜像
● -f:过滤
● --limit 数量:只展示前几项
docker pull 镜像名称[:tag] 下载镜像 不加 tag 时,默认下载最新的镜像(即tag为latest)。
● docker pull redis:6.0.3 下载 redis 6.0.3版本
docker system df 查看镜像/容器/数据卷所占的空间
docker rmi -f 镜像名称/ID 删除镜像
可以使用空格分隔,删除多个镜像:
docker rmi 镜像1 镜像2 镜像3
删除全部镜像:
docker rmi -f $(docker images -qa)
“docker search” requires exactly 1 argument.
出错原因是命令最后需要****一个空格和一个点****,即:
虚悬镜像
仓库名、标签都是<none>
的镜像,俗称虚悬镜像(dangling image)。
容器命令
新建启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用的参数:
--name
:为容器指定一个名称-d
:后台运行容器并返回容器ID,也即启动守护式容器 (后台运行)Docker容器后台运行,必须由一个前台进程
- 如果不是前台进程 使用-d 该docker会自动关闭 例如 ubuntu使用-d会自动关闭,使用redis就不会 会在前台进行端口监听 使用-d不会自动关闭
容器运行的命令如果不是那些一致挂起的命令(top tail),就是会自动退出
最佳的解决方案是 将要运行到的程序以前台进程的形式运行,就是命令行形式 -it
-i
:以交互模式(interactive)运行容器,通常与-t
同时使用 (在前台运行)-t
:为容器重新分配一个伪输入终端(tty),通常与-i
同时使用。也即启动交互式容器(前台有伪终端,等待交互)-e
:为容器添加环境变量-P
:大P 随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口-p
:小p 指定端口映射
以交互方式启动ubuntu镜像
# -i 交互模式
# -t 分配一个伪输入终端tty
# ubuntu 镜像名称
# /bin/bash(或者bash) shell交互的接口
docker run -it ubuntu /bin/bash
docker run --name hcjDocker -it ubuntu bash
退出交互模式:
方式1:
# 在交互shell中exit即可退回宿主机
exit;
方式2:
使用快捷键ctrl
+ P
+ Q
方式1 退出后,容器会停止;
方式2 退出后容器依然正在运行。
列出正在运行的容器
docker ps [OPTIONS]
常用参数:
-a
:列出当前所有正在运行的容器+历史上运行过的容器-l
:显示最近创建的容器-n
:显示最近n个创建的容器-q
:静默模式,只显示容器编号
启动已经停止的容器
docker start 容器ID或容器名
重启容器
docker restart 容器ID或容器名
停止容器
docker stop 容器ID或容器名
强制停止容器
docker kill 容器ID或容器名
删除已经停止的容器:
docker rm 容器ID或容器名
删除容器是
docker rm
,删除镜像是docker rmi
,注意区分。
强制删除正在运行的容器
docker rm -f 容器ID或容器名
一次删除多个容器实例:
docker rm -f $(docker ps -a -q)
# 或者
docker ps -a -q | xargs docker rm
查看容器日志
docker logs 容器ID或容器名
查看容器内的进程
docker top 容器ID或容器名
查看容器内部运行情况
docker inspect 容器ID或容器名
进去正在运行的容器并以命令行交互 推荐使用
docker exec -it 容器ID bashShell
就是使用-it启动一个伪终端之后立即执行的一个命令,/bin/bash表示你在容器使用bash类型的shell进行交互
Ctrl + p + q 后台运行容器,但是当你在使用 run 是重新创建一个新的容器,而 exec 是进入之前创建的容器
重新进入容器
docker attach 容器ID
- attach直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
- exec是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
从容器内部拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
export 导出容器的内容流作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
docker export 容器ID>文件名tar
cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号
利用tar包生成的镜像文件 镜像文件生成的容器和原来删除的容器一样
所有命令示意图
Docker镜像
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好行程一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
Docker 镜像加载原理
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的(支持聚合)文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各利具体的应用镜像
它是在不修改其原始(物理)源的情况下创建将多个目录的内容合并为一个逻辑目录。更有创意的用法是:能将相关的文件集存储在不同的磁盘或媒体中,但我们在单个视图中显示它们。总之,将多个、种类不同的数据源整合成一个逻辑数据源是有意义的。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Un0ⅸ.系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由pootfs转交给内核,此.时系统也会卸载pootfs。
rootfs(root file system),在pootfs之上。包含的就是典型Linux系统中的/dev,proc,bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu,Centos等等。
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动:无论添加、删除、还是修改文件都只发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。
新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
创建自己镜像 并且发布
发布到公有镜像
eg: 创建由vim的ubuntu镜像
- 下载vim
apt-get update
apt-get -y install vim
2.使用 commit命令
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
import导入的镜像只保留文件,像redis里面的东西是没有的,commmit提交时是包含所有内容的,导入时也包含所有内容,有文件和redis内部数据等。。
- 和原镜像比较
完全一样
发布到aliyun镜像
登录到aliyun官网 进入 容器镜像服务
创建镜像仓库,先创建命名空间 再创建镜像仓库
将镜像推送到阿里云
从仓库中拉取镜像
发布到私有镜像
Docker Registry是官方提供的工具,用于构建私有的镜像仓库
创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
放在公共镜像的docker 有秘密被泄露的风险
下载镜像 registry 用于搭建 docker仓库私服版本
运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
+ 3. commit 新镜像 4. 将新镜像修改符合私服规范的Tag ![](\image\Snipaste_2023-11-02_14-43-15.png) 5. 修改配置文件 使之支持http ```shell vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://z3o7c80u.mirror.aliyuncs.com"], "insecure-registries": ["192.168.70.138:5000"] }
push推送到私有仓库
docker push 192.168.111.167:5000/zzyyubuntu:1.2
7. pull到本地并运行 ```shell docker pull 192.168.111.167:5000/zyyubuntu:1.2
容器数据卷
docker run -it -v /DockerRegistry/hcjHostData:/tmp/DockerData --privileged=true ubuntu
容器卷记得加入 –privileged=true
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied
解决办法:在挂载目录后多加一个-privileged=-true参数即可-v
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定
-v参数中,冒号”:”前面的目录是宿主机目录,后面的目录是容器内目录。
目录是自动创建
容器卷类似于redis中的rdb和aof
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
相当于 虚拟机和主机的共享文件夹 里面的内容是实时共享的
开启docker容器持久化 (容器和宿主机之间的映射)
docker run -it -privileged=true -v/宿主机绝对路径目录:/容器内日录:ro 镜像名
docker run -it -v /DockerRegistry/hcjHostData:/tmp/DockerData --privileged=true ubuntu
#读写规则 默认支持可读可写 rw 相当于
docker run -it -v /DockerRegistry/hcjHostData:/tmp/DockerData:rw --privileged=true ubuntu
#读写规则 只能读 容器内实例被限制,只能读,不能写 宿主机可以读可以写 写的内容可以同步到容器中让其读取到
docker run -it -v /DockerRegistry/hcjHostData:/tmp/DockerData:ro --privileged=true ubuntu
查看数据卷是否挂载成功
docker inspect imageId
容器卷之间的继承
docker run -it --privileged=true --volumes-from 父镜像 --name u2 ubuntu
继承会直接拥有父类容器的映射地址 不能再另外指定映射地址 ,父类创建新文件 子类和宿主机之间也会拥有该文件(子类容器创建文件同理、宿主机创建文件同理),同时新创建的子类容器会拥有父类的映射地址中原有的文件。
在容器的继承中 继承的是规则 不是容器本身 ,所以父容器关闭 不影响子容器于宿主机的消息传递
docker 安装tomcat
- 拉取镜像
docker pull tomcat
- 运行镜像
docker run -d -p 8088:8080 --name hcjTomcat tomcat
- 新版的tomcat需要将 webapp.dist 变为 webapp 将原来的webapp删除
- 访问tomcat集合成功
docker 安装 mysql8.0
- 拉取镜像
docker pull mysql:8.0.21
- 运行镜像
docker run --name hcjMysql -v /usr/local/app/mysql/logs:/var/log/mysql -v /usr/local/app/mysql/data:/var/lib/mysql -v /usr/local/app/mysql/conf:/etc/mysql/conf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.21
# 已开启数量卷备份 备份了数据 日志 配置
远程连接
Docker 安装 MySQL 8.0,详细步骤_docker安装mysql8.0-CSDN博客
问题 中文乱码 数据备份
修改中文乱码
在 /usr/local/app/mysql/conf 目录创建 my.cnf
在文件中添加
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
docker 安装 redis
在pull下redis镜像后
需要设置数据卷区域 进行持久化操作 并且需要修改配置文件
修改配置文件
1. 将bind 127.0.0.1 注释掉 确保能够进行远程连接 2. 将daemonize 设置为 no 将daemonize yes 注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败 3.开启redis持久化appendonly yes
启动redis容器
docker run -p 6378:6379 --name hcjRedis --privileged=true -v /DockerRegistry/redis/redis.conf:/etc/redis/redis.conf -v /DockerRegistry/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
redis没有密码无法远程连接
docker 安装 rabbitMq
docker volume create rabbitmq-home
docker run -id --name=rabbitmq -v rabbitmq-home:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=swsk33 -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management
注意docker空间 空间不足服务无法启动
记rabbitmq登录web管理页面,不是私密连接问题 - 知乎 (zhihu.com)
docker 创建zookeeper
docker run -d --name zookeeper --privileged=true -p 2181:2181 -v /DockerRegistry/zookeeper/conf:/conf --restart always zookeeper
docker run -d --name zookeeper -p 2181:2181 --restart always zookeeper
# 开启zookeeper
docker run -it --rm --link zookeeper:zookeeper zookeeper zkServer.sh -server zookeeper
- docker run -d -p 2181:2181 –name some-zookeeper –restart always 0e256393bf7e