配合[[NAS里面关于docker的部署路径图]]食用

[!note] ## Docker重要概念

![[Docker-img-240510_212446.png]]

![[Docker-img-240510_225037.png]]

镜像 Docker images

容器 Docker containers

仓库 Docker repository

宿主机 Docker host

核心后台服务 Docker daemon

客户端 Docker client

命令行工具 Docker CLI

公共Docker镜像仓库 Docker hub

相互的关系总结

类比一览表

Docker 名词 类比
Image(镜像) 蛋糕配方
Container(容器) 烤出来的蛋糕
Repository(仓库) 存放配方的菜谱书
Docker Daemon 厨师
Docker CLI 服务员(传递指令给厨师)
Docker Hub 云端菜谱书店(配方的共享平台)

希望这个类比能让你对 Docker 的核心概念理解得更清楚!

Docker CLI + Docker Client + Docker Host 的关系

概念 定义 作用 类比
Docker CLI Docker 的命令行工具,用户输入命令与 Docker 系统交互 转化用户指令为请求,并通过 Docker Client 发送给 Docker Daemon 服务员:收集用户点菜的指令
Docker Client 负责与 Docker Daemon 通信的模块,包含 CLI 和其他客户端工具 发送指令给 Docker Daemon,通过 REST API 或套接字通信 点餐系统:将指令发给厨师
Docker Host 运行 Docker Daemon 的机器 提供运行容器、存储镜像等计算资源,是实际执行指令的环境 厨房:烹饪的实际地方,提供设备与资源
Docker Daemon Docker 的后台服务,运行在 Docker Host 上 实现实际的容器管理、镜像构建、网络配置等功能,执行 Docker Client 发送的命令 厨师:接收点餐系统的指令并做出菜品(容器)

工作流程示例

假设执行命令 docker run ubuntu:

  1. Docker CLI:
    用户在终端输入命令,Docker CLI (服务员)将该命令解析为 Docker API 请求。
  2. Docker Client:
    Docker Client(点菜系统)(通过 CLI)将请求发送给 Docker Daemon (厨师),通常通过套接字或网络连接。
  3. Docker Daemon(在 Docker Host 上):
    Docker Daemon 接收请求,拉取 Ubuntu 镜像(菜谱)并在 Docker Host 上启动一个容器(做菜)。
  4. Docker Host:
    提供运行容器的物理或虚拟资源,容器最终在 Host 上运行。

[!info] Docker基础命令

docker search mysql
or
docker search mysql:8.0
#格式为 镜像提供方/镜像名:版本
docker pull linuxserver/mysql:latest
docker images
docker rmi -f $(docker images -q)
docker ps -a
docker ps -s
docker pause <container>

#演示
docker pause mysql
docker stop $(docker ps -q)
docker unpause <container>

#演示
docker unpause mysql
docker restart <container>

#演示
docker restart mysql
docker stop <container>

#演示
docker stop mysql
docker kill <container>

#演示,将指定的容器强制关闭
docker kill mysql
docker rm $(docker ps -aq) -f
docker port <container>

#演示
docker port mysql
docker logs <container>
#演示
docker logs mysql
docker wait <container>

#演示
docker wait mysql
docker exec -it <container/id> /bin/bash

#演示
docker exec -it mysql /bin/bash
docker inspect <container>

#演示
docker inspect mysql
docker events <container>

#演示
docker events mysql
docker attach <container>

#演示
docker attach mysql
docker top <container>

#演示
docker top mysql
docker stats <container>

#演示
docker stats mysql
docker diff <container>

#演示
docker diff mysql

[!question] Docker的部署

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 
#演示 使用nginx:latest镜像创建并运行一个名为mynginx的容器 
docker run --name mynginx nginx:latest
#使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run -d --name mynginx nginx:latest
docker run -d --name mynginx nginx:latest

#说明
docker run:启动一个容器。
-d:后台模式运行容器
--name:设置容器名称为mynginx
nginx:latest:镜像来源:nginx:latest
docker run -i nginx:latest /bin/bash

#说明:
docker run:启动一个容器。
-i:以交互模式启动(进入容器中)
nginx:latest:镜像来源:nginx:latest
/bin/bash:进入容器后要执行的命令,这里是打开终端。
root@b8573233d675:/# :已经进入了容器里面的终端,用户名变化。
docker run -it nginx:latest /bin/bash

#说明:
docker run:启动一个容器。
-it:以交互模式启动(进入容器中)
nginx:latest:镜像来源:nginx:latest
/bin/bash:进入容器后要执行的命令,这里是打开终端。
root@b8573233d675:/# :已经进入了容器里面的终端,用户名变化。

docker run -p 80:80 -p 90:90 -v /data:/data -d nginx:latest

#例如此条,有两个端口需要映射就添加两条-p端口映射参数
docker run -d --name mynginx -p 8080:80 nginx:latest

#说明:
docker run:启动一个容器。
-d:以后台模式启动。
--name mynginx:将容器命名为mynginx。
-p 8080:80:将容器的 80 端口映射到主机的 8080 端口
nginx:latest:镜像来源:nginx:latest
docker run -d --name mynginx -p 8080:80 --dns 8.8.8.8 nginx:latest

#说明:
docker run:启动一个容器。
-d:以后台模式启动。
--name mynginx:将容器命名为mynginx。
-p 8080:80:将容器的 80 端口映射到主机的 8080 端口
--dns 8.8.8.8:设置容器使用指定的8.8.8.8DNS服务器IP
nginx:latest:镜像来源:nginx:latest
docker run -it --rm ubuntu:14.04 bash

#说明:
docker run:启动一个容器。
-it:以交互式模式运行容器,进入容器终端界面。
--rm:设置此容器退出时自动删除此容器
ubuntu:14.04:镜像来源:ubuntu:14.04
bash:交互式Shell页面
docker run --name mynginx -p 8080:80 -v /volume1/data:/data -d nginx:latest、

#说明:
docker run:启动一个容器。
--name mynginx:将容器命名为mynginx。
-p 8080:80:将容器的 80 端口映射到主机的 8080 端口
-v /volume1/data:/data:将主机的目录 /volume1/data 映射到容器的 /data上
-d:以后台模式启动。
nginx:latest:镜像来源:nginx:latest
docker run --name mysql \
  -p 3306:3306 \
  -v $HOME/mysql/conf.d:/etc/mysql/conf.d \
  -v $HOME/mysql/data:/var/lib/mysql \
  -v /etc/localtime:/etc/localtime:ro \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -d mysql:5.7.23

#说明
-e MYSQL_ROOT_PASSWORD=123456 \这条参数的设置就是将MySQL数据库的密码设置为123456,此密码可以自己修改。
docker run -tid --env PATH=/volume1/docker/mysql/bin:$PATH --rm mysql:8.0

#说明
映射目录/volume1/docker/mysql/bin内的.env配置文件到容器
docker run -itd --name nginx01 --link tomcat01 nginx

#说明
以nginx镜像后台运行启动并进入交互式界面,创建nginx01容器,并与tomcat01容器连接,使其互相通信。
docker run --privileged=true -it ubuntu

#说明
赋予ubuntu容器特权模式运行
docker run --device=/dev/sda:/dev/xvdc -it ubuntu

或者

docker run --cap-add=NET_ADMIN -it ubuntu
docker container update --restart=always [容器名/容器id]

#说明
将重启策略更新到指定的容器中
# containerA的cpu share 1024, 是containerB 的两倍。
# 当两个容器都需要CPU资源时,containerA可以得到的CPU是containerB 的两倍。
# 需要特别注意的是,这种按权重分配CPU只会发生在CPU资源紧张的情况下。
# 如果containerA处于空闲状态,这时,为了充分利用CPU资源,containerB 也可以分配到全部可用的CPU。
docker run --name "cont_A" -c 1024 ubuntu docker run --name "cont_B" -c 512 ubuntu

# 容器最多可以使用主机上两个CPU ,除此之外,还可以指定如 1.5 之类的小数。
docker run -it --rm --cpus=2 centos /bin/bash

# 表示容器中的进程可以在 CPU-1 和 CPU-3 上执行。
docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash

# 表示容器中的进程可以在 CPU-0、CPU-1 及 CPU-2 上执行。
docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
# 允许该容器最多使用200MB的内存和100MB 的swap。
docker run -m 200M --memory-swap=300M ubuntu


# 容器最多使用200M的内存和200M的Swap
docker run -it -m 200M ubuntu
docker run --hostname test --ip 10.1.2.3 ubuntu:14.04

#说明
创建一个 docker 容器,其基本映像为 ubuntu-14.04,主机名为 test,容器 ip 地址为 10.1.2.3
sudo docker run -d --name=Jellyfin -p 8096:8096 \  # --name=Jellyfin 将容器名定义为 Jellyfin 
	-p 8920:8920 -p 7359:7359/udp -p 1900:1900/udp #这三个端口为可选项 \
	-v /srv/jellyfin/config:/config -v /srv/jellyfin/cache:/cache -v /media:/media \
	-e TZ=Asia/Shanghai -e PUID=0 -e PGID=0 \	#将容器的时区设为上海,使用窗口在运行时使用root权限
	--device=/dev/dri:/dev/dri \	#直通显卡给 Docker 容器,用于硬解
	--add-host=api.themoviedb.org:13.224.161.90 \	#为容器增加 host 指向,加速海报与影视元数据的搜刮
	--add-host=api.themoviedb.org:13.35.8.65 \
	--restart unless-stopped \
	jellyfin/jellyfin:latest
docker run -d \    #前台运行容器不输入-d,后台运行输入-d,前台交互运行-i或-it,交互后台运行-itd。
    -p 9096:8096 \    #将容器的8096端口映射到主机的9096端口上
    -p 8888:88 \    #将容器的88端口映射到主机的8888端口上
    --name=S20306 \    #自定义容器名
    -v /volume1/docker/test:/mnt/test \    #将宿主机的/volume1/docker/test目录映射到容器/mnt/test目录
    -v /volume1/docker/config:/mnt/config \    #将宿主机的/volume1/docker/config目录映射到容器/mnt/config目录
    -v /var/run/docker.sock:/var/run/docker.sock \    #允许Docker CLI与Docker Daemon进行通信,从而实现对Docker容器的管理和控制。
    -e TZ=Asia/Shanghai \    #将容器的时区设为上海
    -e PUID=0 \    #约等于指定用户权限去运行容器,root用户是0,查看当前登录用户的数值SSH内输入id即可查看。
    -e PGID=0 \    #约等于指定用户权限去运行容器,root用户是0,查看当前登录用户的数值SSH内输入id即可查看。
    --add-host=api.themoviedb.org:13.224.161.90 \    #为容器增加 host 指向,加速海报与影视元数据的搜刮。
    --add-host=api.themoviedb.org:13.35.8.65 \    #为容器增加 host 指向,加速海报与影视元数据的搜刮。
    --device=/dev/dri:/dev/dri \    #直通核显给Docker容器,用于硬件解码。
    --privileged=true \    #设置容器使用特权模式,如果选择了--device参数就不用设置此行。
    --cpus=2 \    #设置此容器最多可以使用2个CPU核心运行
    -m=2G \    #设置此容器最多可以使用2GB内存运行
    --restart unless-stopped \    #设置容器自动重启
    --network=testnetwork \    #设置容器网络为host,如果选择了上面的-p端口映射,就不需要此行。如果是指定网络就需要提前创建好网络,格式为:--network=XXX
    --link nastool \    #通过容器名之间互相通信,容器间共享环境变量。
    jellyfin/jellyfin:latest    #选择镜像来源和版本
#只是演示,根据自己的需要添加参数即可。
docker run --name reference -itd -p 9667:3000 wcjiang/reference:latest
docker exec -it jellyfin /bin/bash

#演示,进入之后就可以执行你的后续操作
root@NAS:~# docker exec -it jellyfin /bin/bash
root@2be7994cb319:/#
#格式:docker cp 容器名或容器id:/容器内的目录或文件 宿主机存放拷贝出来的文件的目录

docker cp jellyfin:/jellyfin/wwwroot /volume1/docker
#格式为:docker cp 宿主机需要拷贝的文件或文件夹路径 容器名或容器id:存放所拷贝文件的路径

docker cp /volume1/docker/wwwroot jellyfin:/jellyfin/