docker使用教程
docker就是用来把某人的程序完好运行在另一个人电脑上的小虚拟机
YSir
2025.10.28
以下内容只涉及Windows+WSL
参考:https://github.com/tech-shrimp/docker_installer.git
环境
- 打开
virtual machine platform和适用于Linux的Windows子系统两个功能 - 运行俩命令
1
2wsl --set-default-version 2 //要求默认版本为wsl2
wsl --update --web-download //安装wsl - 下docker desktop https://www.docker.com/products/docker-desktop/
命令
docker pull [<仓库地址>docker.io]/[<命名空间(作者名)>library]/niginx:[<版本号>latest],如果全部简化则为官方镜像docker pull niginx,一个镜像库由仓库地址+命名空间+镜像名组成1
2
3
4
5
6
7
8
9
10
11
12
13C:\Users\YSir>docker pull nginx //linux系统需要加sudo
Using default tag: latest
latest: Pulling from library/nginx
38513bd72563: Pull complete
a0a6ab141558: Pull complete
0e86847a3920: Pull complete
1bace2083289: Pull complete
89df300a082a: Pull complete
35fb9ffa6621: Pull complete
5545b08f9d26: Pull complete
Digest: sha256:f547e3d0d5d02f7009737b284abc87d808e4252b42dceea361811e9fc606287f
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest配置镜像站(下载有问题),复制:
1
2
3
4
5
6"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]粘贴到此处:
点击apply&restartdocker images查看已下载的镜像docker rmi <镜像名或ID>删除已下载的镜像(i代表images),docker rm即删除正在运行的容器,加-f可强制删除docker run <镜像名> [-d] [-p <本机端口>:<容器端口>] [-v <本机目录:容器目录>]运行容器,-d可以防止刷屏,容器放后台(实际上如果不pull直接run也可以,docker将自动pull)-p端口映射,将容器与本机互通
例如此时我访问1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19C:\Users\YSir>docker run -p 80:80 nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025/10/31 13:45:04 [notice] 1#1: using the "epoll" event method
2025/10/31 13:45:04 [notice] 1#1: nginx/1.29.3
2025/10/31 13:45:04 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2025/10/31 13:45:04 [notice] 1#1: OS: Linux 5.15.167.4-microsoft-standard-WSL2
2025/10/31 13:45:04 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2025/10/31 13:45:04 [notice] 1#1: start worker processes
2025/10/31 13:45:04 [notice] 1#1: start worker process 29
2025/10/31 13:45:04 [notice] 1#1: start worker process 30
...localhost:80就会出现nginx的欢迎界面,ctrl+c以结束-v设置挂载卷,设置后使得容器文件夹使用本机文件夹,但只能访问本机文件夹(注:有一个历史遗留问题,Linux目录路径为/而Windows为\)
例子还可以使用命名卷挂载1
2C:\Users\YSir>docker run -p 80:80 -v C:\website\html:/usr/share/nginx/html nginx
//一定要在C:\website\html中也创建一个index.html,否则403- 创建挂载卷
docker volume create <挂载卷名> - 查看挂载卷位置
docker volume inspect <挂载卷名> - 命名卷会自动复制第一次使用时会自动拷贝容器内对应文件
docker volume list可例出所有使用中的命名卷docker volume rm <命名卷名>删除命名卷docekr volume prune -a删除所有未在使用的命名卷- 这玩意在Windows里有小bug,先不管
- 创建挂载卷
-e设置环境变量
如这样数据库的账号密码就会作为环境变量传递进去,使mongo数据库预设好账号密码。1
2
3
4
5docker run -d \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME = tech \
-e MONGO_INITDB_ROOT_PASSWORD = shrimp \
mongo
使用mongosh "mongodb://tech:shrimp@111.231.100.92:27017"即可连入数据库(111.231.100.92是别人的服务器),不清楚环境变量可以在镜像文档里找--name <容器名>为容器自定义名称以取代容器ID,这样就可以直接用docker rm <容器名>来删除容器-t可进入容器,常搭配--rm使用--rm当容器停止运行时删除容器
例docker run -t --rm alpine(alpine是一个轻型linux),这样可以直接进入容器内部,并在退出容器的同时删除容器,用于临时调试容器与之相同的还有--restart
例docker run --restart always nginx如果容器被关闭就会立即重启
例docker run --restart unless-stopped如果是非手动停止容器就立即重启start启动容器stop停止容器,使用start和stop可以让docker将容器数据保留下来,避免被删除
docker ps查看正在运行的容器(镜像可比作类,而容器就是对象)-a可查看所有容器docker stop <容器ID>停止某运行中的容器,以方便删除容器docker container prune可以直接删掉停止使用的容器docker inspect <容器ID>查看容器详细信息,可查看启动参数,内容可能看不懂,丢给ai就好docker create <镜像名>与run差不多,唯一区别就是需要手动startdocker log <容器ID>查看容器日志-f可实时刷新
调试
docker用linux的cgroups和namespaces实现容器化,cgroups用来限制容器资源调度上限,namespaces用来隔离容器使容器看不见外部情况
docker exec <容器ID> <linux命令>在容器内部执行Linux命令,如docker exec d123d123 ps -ef查看容器d123d123的进程,还有常用命令docker exec -it <容器ID> /bin/sh进入一个容器内部获得其shell,当然容器简单到连文本编辑工具vi都没有,要自己安装- 进入容器内部后使用
cat /etc/os-release可查看容器所使用的linux系统,依照系统下载文本编辑器等工具,以nginx举例1
2
3
4
5
6
7
8
9docker exec -it <容器ID> /bin/sh //进入容器
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)" //这里可发现使用的是Debian
...
# apt update //debain使用apt命令安装软件,更新apt索引
# apt install vim //安装文本编辑器vim
# cd /usr/share/nginx/html //进入网页默认文件夹
# cat index.html //编辑默认网页
制作镜像并推送到dockerhub
感觉对我没啥用,下次再说 :)
Docker网络设置
bridge桥接模式
默认birdge桥接模式,所有容器默认连接到容器内网,所有容器分配一个IP地址(大多172.17.x.x),并且容器内网与本机网络隔离,docker network create network1可创建子网,仍属于桥接模式,可指定容器加入子网,不同子网的容器不可相互通信,同一子网的好处是可以直接使用容器名访问而非IP
例子
1 | //该容器没进行端口映射,目的是不能让客户机直接访问数据库 |
这样一来就可以在浏览器里访问该数据库了
默认用户名为admin,密码为pass
接下来进入mongodb-express里看看是怎么个事
1 | root@LAPTOP-L57F2HR5:/# docker exec -it my_mongodb_express /bin/sh |
子网逻辑图
Host模式
该模式容器直接共享本机网络,使用本机IP,无需-p进行端口映射docker run --network host <容器名>以设置Host模式
例
1 | root@LAPTOP-L57F2HR5:/# docker run -d --network host nginx //此时直接访问localhost:80可访问 |
网络命令
docker network list列出已有网络(包括已创建子网)
1 | NETWORK ID NAME DRIVER SCOPE |
docker network rm <网络名>删除已有网络(系统自带无法删除)