Docker笔记
项目部署的问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题
- 依赖关系复杂,容易出现兼容性问题
- 开发,测试,生产环境有差异
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题
- 将应用函数库,依赖,配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,使用沙箱机制,避免互相干扰
Docker如何解决开发,测试,生产环境有差异的问题
- Docker镜像中包含完整运行环境, 包括系统库函数,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。
补充:Ubuntu和CentOS都是居于Linux内核,只是系统应用不同,提供的函数库有差异
Docker与虚拟机
区别
- 虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统。
- Docker是一个系统进程。
Docker架构
镜像和容器
镜像(Image):Docker将应用程序以及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Dokcer和DockerHub
DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry
国内也有类似与DockerHub的公共服务,比如网易云镜像服务,阿里云镜像服务库。
Docker架构
Docker是一个CS架构的程序,由两部分组成
服务端(Server):Docker守护进程,负责处理Docker指令,管理镜像,容器等
客户端(Client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
Docker的安装
Docker版本
Docker分为CE和EE两大版本。CE即社区办(免费,支持周期7个月),EE即企业版,强调安全,付费使用,支持周期24个月
Docker CE分为stable test 和nightly三个更新频道。
CentOS与Docker版本对应
Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7 满足最低内核的要求,所以基本使用CentOS7安装Docker
安装docker
1.查看docker和卸载指定docker
- 查看已经安装的docker:yum list installed | grep docker
- 卸载指定的docker:yum -y remove [name]
2..如果之前安装过旧版本的Docker,可以使用以下命令卸载:
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工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
4.配置镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
5.安装docker
yum install -y docker-ce
参数-y表示安装过程中遇到的所有选项都为yes
查看空间:df -hT
启动Docker
启动前准备的事情
Docker应用需要使用到各种端口,逐一去修改防火墙设置,非常麻烦,因此建议直接关(仅用于学习)
Linux关闭防火墙命令
查看防火墙状态:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
禁止开机启动防火墙:systemctl disable firewalld
docker相关操作
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker版本:docker -v
镜像加速
创建文件夹
sudo mkdir -p /etc/docker
创建daemon.json文件并写入内容
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n0dwemtq.mirror.aliyuncs.com"]
}
EOF
修改文件名
mv /etc/docker/daemon.json /etc/docker/daemon.conf
加载并重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker基本操作
镜像相关命令
镜像名称一般分为两部分组成:[repository]:[tag]
如果没有指定tag,则默认是latest,代表最新版本的镜像
镜像操作命令
- 构建镜像:docker build [repository]:[tag]
- 查看镜像 :docker images
- 从服务拉取镜像:docker pull [repository]:[tag]
- 删除镜像:docker rmi [repository]:[tag]
- 推送镜像到服务:docker push [repository]:[tag]
- 保存镜像为一个压缩包:docker save [repository]:[tag]
- 加载压缩包为镜像:docker load [repository]:[tag]
案例:从DockerHub拉取一个nginx镜像并查看
- 首先去镜像仓库搜索nginx镜像,比如DockerHub。带有Official Image标签的表示官方的正版镜像
- 拉取nginx镜像:docker pull nginx
- 查看镜像:docker images
案例:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
可以使用docker save --help和docker load --help来查看命令使用方法
- 导出到磁盘:“docker save -o 导出的文件名 镜像:版本号”。如:docker save -o nginx.tar nginx:latest
- 删除镜像:docker rmi nginx
- 查看镜像:docker images
- 加载镜像:docker load -i 导出的文件名
案例 取DocherHub搜索并拉取一个Redis镜像
- 去DockerHub搜索Redis镜像
- 查看Redis镜像的名称和版本
- 利用docker pull命令拉取镜像
- 利用docker save命令将redis:latest打包为一个redis.tar包
- 利用docker rmi删除本地额redis:latest
- 利用docker load重新加载redis.tar文件
容器相关命令
- 创建并容器:docker run --name [ContainerName] -p 宿主机端口:容器端口 [Container]
- 参数:
- -d表示后台启动
- docker run:创建并运行一个容器
- --name:给容器起一个名字,比如叫做mn
- -p:将宿主机端口与容器端口映射,冒号左边是宿主机端口,右侧是容器端口,将宿主机端口与容器端口映射,以后访问宿主机端口时,会自动提交到容器端口
- [Container]:镜像名称
- 参数:
- 容器挂起:docker pause [ContainerName]
- 容器恢复挂起:docker unpause [ContainerName]
- 停止容器:docker stop [ContainerName]
- 启动容器:docker start [ContainerName]
- 查看所有运行的容器及状态:docker ps
- 参数说明: -a:输出所有容器,包括停止的
- 查看容器运行日志:docker logs [ContainerName]
- 参数说明:-f表示自动追踪日志
- 查看容器执行命令:docker exec
- 删除指定容器:docker rm
- 参数说明:-f:强制删除
- 进入容器:docker exec -it [ContainerName] bash
- 参数说明:
- -it:给当前进入的容器创建一个标准输入,输出终端,允许我们与容器交互
- mn:要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
- 参数说明:
注意:停止与暂停相当于进程的挂起与终止
注意:docker要在防火墙关闭之后才能启动,否则容器无法使用。
案例:创建一个Nginx容器
1.去docker hub查看Nginx的容器运行命令
2.docker run --name containerName -p 80:80 -d nginx
案例:进入Nginx容器,修改HTML文件内容,添加“清风拂明月,山海有相逢”
1.进入容器。进入创建的nginx容器的命令为:docker exec -it mn bash
运行之后终端会发生变化
参考nginx官方文档,可以指导静态文件资源是放在“/usr/share/nginx/html”中,首页尾index.html
2.由于阉割版的的系统没哟vim编辑器,所以使用命令来替换内容
sed命令使用格式:sed -i 's#被替换的内容#新内容#g' 文件名
sed -i 's#Welcome to nginx#清风扶明月,山海有相逢#g' index.html
sed -i 's#<head>#<head><meta charset = "utf-8">#g' index.html
可以使用cat index.html查看index.html内容
3.输入exit命令退出容器,然后重启容器,访问localhost
重启容器:
docker restart mn
或者使用:
docker stop mn
docker start mn
案例:创建并运行一个redis容器,并且支持数据持久化
- 拉取redis镜像:docker pull redis
- 创建redis容器:docker run --name myredis -p 80:80 -d redis
案例 进入redis容器,并执行redis-cli客户端命令,存入num=666
- 进入容器:docker exec -it myredis bash
- 使用redis客户端:redis-cli
- 存入值:set num 666
- 查看值:get num或keys *
数据卷
容器与数据耦合的问题
不便于修改
当我们要修改Nginx的html内容时,需要进入容器的内部修改,很不方便
数据不可复用
在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的
升级维护困难
数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了
数据卷的定义
数据卷(volume)是一个虚拟的目录,指向宿主机文件系统中的某个目录
容器内的文件夹与容器外的内容映射。避免了修改时需要进入容器内修改。
数据卷的操作
docker volume [COMMAND]
COMMAND命令如下:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
案例,创建一个数据卷,并查看数据卷在宿主机的目录位置
使用docker volume create html来创建一个html数据卷
使用docker volume ls查看自己的创建数据卷
使用docker volume inspect html来检查html数据卷
使用docker volume prune删除所有未使用的数据卷
挂在数据卷
在创建容器时,可以通过-v参数来挂在一个数据卷到某个容器目录
案例,创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-v参数挂载数据卷
使用docker volume create html来创建html数据卷
使用docker run --name mn -p [宿主机端口]:[容器端口] -v html:/usr/share/nginx/html -d nginx挂载容器
注意:如果挂载数据卷的时候数据卷不存在,docker会自动创建一个
检查html数据卷挂载的位置并进入此位置
使用vim工具修改index.html
访问页面即可看到修改后的内容
docker容器内使用文件的优先级是 数据卷内容 > 容器内容
数据卷内容与容器内容同时存在时,加载的是数据卷内容,当数据卷内容被删除时,加载的才是容器内容。
基于文件或者目录挂在
案例,创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
提示:目录挂在与数据卷挂在的语法类似:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
拉取mysql5.7.25镜像
docker pull mysql:5.7.25
创建目录/tmp/mysql/data
mkdir -p mysql/data
创建爱目录/tmp/mysql/conf
mkdir -p mysql/config
-p表示多级创建
创建容器
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=123456789 -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
第一个-v是挂在配置目录
第二个-v是挂在数据目录
基于数据卷挂在的区别
数据卷挂在耦合度低,由docker来管理目录,但是目录较深,不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
Dockerfile自定义镜像
镜像结构
镜像是将应用程序以及其所需要的系统库函数,环境,配置,依赖打包而成。
自定义镜像
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
案例,基于Ubuntu镜像构建一个新镜像,运行一个java项目
1.新建一个空文件夹docker-demo
mkdir -p /tmp/docker-demo
2.下载文件
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F
密码:1234
下载jdk8.tar.gz,Dockerfile,docker-demo.jar
补充:linux打包命令
tar zcvf xxx.tar.gz xxx
Dockerfile内容为:
3.进入到/tmp/docker-demo中构建包
docker build -t javaweb:1.0 .
最后要加一个空格再加一个“.”表示在本目录
4.根据镜像创建容器并启动
docker run --name web -p 8090:8090 -d javaweb:1.0
访问localhost:8090/hello/count即可访问成
DockerCompose
Docker Compose可以居于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行
安装DockerCompose
1.下载
curl -L \
https://github.com/docker/compose/releases/downlead/1.29.1/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose
或者直接在百度网盘下载然后使用Xftp上传到/usr/local/bin/文件中
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F
密码:1234
2.进入/usr/local/bin/目录,给文件加个执行的权限
chmod +x /usr/local/bin/docker-compose
3.配置自动补全命令
curl -L \
https://raw.githubusercontent.com/docker/conpose/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
案例,将之前学习的cloud-demo微服务集群利用DockerCompose部署
1.下载cloud-demo
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F
密码:1234
修改自己的cloud-demo项目,将数据库,nacos地址都命名为docker-compose中的服务名
使用maven打包工具,将项目中的每个微服务项目都打包成app.jar
pom文件中build标签中有个finalName标签,里面写的就是打包完成的名称
将打包好的app.jar拷贝到cloud-demo中的每一对应的子目录中
将cloud-demo上传到虚拟机/usr/local/bin,利用docker-compose up -d来部署
由于nacos启动比其他的服务慢,可能导致其他服务无法注册到nacos,需要重启
docker-compose restart gateway userservice orderservice来重启服务
docker-compose logs -f userservice 可以查看日志
Docker镜像仓库
常见的镜像仓库
镜像仓库(Docker Registry)有公共的和私有的两种形式:
公共仓库:例如Docker官方的Docker Hub
私有仓库:用户可以在本地搭建私有Docker Registry
简化版镜像仓库
缺点是没有图形化界面,
搭建方式如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
带图形化界面版本
使用DockerCompose部署带有图像界面的DockerRegistry
配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
#添加内容
"insecure-registries":["http://自己的ip:8080"]
#重新加载
systemctl daemon-reload
#重启docker
注意:配置之间需要使用逗号“,”隔开
创建文件夹
mkdir registry-ui
创建compose文件
touch docker-compose.yml
写入以下内容
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=波的仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
部署:docker-compose up -d
查看日志:docker-compose logs -f
打开浏览器输入地址:localhost:8080即可访问自己的私有仓库
推送镜像到私有服务,步骤如下:
1.重新tag本地镜像,名称前缀必须为私有仓库地址:自己ip:8080/
docker tag nginx:latest xxx.xxx.xxx.xxx:8080/nginx:1.0
2.推送到私有仓库
docker push xxx.xxx.xxx.xxx:8080/nginx:1.0
3.拉取镜像
点击Tag会自动复制命令
本文来自博客园,作者:Laplace蒜子,转载请注明原文链接:https://www.cnblogs.com/RedNoseBo/p/16435659.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律