Table of Contents

Docker

虚拟化和容器化

https://www.docker.com/

外链资料:

  1. 40分钟的Docker实战攻略,一期视频精通Docker(目前为止看到的最好的教程) https://www.youtube.com/watch?v=_-IPi1a774E
  2. 30分钟Docker入门教程 https://www.youtube.com/watch?v=Ozb9mZg7MVM
  3. Docker 的入门「指北」 https://sspai.com/post/56893
  4. Play with Docker, first round https://www.youtube.com/watch?v=isr6cPKy8eg

祖传代码:

Docker和pip (python)、apt (debian)之类的工具一样,都是需要连接网络拉取数据的,曾经因为国内的网络,我也研究过很长时间的类似「如何自己从源码编译安装pip包」,「如何保存Linux软件的离线安装包」,「如何自己搭建软件源」之类的问题,就怕没办法连接网络或者下载失败。但是研究这些问题,还不如想办法解决自己的网络问题。实用主义至上,不需要没有必要的问题浪费时间(特别是自己没有兴趣的时候)


基础知识

  1. Docker是依赖于Linux环境的,即使是Windows版本的Docker,也是需要依赖于Windows的虚拟机(WSL),相当于还是基于Linux。原因是Docker的底层实现依赖于Linux(cgroups)(【后续更正】其实有原生Windows的Docker,只是没有Linux Docker那么应用广泛而已)
  2. 通过在Windows的虚拟的Linux,可以运行Docker,一定程度上相当于跨系统。但是Docker(的镜像)不能跨cpu架构(x86,amd64,arm),在Docker Hub上,可以查看一个Image对应的指令集(CPU架构),比如https://hub.docker.com/_/nginx/tags
  3. Docker是容器技术的一种,还有其他的容器技术,只是Docker做得比较成功
  4. Docker是前后端分离,如果安装Docker Desktop版本的话,Client和Server都是安装在本地机器上:Client用于发送命令,就是我们常用于那些 run 之类的命令;Server用于真正运行容器
  5. Dockerfile –(build)–> Image –(run)–> Container

安装

Windows上安装前(可能)要先开启虚拟化,安装WSL

验证安装:

% docker version
% docker run hello-world

镜像管理

镜像:Image

# 查看(本地)现有的镜像列表
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker images
REPOSITORY           TAG               IMAGE ID       CREATED         SIZE
dj                   1.0.0             9de00d187cd2   12 hours ago    274MB
diygod/rsshub        latest            a4da8b424ebd   15 hours ago    1.46GB
redis                alpine            987c376c7276   5 weeks ago     98.8MB
couchbase            community-7.6.2   9710241dec75   3 months ago    1.63GB
browserless/chrome   latest            57d19e414d9f   19 months ago   4.59GB
 
# 删除一个镜像(根据ID)
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker image rm a4da8b424ebd
Untagged: diygod/rsshub:latest
Deleted: sha256:a4da8b424ebd60adfb9418030e6751c26b1d8f7f1029547e7904bbbacb71d7fa
 
# 拉取一个镜像(默认是从DockerHub拉取),需要镜像的name和tag
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker pull hello-world:linux
linux: Pulling from library/hello-world
198f93fd5094: Pull complete 
Digest: sha256:53cc1017c16ab2500aa5b5367e7650dbe2f753651d88792af1b522e5af328352
Status: Downloaded newer image for hello-world:linux
docker.io/library/hello-world:linux

启动容器

Docker运行镜像的系统需求

docker run

一条典型的启动命令:

docker run -d --name musicplayer \
  -p 8080:8080 -v <本机缓存目录>:/var/www/html/cache \
  quchaonet/musicplayer:arm64
  1. d:后台守护进程 daemon
  2. p:端口映射关系(宿主机端口:容器内的端口)
  3. v:卷映射关系(宿主机路径/卷名:容器内的路径)
  4. e:设置环境变量

其他常用参数:

  1. it:开启交互式环境
AI:
要进入正在运行的 Docker 容器的命令行界面,你可以使用 docker exec 命令。通常,我们会配合 -it 参数来启动一个交互式终端。这里的 -i 表示交互式操作,-t 表示分配一个伪终端。
以下是典型的使用方式:
docker exec -it <容器ID或容器名> /bin/bash

一个容器,已经在运行中了,还可以进入交互界面吗?当然可以。一个容器相当于一个Linux系统,这个系统当然是可以同时开启/连接多个Terminal/Shell的,并不是「只能在run的时候才能进入交互界面」

如何理解端口映射?字面意思

如何理解卷(地址)映射?字面意思

关于端口/地址映射,不用想的太复杂

docker compose

Docker compose是Docker自己的容器编排工具,经常用于启动容器,详细请参照下面的专题内容

docker-compose -f docker-compose.yaml up
  1. up表示启动
  2. 关键是这个docker-compose.yaml
  3. 在新版的Docker中,[docker-compose]应该换成[docker compose]

管理容器

# 查看正在运行中的容器
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED        STATUS        PORTS
86ea1e9d4321   dj:1.0.0    "python manage.py ru…"   12 hours ago   Up 12 hours   0.0.0.0:8001->8000/tcp
 
# 停止容器
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker stop 86ea1e9d4321
86ea1e9d4321
 
# 开启容器
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker start 86ea1e9d4321
86ea1e9d4321
 
# 删除容器(需要首先停止容器)
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker rm 86ea1e9d4321
86ea1e9d4321

构建镜像

平台相关

Linux

Mac

安装Docker Desktop,在Terminal可以使用docker命令

网络

Network

  1. Docker可以划分出多个子网络,并将容器放在子网络中运行
  2. 网络内部的容器默认可以互相联通(并且可以不用IP,使用容器名称?),和外部联通还是需要端口映射(docker run时的 -p 参数)
# 查看现有的网络列表
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
3be19772c266   api_in_docker_cb_net   bridge    local
06a59e3b7869   bridge                 bridge    local
3fc75fc1b7c2   host                   host      local
86f1845909e8   none                   null      local
 
# 创建网络
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker network create test_net 
01a4f1b4356882445a2083eb04bbbb49ea77917bc035c4ab56bba1aa7069c040
 
# 删除网络
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker network rm 01a4f1b43568
01a4f1b43568

Volume

  1. 卷(Volume)可以简单理解为宿主机上一个路径的别名,方便在路径映射的时候使用
  2. 当我们创建一个卷,Docker就会帮我们把这个卷映射到某个路径,类似/var/lib/docker/volumes/…
# 查看现有卷
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker volume ls
DRIVER    VOLUME NAME
local     api_in_docker_cb_var
local     rsshub_redis-data
 
# 创建卷
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker volume create test_data
test_data
 
# 删除卷
ar-zhonghui.ge@JP-FW7WV7P9PW ~ % docker volume rm test_data
test_data

Docker Compose

Docker Hub

官方镜像仓库

可以 pull / push

自己创建的 Image 在 push 之前,需要先打好 tag (docker tag)

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

镜像版本

<image_name>:<version / tag>

上下文

  1. Docker context:Docker 可以同时管理多个不同的运行环境(例如本地的 Docker Engine、远程的 Docker 主机、Docker Desktop、OrbStack 等)。这些环境配置被称为 context,每个 context 保存了访问对应 Docker 守护进程所需的配置(API 地址、证书、Socket 路径等)。
  2. 安装 OrbStack 后,它会自动注册一个名为 orbstack 的 Docker context(使用 docker context use orbstack 切换)。
  3. docker context ls查看可用的上下文环境

数据库

数据库需要持久化存储数据,所以容器化的时候可能有一些特殊的地方要注意

devcontainer

TODO

Misc

Docker Hub是官方的镜像库,但是(应该)也可以在第三方的地址拉取镜像

docker pull registry.hf.space/bhaskartripathi-pdfchatter:latest

指令大全

资料来源:GeekHour
docker_dockercheatsheet-bygeekhour.pdf