Docker 入门
Docker 10分钟快速入门,10分钟快速学会docker,Docker Online,Docker—从入门到实践
Docker 添加执行权限
Docker 修改更新配置
Windows下 Docker Desktop
右上角 设置
- Docker Engine
,Linux下 /etc/docker/daemon.json
增加
1
2
3
{
"registry-mirrors": ["https://a4wybeie.mirror.aliyuncs.com"]
}
Windows下 Apply&Restart
,Linux下 sudo systemctl restart docker && sudo systemctl status docker
重启Docker服务并检查服务状态
Docker Build Cache 清理
查看 Docker 磁盘使用情况:docker system df
,一键清理 Docker 构建缓存 docker builder prune
拉取镜像生成容器
0.docker search nginx
:只能搜索镜像的标签,而不能直接搜索历史版本。可以在 Docker Hub 上手动搜索特定软件(例如 nginx),然后在该软件页面中选择合适的 “Tags” 标签(版本)运行容器
1.docker pull <IMAGE NAME>:<TAG>
: 拉取镜像
docker images
/ docker image ls
: 查看本地镜像
docker rmi <IMAGE NAME/IMAGE ID>
:删除镜像,需先删除该镜像的容器。docker rmi -f <IMAGE NAME/IMAGE ID>
:强行删除镜像
2.docker run -it -d -p 88:80 --name <CONTAINER NAME> -v `pwd`:/usr/share/nginx/html <IMAGE NAME>:<TAG>
:-it
用于在容器中运行交互式shell命令,-d
(detached mode) 用于在后台(守护deamon进程)模式下运行容器,将容器作为后台任务在后台运行,不附加到当前终端会话,-p
映射内外端口,将容器80端口映射到本机/宿主机88端口,--name
自定义容器名,-v
文件目录映射。(即使没有 docker pull
,docker run
会自动拉取镜像)run完镜像才会生成容器
(内外部端口相对于容器而言。外部端口指远程服务器或本地主机IP地址下的端口,内部端口指内部容器开放的网络端口。指定端口映射,通过外部端口访问内部容器开放的网络端口。静态文件放容器外,修改外部文件,映射使得内部文件会跟着改变)
3.docker ps
查看当前正在运行的容器,docker ps -a
查看所有容器(包含停止运行的)的状态
docker start <CONTAINER ID>
:启动已终止容器,docker inspect <CONTAINER ID>/<IMAGE ID>
:查看容器/镜像的元数据,docker inspect -f '{ {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' <CONTAINER ID>
:查看容器的IP地址(命令中删除前大括号间的空格)
docker stop <CONTAINER NAME>
+ docker rm <CONTAINER NAME>
/ docker rm -f <CONTAINER NAME>
将 <CONTAINER NAME>
换成 <CONTAINER ID>
也行:停止或删除容器
4.docker exec -it <CONTAINER NAME/CONTAINER ID> bash
:-i
交互式操作,让 Docker 运行的容器保持 STDIN 打开,即使没有附加一个终端(TTY)-t
为容器分配一个伪终端(pseudo-TTY)。这个参数让 Docker 分配一个伪终端(pseudo-TTY),从而使你能够与容器中运行的命令进行交互 -it
用于在容器中运行交互式shell命令。bash
可用其他 <COMMAND>
如 lscpu&&echo 1&&touch 1&&pwd
代替,相当于在容器内运行<COMMAND>
5.docker run -it
vs docker exec -it
,docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
vs docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker run -it
在新容器中启动一个交互式shell,先创建新的容器再启动交互式shell进程作为主进程,如果容器在运行shell期间终止(如退出shell),整个容器会停止并被删除
docker exec -it
在已运行的容器中启动一个交互式shell,其不作为主进程,因此退出shell不会使容器停止
6.对于没有持续运行的前台进程的容器,运行 tail -f /dev/null
让容器一直运行而不需要实际执行任何任务
docker run -it ubuntu
/ docker run -it centos bash
:-it
选项用于在交互式终端会话中运行容器,并将标准输入(STDIN)连接到容器的终端设备。这允许用户与容器进行交互并在终端中输入命令
这样当 exit
退出容器后会自动删除容器(类似 -rm
),可通过 docker run -d ubuntu tail -f /dev/null
保持容器持续运行,通过 docker exec -it <CONTAINER NAME/CONTAINER ID> bash
随时附加到运行的容器中,确保容器在没有其他任务执行时依然保持运行,方便进行容器内的维护和调试
7.构建镜像(非容器)后通过 docker ps
查看
法一:docker commit <CONTAINER ID> <IMAGE NAME>
,无需 Dockfile,提交运行中的容器为镜像
法二:添加 Dockerfile 后,docker build -t <IMAGE NAME> .
及(可选)docker push <IMAGE NAME>
8.docker save -o <OUTPUT FILE NAME>.tar <IMAGE NAME>:<TAG>
:将构建好的images打包成 <OUTPUT FILE NAME>.tar
包
docker load < <OUTPUT FILE NAME>.tar
:载入<OUTPUT FILE NAME>.tar
包来释放镜像用于跨平台部署 no space left on device
9.命名并上传镜像:
docker login
:输入docker hub 的用户名和PAT(Personal Access Token)
docker tag local-image:tagname new-repo:tagname
:按照格式 <Docker ID>/<IMAGE NAME>
作为 new-repo
重命名镜像。根据 local-image
复制一份新镜像 new-repo
,共用同一个 IMAGE ID
docker inspect new-repo:tagname
:查看获取容器/镜像的元数据
docker push new-repo:tagname
10.docker system prune --all --force --volumes
:清理未被使用的资源,包括镜像、容器、网络和数据卷
Docker Volume
Volume数据卷是宿主机和不同容器共享的文件夹(容器A对数据卷1的改动会反应在容器B中)
1
2
3
4
docker volume ls #列出所有卷
docker volume inspect <VOLUME NAME> #看特定卷
docker volume create <VOLUME NAME>
docker volume rm <VOLUME NAME>
docker run -dp 88:80 --name <CONTAINER NAME> -v <VOLUME NAME>:/usr/share/nginx/html nginx:1.26
:将 <VOLUME NAME>
挂载到容器路径 /usr/share/nginx/html
下
Docker Compose
Docker Compose Standalone 版本是一个独立的二进制文件,不需要与 Docker CLI 集成,可以独立下载和运行
Docker Compose v2 可以作为 Docker CLI 插件运行,也可以作为独立的 Standalone 版本运行
Docker Compose v1:传统上是一个独立的二进制文件,通常称为 docker-compose,需要单独下载和安装
Docker Compose v2:可以作为 Docker CLI 的插件使用,也可以作为独立的二进制文件运行。Standalone 版本的 Docker Compose v2 可以通过下载独立的二进制文件来实现
Docker Compose 用于多个容器共同协作。创建 docker-compose.yml
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3"
services:
web:
build: .
ports:
- "88:80"
db:
image: "mysql"
environment:
MYSQL_DATABASE: my-db
MYSQL_ROOT_PASSWORD: secret
volumes:
- my-data:var/lib/mysql
volumes:
my-data
docker compose up -d
:在后台运行所有容器
docker compose down
:停止并删除所有容器。docker compose down --volumes
:连带数据卷一起删除
Docker 对比 Kubernetes
Kubernetes是一个大规模部署分布式应用的平台,将容器分发到包含很多 Nodes节点的Cluster集群上运行,并进行全自动化的管理。每个集群由很多节点组成,每个节点运行了很多相互独立的Pod(Pod是k8s中可部署的最小执行单元),每个Pod由一个或多个容器的集合。Control Plane控制平面集中管理所有Pod的负载均衡和故障转移,所有Nodes和Control Plane称为一个Cluster
1
2
3
4
5
6
7
8
9
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
minikube start #启用本地模拟集群
# 创建 deployment.yaml
kubectl apply -f deployment.yaml #部署应用,修改deployment.yaml后再次apply可无缝衔接
kubectl get pods #查看所有 Pods 运行状态
kubectl get services #查看所有创建的服务
minikube service <SERVICE NAME> #访问开启服务
kubectl delete -f deployment.yaml #集群中完全移除应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# deployment.yaml 事例
apiVersion: apps/v1
kind: Deployment
metadata:
name: finance
spec:
replicas: 3
selector:
matchLabels:
app: finance
spec:
containers:
- name: finance
image: rossning92/finance
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 5000
name: finance
---
apiVersion: v1
kind: Service
metadata:
name: finance-np-service
spec:
selectior:
app: finance
type: NodePort
ports:
- port: 5000
targetPort: 5000
# nodePort: 30080
Comments powered by Disqus.