视频参考:https://www.bilibili.com/video/BV1THKyzBER6/
文章参考:https://www.runoob.com/docker/docker-tutorial.html

Docker的核心概念

Docker就是用容器化技术给应用程序封装独立的运行环境,而每一个运行环境就是一个容器

  • 优点:
    • 更轻,更小,启动快:Docker容器之间共用同一个系统内核,区别于虚拟机每一个系统都包含一个自己的操作系统的完整内核
  • 核心概念:
  • 宿主机:运行容器的计算机被称为宿主机
  • 镜像:镜像就是软件安装包,而容器就是安装出来的软件
  • 镜像仓库(Docker Registry):就是用来存放分享的镜像的地方,分享上来的镜像其他人就可以下载使用Docker的官方仓库:Docker Hub

安装Docker

Ubuntu下安装docker

  1. 第一步:
    1
    curl -fsSL https://get.docker.com -o  install-docker.sh
  2. 第二步:
    1
    sudo sh install-docker.sh

Windows下安装docker

  1. 搜索Window功能:
    • 勾选上Virtual Machine Platform(虚拟机平台)
    • 勾选上适用于Linux的Windows子系统(WSL)
    • 确定,重启电脑
  2. 安装WSL
    • 以管理员身份打开cmd
    • 设置wsl默认版本wsl --set-default-version 2
    • 安装wsl --uupdate --web-download

      –web-download看自身电脑下载情况加

  3. 下载docker desktop
  4. 在cmd输入docker --version,有版本号说明安装成功了(注意要打开软件)

Mac下安装docker

对应下载docker desktop就行了🥲

配置镜像站

摘自轩辕镜像
一键配置(liunx)

1
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

Docker命令

  • docker pull:用来从仓库下载镜像

    • --platform=xxxxxx作为可选项,只有在小部分特殊情况需要填写对应宿主机的cpu架构,正常docker会自动选择对应的
      示例:
    1
    docker pull docker.io/library/nginx:latest
    • 注册表地址:Docker仓库的注册表地址,docker.io这里是官方的地址,可以省略不写
    • 命名空间:避免重复,library这里属于官方命名空间,可以省略不写
    • 标签(版本号):latest这里,可以指定下载特定版本,不写就是获取最新版本
  • docker images:列出所有下载过的Docker镜像

  • docker rmi 镜像:删除镜像

  • docker rm -f 容器ID/名字:删除容器

    • -f表示强制删除,如果容器不是正在运行可以不用
  • docker volume create 卷名:新创建一个挂载卷

  • docker volume inspect 卷名:查看卷在宿主机的真实目录

  • docker volume list:列出所有创建过的卷

  • docker volume rm 卷名:删除卷

  • docker volume prune -a:删除所有没有任何容器在使用的卷

  • docker ps:用来查看在运行的容器

    • -a可以查看所有的容器,包括停止的
  • docker start 容器ID/名字:启动已有容器

  • docker stop 容器ID/名字:停止容器运行

  • docker inspect 容器ID:查看容器的配置信息

  • docker create:与docker run类似,但是只创建不启动

  • docker logs 容器ID/名字:查看容器的日志

    • 末尾加上-f可以追踪输出
  • docker exec 容器ID/名字 linux命令:进入容器内部使用Linux指令

  • docker exec -it 容器ID/名字 /bin/bash:进入容器内部交互执行

    这里注意,因为docker为了压缩大小,内部操作系统往往缺少很多必要工具,在自行安装之前,记得使用cat /etc/os-release查看发行版本,使用对应命令安装

  • docker network list:展示所有网络

docker run

因为参数太多了所以单独列出
docker run 镜像:✨创建并运行容器

  • pull其实有时可以省略,直接运行发现本地不存在会自动获取

  • 多个参数之间用\分开

  • 一般用-d:分离模式,表示让容器在后台执行

  • 使用-p进行端口映射-p 80:80前面是宿主机端口,后面是容器内的端口

  • 使用-v 挂载卷

    • -v 宿主机目录:容器内目录,宿主机目录覆盖容器内目录,也叫绑定挂载
    • -v 卷的名字:容器内目录命名卷挂载,这种方式第一次使用会进行初始化,区别于绑定挂载
  • -e添加环境变量,例如mongodb这样的数据库需要账号密码,就可以通过-e 后面添加要传递的环境变量(不知道就去仓库查)

  • --name [自定义名字]:给容器自定义名字,但是必须在宿主机上唯一

  • it:使我的控制台进入容器可以交互

  • --rm:当容器停止时就删除

  • --restart:重启策略

    • --restart always:只要容器停止就立即重启
    • --restart unless-stopped:与always类似,但是手动停止的容器不会尝试重启
  • --network 子网名称:容器放入哪个子网

    • --network host:启用host模式

Dockerfile

  • Dockerfile一句话来讲就是用来制作镜像的文件
  • Dockerfile就是这个文件的文件名,D要大写没有后缀
    常见参数:
    FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

WORKDIR:切换到镜像内的一个目录

COPY . .:第一个点代表电脑文件当前目录,第二个点代表镜像内的当前工作目录

EXPOESE:声明端口,给其他使用镜像的人做的声明,非强制

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

  • pip install下载依赖

CMD []:容器启动时的默认启动命令,[]是建议写成数组的形式,中间最好不要用空格,一个Dockfile只有一个CMD
ENTRYPONINT:与CMD类似,优先级更高,更不容易被覆盖

创建镜像

当前目录打开控制台
输入docker build -t 用户名/镜像名 [:版本号] .:版本号可以不写,.指在当前文件夹构建,用户名如果要推送到docker hub上就一定要写

推送到docker hub上

  1. 登录:
    控制台输入docker login
    打开给的网站输入出现的英文验证码
    回来显示Login Succeeded就成功了
  2. 输入docker push 用户名/镜像名

Docker网络

展示所有网络见Docker指令部分

桥接模式

  • Docker默认的网络是桥接模式,而Docker内部容器可以相互连接,但与宿主机是不互通的
  • 通过docker network create network1创建子网
    • 不同子网之间互不通信
    • 相同子网可以通过名称通信而不需要内部ip地址
  • 通过docker network rm 子网名删除自定义的子网-默认的三种连接方式是不能删除的

Host模式

host模式可以解决一些棘手的网络问题,其核心是容器使用宿主机ip和端口,就无需再做端口映射,参数见docker run

None模式

就是不连接网络

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
同一个Compose创建下的容器都会自动加入同一个子网
Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行.

    这里文件名要严格一致才可以执行,非标准文件名或者不在当前目录就需要compose后面加上-f 文件地址执行

  • 最后,执行 docker compose up 命令来启动并运行整个应用程序。
    • 同样可以使用-d让其在后台运行
    • docker compose down会停止并删除容器
    • docker compose stop只停止不删除
    • docker compose start启动容器

docker-compose.yml 的配置案例如下(配置参数参考下文):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}