Docker

Docker
小楼夜听雨介绍
docker是软件部署技术,通过容器化技术给应用程序封装独立的运行环境,每个运行环境就是一个容器,运行环境的计算机被称为宿主机,
和虚拟机的区别
每个docker容器之间共用一个系统内核,相当于及其简约版的Linux系统,会缺少很多工具,如vi
每个虚拟机都包含一个完整的操作系统内核
所以docker比虚拟机更轻更小启动速度更快
镜像
镜像是容器的模版,就是安装包
docker registry(镜像仓库)
每个人可以将自己的镜像上传到仓库,别人可以下载使用
官方仓库:docker Hub
安装
linux CentOS7系统:
前置:切换root用户
第一步:先修复 CentOS7 yum 源(root 下执行)
1 | #备份旧源 |
如果 curl 下载 repo 也超时,也可以用 wget。
第二步:安装 Docker(root,不用 sudo)
1 | #下载docker-ce的repo |
第三步:启动 + 配置加速器
1 | systemctl start docker |
下载镜像
命令:docker pull 仓库地址/作者名称/镜像名称:版本号
例如:docker pull docker.io/library/nginx:latest
从官方地址官方名称获取nginx的最新版本镜像
官方的可以省略成:docker pull nginx
注意:docker pull –platform=xxxxx nginx xxx可以填架构,可以指定架构的镜像,正常会自动识别,除非使用小众架构
| 英文名称 | 中文名称 | 例子内容 |
|---|---|---|
| registry | 仓库地址 | docker.io |
| repository | 镜像库 | docker.io/library/nginx |
配置镜像加速
常用命令
| 命令 | 作用 | 例子 |
|---|---|---|
| docker run 镜像名称 | 在前台创建并且运行容器(如果镜像不存在,可以自动下载,代替pull) | docker run nginx |
| docker run - d 镜像名称 | 创建并且运行容器(-d是后台运行,可不写) | docker run -d nginx |
| docker run - p 宿主机端口:容器端口 | 容器和宿主机的网络是隔离的,所以需要继续端口映射,将容器的端口映射到宿主机,让宿主机可以访问,如宿主机访问80端口,就会访问到容器内的80端口的nginx | docker run -p 80:80 nginx |
| docker run - v 宿主机目录:容器内目录 | **挂载卷(绑定挂载)**,可以将容器的内容持久化保存,如果删除容器,则数据会被删除,但是挂载到宿主机的对应目录的数据就会保存在宿主机的对应目录下,宿主机的改目录会覆盖容器的这个目录,可以理解为共享文件夹,但是本体在宿主机,快捷方式在容器 | docker run -v /a:/user/b |
| docker run - v 卷的名字:容器内目录 | 挂载卷(命名卷挂载),特别功能:第一次使用的时候,会把容器文件夹的内容复制到宿主机的文件夹 | docker run -v aaa:/user/b |
| docker volume create 卷名称 | 创建挂载卷,给上面的命名卷挂载用,可以用docker volume inspect 卷名称 查看卷在宿主机地址 |
docker volume create aaa |
| docker volume list | 查看所有卷 | |
| docker volume rm 卷名 | 删除卷 | |
| docker volume prune -a | 删除所有没有容器在使用的卷 | |
| docker run - e 环境变量 | 可以储存环境变量,例如MongoDB数据库使用的时候需要账号密码,可以将账号密码保存为环境变量,启动就不用账号密码了 | docker run - e MONGO_INITDB_ROOT_USERNAME=YZF522 |
| docker run –name 容器名称 镜像名称 | 创建的时候,给容器起名称(唯一) | |
| docker run -it –rm 容器名称 | -it可以进入容器交互,–rm表示关闭容器时删除容器,一般一起使用,临时调试一个容器,alpine是轻量化Linux系统 | docker run -it –rm alpine |
| docker run –restart always 容器名称 | –restart 配置容器停止时的策略,一般和always 使用,停止时立刻重启,和unlees-stopped一起时,也是停止时立刻重启但是手动停止时不会重启 | |
| docker ps | 查看正在运行的容器进程 ps 后面加 -a 可以看到所有容器 | docker ps |
| docker rm 容器名称或者id | 删除容器,如果是正在运行的容器需要 -f | |
| docker images | 查看下载了的镜像 | |
| docker rmi 镜像名称或者id | 删除镜像 | docker rmi nginx |
调试容器
docker run 命令 每次都会创建新的容器,如果我们不想创建可以使用一下命令调试旧容器
| 命令 | 作用 | 例子 |
|---|---|---|
| docker start 容器名字或者id | 启动 | |
| docker stop 容器名字或者id | 关闭 | |
| docker inspect 容器名字或者id | 查看容器的配置 | |
| docker create 镜像名字 | 创建容器,但是不立即启动 | |
| docker exec 容器名字或者id 命令 | 可以在容器内部使用Linux命令 | |
| docker exec -it 容器id /bin/sh | 可以进入容器内部,并且获得交互环境,就是一个及其简约版的Linux系统 | |
制作镜像
使用dockerfile可以制作镜像
步骤:
创建一个Dockerfile 文件(没有后缀)
第一行是 FROM 基础镜像(官方镜像搜索比如Python的 FROM Python:3.13-slim)
第二行 WORKDIR 文件地址 (表示后面的代码的运行地址 比如 WORKDIR /app)
第三行 COPY . . (表示将当前目录下的代码复制到docker的对应目录 如上面的/app 前面的.表示当前地址,后面的.表示docker的当前地址)
第四行 run pip install -r 库名.txt (表示下载需要的库文件 ,库名.txt里面写了需要的库的名称)
第五行 EXPOSE 端口号 (声明这个镜像提供的端口,并不是强制的,实际以代码为主,这是给使用这个镜像的人的提示,不写也没有影响)
第六行 CMD [命令] (容器启动时候运行的命令如 CMD [“Python3”,”maun.py”] 一个容器只能用一个CMD ,ENTRYPOINT[]也可以,优先级更高,不容易被覆盖)
在当前目录下打开终端 输入
docker build -t 用户名/名称 :版本号 .(用户名/是hub的用户名,在推送时必须要,不推送可以省略;名称自定义;版本号可以省略,点表示生成在当前文件夹下构建)
然后就生成好了,可以使用
docker run -d -p 8000:8000 名称创建一个容器
推送镜像
- 终端输入 docker login 获取到地址加验证码
- 打开地址填入验证码,终端显示 Login Succeeded
- 推送
docker push 用户名/名称
网络
桥接模式(bridge)
docker网络默认是桥接模式,容器之间有内部ip,可以相互访问,和宿主机的网络不互通
可以使用 docker network create network1 创建名称为 network1 的子网,并且指定容器加入
同一子网内的容器可以使用名称通信,不必用ip,跨子网不可以通信
使用: 在run 创建容器的时候,加上 –network 子网名称
运用:创建一个数据库容器 SQL1 在子网1并且不暴露端口 再创建一个网页端容器加入子网1,并且暴露端口映射,这样外网就可以通过网页容器间接通过子网操控数据库
host模式
这个模式直接使用宿主机的网络ip和端口
运行在宿主机的网络环境下
使用: 在run 创建容器的时候,加上 –network host
不用进行端口映射
none模式
不联网模式
使用: 在run 创建容器的时候,加上 –network none
删除子网
sudo docker network list 查看全部的子网
sudo docker network rm 子网id 删除子网
docker compose
在实际应用中,一个软件有很多部分组成,比如数据库,前端后端等,如果直接打包成一个容器,那么风险就比较高,因为如果一个地方保存,整个容器就停摆,要创建多个容器就资源占用大
如果创建很多个小容器,则非常麻烦。要使用很多run命令,并且配置网络等,管理麻烦
所以引入docker compose可以解决这个问题,这是一个轻容量的容器编排技术
可以通过yaml文件统一管理多个容器
使用: vi docker-compose.yaml 创建一个yml文件,注意:一个yml文件会默认创建一个子网,并且里面的服务容器都在该子网下
1 | # 顶层配置项:声明当前文件要管理的所有 Docker 服务 |
创建完成之后,通过sudo docker compose up -d 执行该文件,创建里面的容器并在后台运行,
通过sudo docker compose stop,可以停止容器
通过sudo docker compose start,可以启动停止的容器
通过sudo docker compose down,可以停止并且删除容器
注意:如果已经up了,那再up是无效的,可以通过改名字来再启动一个
如,创建一个非标准文件名 test.yaml
通过sudo docker compose -f test.yaml up -d 启动
-f test.yaml表示文件地址,可以在别的目录下的文件,/home/test.yaml
注意:docker compose适合个人使用单机运行,对应企业级服务器集群的大规模容器编排需求,要使用Kubernetes(k8s),下一章节独立写!
到此结束!





