Docker 简介安装
Docker 简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- Docker 作用
Docker是基于Go语言实现的开源项目,其作用就是解决运行环境和配置问题的软件容器,方便做持续集成并有整体发布的容器虚拟化。
简单理解Docker的作用就是,统一开发和运维环境,防止开发完交付到运维后,出现环境不统一问题,实际上应该是将程序的运行环境、运行配置、程序代码打包层ISO镜像。
- Docker 官网:https://www.docker.com/
- Docker 仓库:https://hub.docker.com/
- 虚拟机与容器
- 虚拟机:虚拟机带环境安装的方案,是拥有完整的操作系统,所属重量级,所需内存较大,启动速度慢。
- 容器:不是对一整个操作系统进行虚拟化,而是对软件程序所必需的运行环境和配置,所属轻量级,所需内存较小,启动速度快(内核级虚拟化技术)。
- Docker 三大核心
- 镜像(image):相当于root系统文件,简单理解就是独立的软件包,其包含当前软件运行的所有内容(环境、代码、配置、库等),其是用于创建Docker容器的模板,类比java中的类模板。
- 容器(container):容器是独立运行的一个或一组应用,是镜像运行时的实体,类比java中new的实例对象。
- 仓库(repository):就是用于存储镜像的仓库。
- 注意:实际上每个实例容器,都是一个微小的Linux系统;镜像只有读取功能,只有容器有写入功能。
- Docker 镜像加载原理
- 联合文件系统
**联合文件系统(UnionFS)**是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特征:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
- 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含 bootloader 和 Kernel , bootloader 主要是引导加 kernel, Linux刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs 。这一层与我们典型的 Linux/Unix系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs 。
生成新的镜像,是在原来的镜像上进行拓展,因为Docker底层使用联合文件系统,底层是分层处理,拓展功能是在原有的一层加一层。因为其是分层的,倘若有一层相同,不同的镜像会共享该层,此好处就是加强资源共享性和提高复用性。
Docker镜像的基础镜像为bootft,每一层镜像的下一层镜像为父镜像,最顶层是容器层,可读可写,其下的都为镜像层只可读。
Docker 安装
Linux 版本安装
- 安装Docker
#当前时基于CentOS 7 安装Docker的
#安装所需的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置稳定的仓库-阿里
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装Docker运行环境
yum install docker-ce docker-ce-cli containerd.io
#启动Docker
systemctl start docker
#hello-word
docker run hello-world
- 阿里云镜像加速
- 登录阿里云:https://www.aliyun.com/
- 容器镜像服务
- 配置镜像加速
- 卸载Docker
#删除Docker
yum remove docker-ce
#删除镜像
rm -rf /var/lib/docker
Win11 版本安装
- 开启Hyper-V虚拟机
- 因为我的电脑是Window11家庭中文版,没有Hyper-H,故得重新安装。
- 注意:在安装Hyper-H可能会重启电脑。
#新建txt文档,将一下复制进入
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
#更改后缀名为 .bat ,以管理员运行
- 如有Hyper-H,设置->应用->可选功能->更多Windows功能->开启Hper-H
- 下载安装包并安装
- 运行 hello-world
- 阿里云镜像加速
- 阿里云->容器镜像服务->镜像加速器->windows
Docker 常用命令
Docker 启动命令
#启动 Docker
systemctl start docker
#停止 Docker
systemctl stop docker
#重启 Docker
systemctl restart docker
#查看 Docker状态
systemctl status docker
#查询 Docker版本
docker version
#开机 Docker启动
systemctl enable docker
#Docker 帮助命令
docker --help
Docker 镜像命令
#查看本地镜像
docker iamges
#搜索仓库镜像 TAG 版本号,不声明默认最新版 latest
docker search image_name [:TAG]
#拉取仓库镜像文件
docker pull image_name
#查看镜像占据空间
docker system df
#删除选择镜像 -f 强制删除
docker rmi image_name
Docker 容器命令
#新建启动容器 -i 交互式运行容器 -t 重新分配伪输入终端 --restart=always Docker启动时,同时启动容器
docker run -it --restart=always image_name bash
#更改容器名称
docker rename oid_name enw_name
#罗列出docker容器
docker ps
#进入运行容器
#exec命令启用行的窗口,即启用新的进程,在使用exit命令退出时,不会关闭原有的容器
docker exec -it container_name / container_id /bin/bash
#attach命令不会启用新窗口,使用原有的进程,当使用exit命令退出时,会关闭原有的容器
docker attach -it container_name / container_id /bin/bash
#退出退出容器
exit [强制退出并关闭容器] or ctrl+q+p[退出容器不关闭容器];
#启动容器
docker start container_name / container_id
#停止容器
docker stop container_name / container_id
#重启容器
docker restart container_name / container_id
#强制停止容器,类似于杀死进程
docker kill container_name / container_id
#删除容器 -f强制删除容器 -先停止容器后删除
docker rm container_name / container_id
#查看容器日志
docker logs container_name / container_id
#查看容器内进程信息
docker top container_name / container_id
#拷贝容器文件到主机- container_Path容器路径 master_Path主机路径
docker cp container_name/_id:container_Path master_Path
#导出容器
docker export container_name / container_id [ > path ]
#导入容器 path可以为文件路径或者url container_name 重新命名 TAG 版本号
docker inport path container_name[:TAG]
#从容器创建一个新镜像
docker commit [-a '镜像作者' -m '说明文字'] container_name/id 新镜像名[:ATG]
#容器更新
docker container update --restart=always container_name/_id
-
启动交互式容器
docker run -it image_nam:TAG
- -i 交互式运行容器
- -t 重新分配伪终端
- -p 指定端口映射,
-p 主机端口:映射端口
- –name=‘custom_name’ 为容器指定一个名称
- 所谓交互容器,就是打开后新窗口命令行交互
-
启动守护式容器
docker run -d image_name:TAG
- 守护式容器,打开后没有交互命令窗,直接在后台运行
Docker 镜像发布
阿里云个人仓库
- 登录阿里云->镜像容器服务->创建个人实例
- 仓库管理->创建命名空间
- 创建镜像仓库->并绑定代码源
- 点击已创建的镜像仓库->根据提示教程进行相关操作
#登录阿里云Docker Registry
docker login --username=居无何 registry.cn-hangzhou.aliyuncs.com
#从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/juwuhe/juwuhe_hub:[镜像版本号]
#将镜像推送到Registry
docker login --username=居无何 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/juwuhe/juwuhe_hub:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/juwuhe/juwuhe_hub:[镜像版本号]
私服镜像仓库搭建
- 下载并运行registry
#下载registry
docker pull registry
#运行registry 守护式容器、指定端口、开机运行、指定容器名称
docker run -d -p 5000:5000 --restart=always --name=registry registry
#查看是否已运行
docker ps
#获取私库所有镜像
curl http://localhost:5000/v2/_catalog
#打开浏览器输入 主机IP地址:5000/v2/_catalog -> 出现 {"repositories":[]} 代表成功
- 拉取推送镜像
#进入配置文件
vim /etc/docker/daemon.json
#docker保存私有仓库的地址
{
"registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
"insecure-registries":["192.168.127.130:5000"]
}
#更改TAG-也就是标记推送版本
docker tag hello-world 192.168.127.130:5000/hello-world
#推送镜像到私有仓库
docker push 192.168.127.130:5000/hello-world:latest
Docker 容器数据卷
Docekr容器产生的数据可以通过数据复制cp或者容器备份commit,但当容器删除后,数据丢失。卷就是目录和文件,数据卷就是容器数据持久化,即为了解决容器数据的备份,其完全独立于容器生存空间,数据卷挂载容器,数据卷与容器之间的数据是同步的。数据卷默认挂载目录**/var/lib/docker/volumes**。
- 数据卷可在容器之间共享或重用数据
- 数据卷中更改是实时生效的,会直接作用到挂载的容器
- 数据卷更新不会作用到镜像
- 数据卷的声明周期一直持续到容器消亡
- 容器数据卷使用
#挂载命令 --privileged=true 开放权限
docker run -it --privileged=true -v /宿主绝对目录:/容器目录 container_name/_id
#查看是否挂载成功
docker volume ls
docekr inspect container_name/_id
#删除数据卷挂载
docker volume rm volume_name
- 容器数据卷读写
数据卷有只读(ro read only)和 只写(wo writer only)模式,只读和只写只是对容器而言,在挂载时没有声明时默认是可读可写模式。
#只读模式
docker run -it --privileged=true -v /宿主绝对目录:/容器目录:ro container_name/_id
#只写模式
docker run -it --privileged=true -v /宿主绝对目录:/容器目录:wo container_name/_id
- 数据卷映射共享
数据卷的映射和共享就类似于,java中的继承关系通过–volumes-from实现。容器A继承容器B的卷规则,当容器A挂掉时,其之间的关系人存在。
#容器A继承容器B的关系
docker run -d --privileged=true --volumes-from 父容器 子容器
Docker 常用软件
Tomcat 安装
- 拉取镜像
#拉取镜像
docker pull tomcat:
- 创建容器
#创建容器
docker run -d --name tomcat8 -p 8080:8080 tomcat:8.5.29
- 访问localhost:8080
- 挂载数据卷
tomcat需要备份的数据即 webapps 、conf 配置文件、log 日志文件。
#启动时同时挂载镜像
#--privileged=true 开放权限
#--restart=always 开机自启
docker run -d --name tomcat -p 8080:8080 --privileged=true -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps \
-v /usr/local/tomcat/conf:/usr/local/tomcat/conf \
-v /usr/local/tomcat/log:/usr/local/tomcat/log \
tomcat:8.5.29
#查看是否挂载成功
docker inspect container_name/_id
**注意:**若要使用数据卷挂载,在拉取镜像后,可直接进行数据卷挂载,挂载时同时启动容器。
Mysql 安装
- 拉取镜像
#拉取容器
docker pull mysql:5.7.37
- 创建容器
#创建容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name=mysql mysql:5.7.37
#出现端口被占用的情况 1.卸载原有的mysql 2.更换端口号
docker run -it -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root --name=mysql mysql:5.7.37
#连接Mysql
docker exec -it mysql bash
#登录
mysql -u root -p
#查询所有数据库
show databases;
**注意:**已经在原有的系统上安装了Mysql,在启动容器时可能出现端口被占用的情况。
- 挂载数据卷
mysql挂载的就是 conf 配置文件、logs 日志文件、data 数据文件。
#创建文件夹-不创建目录也可,挂载时自动创建
mkdir /usr/local/volumes/mysql/conf /usr/local/volumes/mysql/logs /usr/local/volumes/mysql/data
#--restart=always 开机自启
#挂载数据卷
docker run -d -p 3306:3306 --privileged=true \
-v /usr/local/volumes/mysql/conf:/etc/mysql \
-v /usr/local/volumes/mysql/logs:/var/log/mysql \
-v /usr/local/volumes/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root --privileged=true --name=mysql mysql:5.7.37
Redis 安装
- 拉取镜像
#搜索镜像
docker search redis
#拉取镜像
docker pull redis:latest
- 启动容器
#创建容器
docker run -it -d -p 6379:6379 --name redis redis:latest
#连接容器
docker exec -it redis bash
#进入redis
redis-cli
- 挂载数据卷
备份的文件为 配置文件 redis.cnf、日志文件 redis.log 、数据 data。
#创建文件夹
mkdir /usr/local/volumes/redis/conf /usr/local/volumes/redis/logs /usr/local/volumes/redis/data
#创建配置文件
touch /usr/local/volumes/redis/conf/redis.conf
#配置文件;
wget http://download.redis.io/redis-stable/redis.conf
#数据卷挂载
docker run -d -p 6379:6379 --privileged=true \
-v /usr/local/volumes/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/volumes/redis/data:/data \
--name redis redis:latest redis-server /etc/redis/redis.conf
#出现错误:WARNING: IPv4 forwarding is disabled. Networking will not work.
#进入配置文件
vi /etc/sysctl.conf
#添加配置内容
net.ipv4.ip_forward=1
#重启服务
systemctl restart network
#出现错误:Error response from daemon: Container 8fdf734354dee2374d65683c4f5af84aae9d5f7b547fe9ae09fc4b2be9003ff8 is restarting, wait until the container is running
#重启容器
docker restart container_name/_id
al/volumes/redis/data:/data
–name redis redis:latest redis-server /etc/redis/redis.conf
```shell
#出现错误:WARNING: IPv4 forwarding is disabled. Networking will not work.
#进入配置文件
vi /etc/sysctl.conf
#添加配置内容
net.ipv4.ip_forward=1
#重启服务
systemctl restart network
#出现错误:Error response from daemon: Container 8fdf734354dee2374d65683c4f5af84aae9d5f7b547fe9ae09fc4b2be9003ff8 is restarting, wait until the container is running
#重启容器
docker restart container_name/_id