Post

Docker 入门

Docker 10分钟快速入门10分钟快速学会dockerDocker OnlineDocker—从入门到实践

struct

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 pulldocker 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>

cmd

5.docker run -it vs docker exec -itdocker 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

k8s

kubernetesminikube

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 
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.