1.docker理解
- 一个容器相当于简化版的轻量级的VM
- 容器共享操作系统内核
- 容器都拥有自己的文件系统、CPU、内存、进程空间等
- 容器之间相互隔离
2.docker的基本操作
1.镜像imags
2.容器
使用docker run
docker run nginx 启动容器
docker run -d(后台运行) --name(重命名) mynginx nginx
docker run -d --name mynginx nginx
端口映射
端口映射 80->80
docker run -d --name mynginx -p 80:80 nginx
在本地浏览器可以成功访问到
3.修改页面
进入容器:docker exec
docker exec -it mynginx /bin/bash
#默认静态页面 index.html
cd usr/share/nginx/html/
#每次修改文件都要进入容器的这个目录修改比较麻烦,后面会讲使用Docker的存储,
#将容器内部文件夹映射到外部主机的位置,在外部主机位置修改文件即可!
4.保存镜像
提交:docker commit
docker commit -m "xxx" mynginx mynginx:v1.0
保存:docker save
docker save -o mynginx.tar mynginx:v1.0
保存成mynginx.tar压缩包
加载:Ldocker load
保证环境洁净删除镜像和容器
docker load -i mynginx.tar
#-i指定压缩包的位置
5.分享
登录:docker login
命名 docker tag
docker tag 原来的镜像名 用户名/镜像名
推送 docker pull
制作最新版本
总结
2.docker存储
tip:批量删除使用$
docker rm -f $(docker ps -aq)
目录挂载
每次修改文件都要进入容器的这个目录修改比较麻烦,后面会讲使用Docker的存储,将容器内部文件夹映射到外部主机的位置,在外部主机位置修改文件即可!
docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
tip:外部文件修改内部文件跟着改变,修改内部文件外部文件一样改变
卷映射
#将配置文件目录也映射出来
docker run -d -p 88:80 -v /app/nghtml:/usr/share/nginx/html -v /app/ngconf:/etc/nginx --name app02 nginx
直接将/etc/nginx配置文件的目录整个映射出来,失败!因为我们程序的运行要依靠nignx.conf,直接挂载在外部,该目录是空的,没有配置文件,所以无法运行,不能使用这种方式。
挂载是 外 -> 里 卷映射 是 里 -> 外
#卷映射
docker run -d -p 99:80 -v /app/nghtml:/usr/share/nginx/html -v ngconf:/etc/nginx --name app03 nginx
卷默认在外部目录 /var/lib/docker/volumes/(卷名)
在外部修改配置文件,内部的文件也跟着改变
docker volume ls // 查看所有卷
docker volume (卷名)// 创建卷
docker volume inspect (卷名) // 查看卷详情
tip: 当删除容器时,卷映射的文件和目录挂载的文件都不会被删除
4.网络
清除所有容器
创建两个容器 app1 和 app2
创建docker就有这个docker0的网络
docker为每个容器分配唯一的ip,使用容器ip + 容器端口 可以互相访问
使用 docker inspect app1 查看详情可知道
app1: "IPAddress": "172.17.0.2",
app2: "IPAddress": "172.17.0.3",
在app1容器中 可以访问到app2的ip地址
但是ip由于各种原因可能会变化
docker0默认是不支持主机域名的
所以需要我们创建一个自定义网络,容器名就是稳定域名
清空所有容器重新创建app1和app2,创建之前先创建一个自定义网络
docker network ls
docker network create
docker run -d -p 88:80 --name app1 --network mynet nginx
app1:"IPAddress": "172.18.0.2",
app2:"IPAddress": "172.18.0.3",
进入容器app1 访问 app2
3.遇到问题
镜像源超时:已解决
#修改镜像源
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker-0.unsee.tech",
"https://docker-cf.registry.cyou",
"https://docker.1panel.live"
]
}
EOF
#重启docker
systemctl daemon-reload && systemctl restart docker
本地win11 docker启动报错:未解决
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit aka.ms/enablevirtu…
Press any key to continue...
尝试过以下解决方法(无数次重启电脑还没解决...):
勾选Hyper-V
启动window功能
在管理员模式下 PowerShell 中执行以下命令:
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
确保 WSL 使用版本 2:
wsl --set-default-version 2
尝试重新安装 WSL
wsl --install