虚拟容器化学习----Docker学习
安装前准备
yum install -y yum-utils device-mapper-persistent-data lvm2
安装数据存储驱动包 , 安装yum 工具yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
设置安装源yum makecache fast
yum 自动检测最快安装源
安装
yum -y install docker-ce
安装
service docker start
启动
检测
docker version
查看版本信息
docker pull hello-world
下载
docker run hello-world
更换阿里云的镜像加速
- 登录阿里云
- 搜索镜像加速器
- 根据相关操作文档操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [加速器地址]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker 是什么
docker 引擎- docker REST API
- docker CLI
docker 结构
- 客户端:docker CLI
- 通信层:REST API
- 引擎:docker daemon
容器与镜像
镜像
容器
/var/lib/docker
除非特殊需要,一般不建议修改默认安装地址
Docker 常用命令
docker pull 镜像名<:tags> - 从远程仓库抽取镜像- tags:指定版本类型
docker images - 查看本地镜像docker run 镜像名<:tags> - 创建容器,启动应用- 如果在运行
run 的时候,镜像在没有pull 到本地的话docker 会先去pull latest 版本的镜像latest 版本为使用最多的版本 - tags:指定版本类型
- 如果在运行
docker ps - 查看正在运行中的镜像docker rm <-f> 容器id - 删除容器- 如果容器在运行的情况下
<-f> 强制删除
- 如果容器在运行的情况下
docker rmi <-f> 镜像名<:tags> - 删除镜像- 如果镜像存在且有容器在运行的情况下
<-f> 强制删除 - tags:指定版本类型
- 如果镜像存在且有容器在运行的情况下
docker stop 容器id - 停止容器docker exec [-it ] 容器id linux 命令...[bash || /bin/bash] exec 在容器内部执行命令-it 使用交互的方式执行命令
PS
-
hub.docker.com
docker 远程中央仓库 -
在开发中可以使用
-f 强制移除,但是在开发环境中不能这么做,-f 相当于强制关机。 -
docker hub 一般有图片或者镜像名为需要的软件名一般是官方提供的。其他的通常是有第三方或个人提供的。第三方的一般不推荐,除非你对它非常了解
Docker 宿主机与容器通信
-p 端口映射-d 后台运行
查看
容器生命周期
DockerFile 构建镜像
什么是Dockerfile
DockerFile 是一个包含用于组合镜像的命令的文本文档Docker 通过读取Dockerfile 中的指定命令按步自动生成镜像docker build -t 机构/ 镜像名<:tags> Dockerfile 目录
Docker 的分层(Docker layer)
列如
-
构建一个普通的
Dockerfile
-
对
Dockerfile 重新进行编辑
修改完之后重新
它使用了缓存,这里看到没有使用缓存的是由输出的。使用缓存的是没有输出的
Dockerfile 基础命令
-
FROM 容器版本
基于基准镜像- 尽量使用官方提供的
BASE Image FROM scratch
不依赖任何基准镜像
- 尽量使用官方提供的
-
MAINTAINER 作者
没有运行含义,只是说明名作者 -
LABEL XXX="XXX"
描述性信息 -
WORKDIR 容器目录
切换工作目录, 如果当前目录不存在的时候,会自动创建这个目录- 这个目录是通过我们的
docker exec -it 进程号 bash
进入来的
- 这个目录是通过我们的
-
尽量使用绝对路径
-
ADD 宿主机目录 容器目录
将宿主机的目录全部复制到容器目录中ADD xxx.gz /
添加根目录并解压缩ADD 除了复制,还具备添加远程文件功能
-
ENV XXX /XXX/XXX
设置环境常量- ENV JAVA_HOME /usr/local/openjdk8
- RUN ${JAVA_HOME}/bin/java -jar XXX.jar
- 尽量使用环境常量,可提高程序的维护性
-
RUN&&CMD&&ENTRYPOINT
RUN
在构建镜像时执行命令(修改镜像内部的文件)CMD|ENTRYPOINT
在容器创建时执行命令(对容器中的文件进行操作)
RUN 构建时运行
- 命令格式 RUN yum install -y vim # Shell
- 命令格式
RUN ["yum","install","-y","vim"] #Exec - 在分不清的情况下推荐使用
Shell 运行方式
- 使用
Shell 执行时,当前shell 时父进程,生成一个子shell 进程 - 在子
shell 中执行脚本,脚本执行完毕,退出子shell 进程,回到当前shell
Exec 运行方式
- 使用
Exec 方式,会用Exec 进程替换当前进程,并保持PID 不变 - 执行完毕,直接退出,并不会退回之前的进程环境
ENTRYPOINT 启动命令
ENTRYPOINT ( 入口点) 用于在容器启动时执行命令Dockerfile 中只有最后一个ENTRYPOINT 会被执行- 推荐使用
Exec 格式
CMD 默认命令
CMD 用于设置默认执行的命令- 如
Dockerfile 中出现多个CMD ,则只有最后一个被执行 - 如容器启动时附加指令,则
CMD 被忽略 - 推荐使用
Exec 命令格式 - 若容器启动时有其他的参数,
CMD 将不会执行
- 如
当我们使用下面这种情况启动容器时
Dockerfile 使用例子
使用Dockerfile 构建redis
FROM centos
# 安装C编译组件
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
- 构建镜像
docker build -t xxx/xxx:1.0 .
- 启动容器
docker run -p 7000:6379 xxx/xxx:1.0
容器间的单向访问
docker inspect id
显示容器的原数据
在容器间通信的时候不能使用
这时我们可以通过对容器取个名字
docker run -d --name xxx 镜像
在没有配置的情况下,
若要能使用别名访问需要在启动的时候添加额外的参数
docker run -d --name xxx --link 别名 镜像名
Bridge 网桥双向通信
网桥还可以实现
docker network ls
: 列出docker 网络服务docker network create -d bridge 网桥名称
创建网桥docker network connect 网桥名称 容器名称
容器与网桥绑定
Volume 容器间数据共享
在宿主机上开个空间,所有容器可以读取这个空间上的文件
通过设置
-v 挂在宿主机目录
docker run --name 容器名 —v 宿主机路径: 容器内挂在路径 镜像名通过
--volumes-from 共享容器内挂载点
- 创建共享容器
docker create --name 共享容器名 -v /xx/xx:/xx/xx 镜镜像名 /bin/true
- 共享容器挂载点
docker run --volumes-from 共享容器名 --name xxx -d 镜像名
DockerCompose 容器编排
我们可以使用
Docker Compose 单机多容器部署工具- 通过
yml 文件定义多容器如何部署 WIN/MAC 默认提供Docker Compose, Linux 需要安装
安装
由于是
https://docs.docker.com/compose/install/
安装后若出现
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc
这种情况的问题则是版本不对,需要去官网下载对应版本的
将/usr/local/bin/
路径下的
重新上传正确版本的
授权chmod +x /usr/local/bin/docker-compose
因为正式环境下使用的比较少,一般不使用这个,所以这里我不打算研究了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!