Docker

介绍

docker是软件部署技术,通过容器化技术给应用程序封装独立的运行环境,每个运行环境就是一个容器,运行环境的计算机被称为宿主机,

和虚拟机的区别

每个docker容器之间共用一个系统内核,相当于及其简约版的Linux系统,会缺少很多工具,如vi

每个虚拟机都包含一个完整的操作系统内核

所以docker比虚拟机更轻更小启动速度更快

镜像

镜像是容器的模版,就是安装包

docker registry(镜像仓库)

每个人可以将自己的镜像上传到仓库,别人可以下载使用

官方仓库:docker Hub

安装

linux CentOS7系统:

前置:切换root用户

第一步:先修复 CentOS7 yum 源(root 下执行)

1
2
3
4
5
6
7
#备份旧源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
#下载阿里云CentOS7归档源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#清理缓存并生成新缓存
yum clean all
yum makecache

如果 curl 下载 repo 也超时,也可以用 wget。

第二步:安装 Docker(root,不用 sudo)

1
2
3
4
#下载docker-ce的repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
yum install docker-ce -y

第三步:启动 + 配置加速器

1
2
3
4
5
6
7
8
9
10
11
12
systemctl start docker
systemctl enable docker
#配置国内镜像加速
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://mirror.baidubce.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
#验证
docker --version

下载镜像

命令: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可以制作镜像

步骤:

  1. 创建一个Dockerfile 文件(没有后缀)

  2. 第一行是 FROM 基础镜像(官方镜像搜索比如Python的 FROM Python:3.13-slim)

  3. 第二行 WORKDIR 文件地址 (表示后面的代码的运行地址 比如 WORKDIR /app)

  4. 第三行 COPY . . (表示将当前目录下的代码复制到docker的对应目录 如上面的/app 前面的.表示当前地址,后面的.表示docker的当前地址)

  5. 第四行 run pip install -r 库名.txt (表示下载需要的库文件 ,库名.txt里面写了需要的库的名称)

  6. 第五行 EXPOSE 端口号 (声明这个镜像提供的端口,并不是强制的,实际以代码为主,这是给使用这个镜像的人的提示,不写也没有影响)

  7. 第六行 CMD [命令] (容器启动时候运行的命令如 CMD [“Python3”,”maun.py”] 一个容器只能用一个CMD ,ENTRYPOINT[]也可以,优先级更高,不容易被覆盖)

  8. 在当前目录下打开终端 输入 docker build -t 用户名/名称 :版本号 .

    (用户名/是hub的用户名,在推送时必须要,不推送可以省略;名称自定义;版本号可以省略,点表示生成在当前文件夹下构建)

  9. 然后就生成好了,可以使用 docker run -d -p 8000:8000 名称 创建一个容器

推送镜像

  1. 终端输入 docker login 获取到地址加验证码
  2. 打开地址填入验证码,终端显示 Login Succeeded
  3. 推送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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 顶层配置项:声明当前文件要管理的所有 Docker 服务
services:
# 定义第一个服务:自定义服务名为 my_mongodb(MongoDB 数据库服务)
my_mongodb:
# 指定该服务使用的 Docker 镜像:官方 mongo 镜像
image: mongo
# 配置注入容器的环境变量
environment:
# MongoDB 官方镜像的环境变量:初始化 root 管理员的用户名
MONGO_INITDB_ROOT_USERNAME: name
# MongoDB 官方镜像的环境变量:初始化 root 管理员的密码
MONGO_INITDB_ROOT_PASSWORD: pass
# 配置数据卷挂载(实现数据持久化,容器删除后数据仍保留在宿主机)
volumes:
# 挂载格式:宿主机目录路径 : 容器内目录路径
# 把宿主机的 /my/datadir 目录,挂载到容器内 MongoDB 默认的数据存储目录 /data/db
- /my/datadir:/data/db

# 定义第二个服务:自定义服务名为 my_mongodb_express(MongoDB 的 Web 管理界面)
my_mongodb_express:
# 指定该服务使用的 Docker 镜像:mongo-express 官方镜像
image: mongo-express
# 配置端口映射:宿主机端口 : 容器内服务端口
ports:
# 把宿主机的 8081 端口映射到容器内 mongo-express 默认的 8081 端口
- 8081:8081
# 配置注入容器的环境变量,用于让 mongo-express 连接 MongoDB
environment:
# 指定要连接的 MongoDB 服务器地址
# Docker Compose 内部网络中,可以直接用「服务名」作为主机名互相访问
ME_CONFIG_MONGODB_SERVER: my_mongodb
# 连接 MongoDB 所用的管理员用户名
ME_CONFIG_MONGODB_ADMINUSERNAME: name
# 连接 MongoDB 所用的管理员密码
ME_CONFIG_MONGODB_ADMINPASSWORD: pass
# 配置服务启动依赖:控制启动顺序,先启动 my_mongodb,再启动当前服务
depends_on:
- my_mongodb

创建完成之后,通过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),下一章节独立写!

到此结束!