基础
Doker是一个开源的应用容器引擎,可以让开发者们打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。容器是完全使用沙箱机制,相互隔离。容器的性能开销极低。
技术原理
Docker利用了Linux的两大原生功能实现容器化:
-
Cgroups:用来限制和隔离进程的资源的使用,可以为每个容器设定CPU、内存、网络贷款等资源的使用上限,确保了一个容器的资源消耗不会影响到宿主机或者其他正在运行的容器。
-
Namespaces:用来隔离进程的资源视图,使得容器只能看到自己内部的进程ID、网络资源和文件目录,而看不到宿主机的
所以容器本质上还是一个特殊的进程,但容器内部看起来却像一个独立运行的操作系统。每个Docker容器都是一个独立的运行环境,每个容器内部都表现得像一个独立的Linux系统。
Docker网络
默认使用Bridge桥接,所有的容器默认连接到一个网络,每个容器都分配了一个内部的IP地址(通常172.17.*),在这个内部子网中,容器可以通过IP地址互相访问,但容器网络和宿主机网络是互相隔离的。
子网模式:也可以创建子网,让指定容器加入不同的子网,同一个子网的容器可以相互通信,但是不同子网的容器不能相互通信。除此之外,同一个子网的容器可以使用名字(DNS机制)来直接通信,而不必使用内部IP地址。
host模式:docker容器直接共享宿主机的网络,容器直接使用宿主机的IP地址,而且无需-p参数进行端口映射,容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口就能访问到容器。host模式用于解决棘手的网络问题。

命令
镜像
1- 下载:
docker pull --platform=xxx docker.io/library/nginx:latest => 简化后:docker pull nginx(默认官方下载)
--使用什么cpu架构 registry/namespace/ :tag
amd/arm架构 仓库地址/命名空间/ :版本号
默认适配版本 官方仓库/官方命名空间/ :最新版本
完整意思为:在docker官方仓库的官方命名空间内下载nginx的最新版本
2- 配置下载镜像:
复制:
,
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
完整内容到docker:desktop里面的Docker Engine的配置代码中并restart保存配置
3- 展示所有下载的镜像:
docker images
展示内容:
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
nginx:latest 0236ee02dcbc 240MB 65.8MB
4- 删除镜像:
docker rmi 镜像ID或名称
效果:
Untagged: nginx:latest
Deleted: sha256:0236ee02dcbce00b9bd83e0f5fbc51069e7e1161bd59d99885b3ae1734f3392e
容器
5- 运行镜像(如果镜像不存在就先拉取),也就是通过镜像创建一个容器(相当于创建一个类的实例对象)
docker run [-d] [-p 80:88] [-v D:/doc或命名卷名称:/usr/share/nginx/doc] [-e MONGO_INITDB_ROOT_PASSWORD=Secret \] [--name my_nginx] [-it] [--rm] [--restart always] 镜像名称/镜像ID
-
-d是采用分离模式,写上去的话容器会自动在后台运行,而不用占用当前窗口持续刷新日志了
-
-p是指定宿主机端口号80与容器内端口号88进行对应,这样在宿主机也可以访问容器内部了
-
-v是指定宿主机目录(D:/html)和容器内的目录(/usr/share/nginx/html)进行绑定,进行容器内数据的持久化存储,同时也可以通过这个绑定向容器内的目录放东西。根据宿主机目录的展示方式不同,分为绑定挂载(直接写宿主机目录路径)和命名卷挂载(创建一个存储空间命名卷,写的是卷的名字)。
-
绑定挂载:创建镜像的时候会用宿主机的目录对容器的目录进行覆盖,于是如果这时宿主机的目录里面没有东西,那就访问不到东西。
-
命名卷挂载:创建镜像的时候,会在宿主机创建一个新的存储空间,然后将容器对应目录的内容放进去。
-
-
–name:自定义容器的名称’
-
-it是可以让宿主机的控制台进入容器内部进行交互
-
–rm是当容器停止的时候就把容器删除掉
-
–restart是用来配置在容器停止时的重启策略,包含选项:
-
always:只要容器停止了就立即重启,包含容器因为内部错误崩溃、或宿主机断电等场景
-
unless-stopped:同样会自动重启,但只要手动停止就不自动重启
6- 查看正在运行的容器
docker ps [-a]
-a是要获取全部容器,包括正在运行的和已经停止的
展示内容:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bc2f1b1124e nginx "/docker-entrypoint.…" 19 seconds ago Up 18 seconds 80/tcp eloquent_khorana
CONTAINER ID:容器ID(自动分配且唯一)
IMAGE:镜像名称
NAMES:不指定就随即创建的容器名称
7- 删除容器
docker rm [-f] 容器ID
-f:强制删除正在运行的容器
8- 对原有容器启用/查看详细信息/停止
docker start 容器ID/名称
docker inspect 容器ID
docker stop 容器ID/名称
9- 创建容器
docker create 镜像名称
使用方法和docker run命令一样,唯一区别就是不会立即运行容器,而需要用start命令运行
11- 查看容器的日志
docker logs 容器ID/名字 [-f]
-f是滚动实时输出容器的日志
12-在容器内部执行Linux命令
docker exec 容器ID Linux命令
查看容器内部进程:docker exec 容器ID ps -ef
进入一个正在运行的容器内部获得一个交互式的命令行环境:docker exec -it 容器ID /bin/sh
进入到容器内,修改某文件:
cd /usr/share/nginx/html
ls 列出目录中的所有文件
vi index.html 修改文件
发现vi工具缺失,然后安装一个vi工具
cat /etc/os-release 查看Linux的版本
发现版本是debian,此容器内安装软件需要使用apt命令
apt update
apt install vim
vi index.html
修改文件
i
esc :wq enter
退出方法:
-
退出并让容器继续运行:ctrl + P 、crtl + Q
-
退出并停止容器:exit enter
-
强制停止容器:ctrl + C
volume挂载卷
13- 挂载卷相关
-
创建挂载卷:
docker volume create 挂载卷名称 -
查看挂载卷存储位置:
docker volume inspect 挂载卷名称 -
挂载卷可以直接通过docker-desktop查看
-
查看所有的挂载卷:
docker volume list -
删除某挂载卷:
docker volume rm 挂载卷名称
lume rm 挂载卷名称` -
删除所有没有在使用的挂载卷:
docker volume prune -a,然后在输入y回车
DockerFile
dockerfile记录了镜像的资料。
Dockerfile文件内容
FROM python:3.13-slim
# 必不可少!使用[官方的 Python 3.13 镜像作为]基础镜像
WORKDIR /app
# 切换到镜像内的一个目录作为工作目录
COPY . .
# 将当前目录下的所有文件复制到镜像内的工作目录
RUN pip install --no-cache-dir -r requirements.txt
# 安装项目依赖,使用 --no-cache-dir 选项来减少镜像大小
EXPOSE 8000
# 声明容器在运行时会监听的端口,这里是 8000
# 这个指令只是声明端口,并不会实际打开端口,只有在运行容器时使用 -p 参数映射端口才会生效
CMD ["python3", "main.py"]
# 设置容器启动时执行的命令,这里是运行 main.py 文件
# 一个docker文件里面只能有一个CMD指令,如果有多个CMD指令,只有最后一个会被执行
ENTRYPOINT ["python3", "main.py"]
# 设置容器的入口点,这里也是运行 main.py 文件
# ENTRYPOINT 指令会覆盖 CMD 指令,所以如果同时使用了 CMD 和 ENTRYPOINT,只有 ENTRYPOINT 会被执行,CMD 的参数会被传递给 ENTRYPOINT
使用命令
docker build -t 镜像名称[:版本号] .
.表示在当前目录创建镜像
docker login
docker push 作者名/镜像名称[:版本号]
Docker网络
子网模式

创建容器1:
docker run -d --name my_mongodb -e MONGO_INITDB_ROOT_USERNAME=tech -e MONGO_INITDB_ROOT_PASSWORD=123456(例如) --network network1 mongo
创建容器2:
docker run -d --name my_mongodb_express -p 8081:8081 -e ME_CONFIG_MONGODB_SERVER=my_mongodb -e ME_CONFIG_MONGODB_ADMINUSERNAME=tech -e ME_CONFIG_MONGODB_ADMINPASSWORD=wensiy --network network1 mongo-express
进入容器2控制台:
docker exec -it my_mongodb_express /bin/sh
访问容器1:
/app # ping my_mongodb
效果:
PING my_mongodb (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.140 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.102 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.075 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.074 ms
64 bytes from 172.18.0.2: seq=4 ttl=64 time=0.104 ms
64 bytes from 172.18.0.2: seq=5 ttl=64 time=0.102 ms
64 bytes from 172.18.0.2: seq=6 ttl=64 time=0.069 ms
64 bytes from 172.18.0.2: seq=7 ttl=64 time=0.105 ms
64 bytes from 172.18.0.2: seq=8 ttl=64 time=0.078 ms
64 bytes from 172.18.0.2: seq=9 ttl=64 time=0.109 ms
^C
--- my_mongodb ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.095/0.140 ms
host模式

docker run -d --network host nginx
然后访问本地网址端口80,发现可以访问到(前提是Linux系统,因为Windows 与 Linux 的 host 网络实现不同,Docker 的 host 网络模式在 Windows 上没有得到完全的支持)
进入容器内部:
docker exec -it 741e8b5c09226430690c008d9ade29de39bf1ac43e2a624f9ef6234016c0531d /bin/sh
更新apt:
apt update
安装:
apt install iproute2
查看容器的IP:
ip addr show
效果(关键部分是显示IP地址为宿主机的IP):
2: services1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 62:92:8e:4e:49:1c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.65.6/32 scope global services1
valid_lft forever preferred_lft forever
inet6 fdc4:f303:9324::6/128 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::6092:8eff:fe4e:491c/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
none模式(不联网)

查看当前所有网络模式
docker network list
效果展示(其中默认包含的bridge模式、host模式、none模式,不可删除):
NETWORK ID NAME DRIVER SCOPE
61a9b11e07eb bridge bridge local
67b0cb45704f host host local
33bae1b6739d network1 bridge local
d6b35f2216d4 none null local
删除自定义的子网:
docker network rm 33bae1b6739d
再次查看所有网络模式:
network list
效果展示(没有自定义的子网了):
NETWORK ID NAME DRIVER SCOPE
61a9b11e07eb bridge bridge local
67b0cb45704f host host local
d6b35f2216d4 none null local
Docker compose
Docker compose使用yaml文件管理多个容器,里面列出了容器是如何创建以及如何协同工作,可以将Docker compose文件理解成一个或多个Docker run命令,将他们按照特定格式列到了一个文件里面。同一个compose文件中定义的容器,都会自动加入同一个子网,除此之外,还可以自定义容器的启动顺序(用depends_on即可)。
run命令和compose文件对比:


docker compose 命令的执行强烈依赖于“当前工作目录”,它默认会在当前工作目录中寻找 docker-compose.yml 文件。
如果容器已经运行了,再次执行 docker compose up 不会有任何效果,不会创建新的容器
docker compose [-f 你的文件名.yml] up [-d]
-f:如果yaml文件名并不是标准的docker-compose.yml ,就需要特别标注,否则会找不到yaml文件
效果展示:
✔ Network network1 Created 0.1s
✔ Container my_mongodb Created 0.2s
✔ Container my_mongodb_express Created 0.1s
停止并删除容器:
docker compose down
停止容器:
docker compose stop
启动容器:
docker compose start
Linux安装docker省略版
sudo apt update
sudo apt install 名称
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
sudo add-apt-repository "..."
[ENTER]
sudo apt update
sudo apt install 其他工具
docker --version
安装docker-compose 环境池(一个项目要启动很多服务的情况下)
curl -L "..." -o /usr/local/bin/docker-compose
sudo chmod +x /
docker-compose --version
Linux使用
git clone https://github.com/dataelement/bisheng.git
ls
cd 文件夹 进入项目
ls 一般用docker启动的项目都包含docker文件夹
cd docker
ls 发现包含docker-compose.yml
docker-compose up -d
cat /etc/os-release 检查容器内Linux的发行版本
docker ps 列出正在被使用的服务,检验哪些服务没有被正确启动
docker images 把所有的服务列出来
docker-compose up -d 启动所有服务,只能在包含docker-compose.yml的目录执行
docker-compose down 停止所有服务,只能在包含docker-compose.yml的目录执行
docker-compose restart 服务名称(例如mysql)
docker restart 容器名称(例如docker-mysql-1),可以在任意目录下使用
docker run 指令 创建运行一个新的容器(alpine echo "hello world")
docker start 容器名称(需要先用docker ps -a来查看容器的名称)
docker stop 容器名称
docker --version docker-compose --version
docker rm 容器名称 删除容器
docker restart $(docker ps -q) 重启所有docker服务
端口号需要替换为远程机子启动后local URL后面跟着的端口号。中括号内容需要替换SSH远程登录指令中的对应内容,然后粘贴到powershell或cmd,然后yes并输入SSH远程登录密码

5184

被折叠的 条评论
为什么被折叠?



