• Docker常用命令


    Docker概述

    Docker的基本组成

    在这里插入图片描述

    Docker的安装

     apt install docker-compose
    
    • 1

    启动Docker

    docker version
    docker run hello-world
    systemctl enable docker
    systemctl start docker
    systemctl stop docker
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Docker镜像加速

    # vim /etc/docker/daemon.json
    
    tee /etc/docker/daemon.json <<-'EOF'
    { 
    "registry-mirrors": ["https://6c3kptqz.mirror.aliyuncs.com"]
    }
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Docker 常用命令

    images

    search

    docker search mysql
     
    #搜索收藏数大于3000的镜像
    docker search mysql --filter=STARS=3000
     
    
    • 1
    • 2
    • 3
    • 4
    • 5

    pull

    docker pull mysql
    docker pull mysql:5.7
    
    • 1
    • 2

    rmi

    docker rmi -f  镜像id
    docker rmi -f  镜像id 镜像id 镜像id
    
    删除全部的镜像
    docker rmi -f  $(docker images -aq)
    
    docker rmi $(docker images | grep "linglong" | awk '{print $3}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    commit

    # 自制镜像案例
    docker run -d  -it debian /bin/bash     # 后台运行
    docker  ps    # 查看id  baf95021d6f4
     
    docker exec -it baf95021d6f4  /bin/bash   # 进入
     
    # 改源
    echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" > /etc/apt/sources.list
    apt-get update
    apt-get install vim   # 安装vim
    exit
    
    # docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 
    docker commit -m="debian装好vim"  -a="xiaoxiaoran" baf95021d6f4 mydebian:1.0
    
    docker images
    docker run -it mydebian:1.0 /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    container

    运行容器 : run

    docker run [可选参数] image
    
    --name="名字"           指定容器名字
    -d                     后台方式运行
    -it                    使用交互方式运行,进入容器查看内容
    -p                     指定容器的端口
    (-p ip:主机端口:容器端口  配置主机端口映射到容器端口)
    -P                     随机指定端口(大写的P)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    docker run -it debian /bin/bash
    docker run -p 4444:80 -it 06d20309031e /bin/bash
    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" lasticsearch
    
    • 1
    • 2
    • 3

    退出容器命令:

    # exit 停止并退出容器(后台方式运行则仅退出)
    # Ctrl+P+Q  不停止容器退出
    
    • 1
    • 2

    列出运行过的容器命令:ps

    -a   # 列出所有容器的运行记录
    -n=? # 显示最近创建的n个容器
    -q   # 只显示容器的编号
    
    docker ps -n=3 -q
    docker ps -aq
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    删除容器命令:

    docker rm 容器id                
    #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
    
    docker rm -f $(docker ps -aq)   #删除所有的容器
    docker ps -aq|xargs docker rm #删除所有的容器
    docker ps -n=3 -q|xargs docker rm    #删除前3个容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    启动和停止容器:

    docker start 容器id          #启动容器
    docker restart 容器id        #重启容器
    docker stop 容器id           #停止当前运行的容器
    docker kill 容器id           #强制停止当前容器
    
    • 1
    • 2
    • 3
    • 4

    其他常用命令:

    # 日志的查看
    docker logs -tf  容器id     
    
    # 查看容器中进程信息
    docker top 容器id     
    
    # 查看容器的元数据
    docker inspect 容器id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进入当前正在运行的容器

    docker exec -it 容器id /bin/bash
    
    docker attach  进入容器正在执行的终端,不会启动新的进程
    docker exec    进入容器后开启一个新的终端,可以在里面操作
    
    • 1
    • 2
    • 3
    • 4

    拷贝操作

    #拷贝容器的文件到主机中
    docker cp 容器id:容器内路径  目的主机路径
    docker cp 2d2e85d3ef6a:/1.txt /mnt/hgfs/mykali/5.txt
     
    #拷贝宿主机的文件到容器中
    docker cp 目的主机路径 容器id:容器内路径
    docker cp  /mnt/hgfs/mykali/3.sh   2d2e85d3ef6a:/1.sh
    docker exec -it 2d2e85d3ef6a  cat /1.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    实例

    python

      容器数据卷

      直接挂载

      docker run -it -v 主机内目录:容器内目录 镜像名/id
      
      docker run -it -v /mnt/hgfs/mykali:/mnt -d  python
      docker exec -it 61a640351b0c  ls /mnt
      
      • 1
      • 2
      • 3
      • 4

      查看挂载

       docker inspect 61a640351b0c | grep  -A 9  "Mounts"
      
      • 1
      "Mounts": 
          "Type": "bind",
          "Source": "/mnt/hgfs/mykali", # 对应主机的源目录
          "Destination": "/mnt",  # 容器中的目录
          "Mode": "",
          "RW": true,
          "Propagation": "rprivate"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      匿名挂载

      docker run -d  -v 容器内目录  镜像名/id  # 匿名挂载
      
      docker run -it -v /mnt -d  python 
      
      匿名挂载后,查看所有挂载的卷
      docker volume ls
      每一个VOLUME NAME对应一个挂载的卷,由于挂载时未指定主机目录,因此无法直接找到目录。
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      具名挂载

      docker run -d  -v 卷名:容器内目录  镜像名/id 
      
      docker run -it -v volue01:/mnt -d  python 
      
      可以发现挂载的卷:volue01
      通过以下命令找到主机内目录:
      docker volume inspect 卷名 
      docker volume inspect volue01
      
        "CreatedAt": "2022-07-31T07:49:45-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volue01/_data",    <===
        "Name": "volue01",
        "Options": null,
        "Scope": "local"
       
      所有docker容器内的卷,在未指定主机内目录时,都在:/var/lib/docker/volumes/卷名/_data 下,
      可通过具名挂载可以方便的找到卷,因此广泛使用这种方式进行挂载。
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      数据卷容器

      docker run -it --name container02 --volumes from container01 镜像名/id  # 将两个容器进行挂载,实现两容器间数据同步
      
      • 1

      DockerFile

      基础命令

      命令效果
      FROM基础镜像:Centos/Ubuntu
      MAINTAINER镜像作者+邮箱
      RUN镜像构建的时候需要运行的命令
      ADD为镜像添加内容(压缩包)
      WORKDIR镜像工作目录(进入容器时的目录)
      VOLUME挂载的目录
      EXPOSE暴露端口配置
      CMD/ENTRYPOINT指定这个容器启动时要运行的命令(CMD替代先前命令,ENTRYPOINT在先前命令后追加)
      COPY类似于ADD,将文件拷贝到镜像中
      ENV构建时设置环境变量

      构建

      docker build -f 文件路径 -t 镜像名 .  
      docker run     # 运行镜像
      docker push    # 发布镜像
      
      • 1
      • 2
      • 3
      FROM debian      
      CMD /bin/bash    
      CMD echo Hello Dockerfile   
      
      docker build -f ./6.dockerfile -t mydocker .
      docker run -it  mydocker
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      echo "export flag=flag{ushfekjhvfegehveh32562f2dfw6wtw}" >> /etc/profile
      
      • 1

      Docker网络

      主机

      docker0:  mtu 1500 qdisc noqueue state UP group default 
      link/ether 02:42:e9:f4:98:03 brd ff:ff:ff:ff:ff:ff
      inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
         valid_lft forever preferred_lft forever
      inet6 fe80::42:e9ff:fef4:9803/64 scope link 
         valid_lft forever preferred_lft forever  
      7: vethb7a6d3d@if6:  mtu 1500 qdisc noqueue master docker0 state UP group default 
      link/ether be:49:2d:bb:2a:72 brd ff:ff:ff:ff:ff:ff link-netnsid 1
      inet6 fe80::bc49:2dff:febb:2a72/64 scope link 
         valid_lft forever preferred_lft forever
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      kali

      6: eth0@if7:  mtu 1500 qdisc noqueue state UP group default 
      	link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      	inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
      	   valid_lft forever preferred_lft forever
      
      • 1
      • 2
      • 3
      • 4

      原理

      kali -> 6: eth0@if7 -> 7: vethb7a6d3d@if6 -> docker0(路由器)	   
      
      • 1
      桥接   evth-pair虚拟设备接口
      
      docker run -d -P --name kali02 --link kali01 kali 可以使用名字就可以互联
      	docker exec -it kali02 cat /etc/hosts
      		172.0.0.1 kali01 ewiuhfwuewgui 原理
      	
      docker network ls
      
      自定义网络
      docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetname
      
      跨网络连通
      docker network connect mynetname kali02  一个容器,两个ip
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      Docker Compose

      案例

      test
      ├── app.py
      ├── docker-compose.yml
      ├── Dockerfile
      └── requirements.txt
      
      • 1
      • 2
      • 3
      • 4
      • 5

      app.py

      import time
      
      import redis
      from flask import Flask
      
      app = Flask(__name__)
      cache = redis.Redis(host='redis', port=6379)
      
      
      def get_hit_count():
          retries = 5
          while True:
              try:
                  return cache.incr('hits')
              except redis.exceptions.ConnectionError as exc:
                  if retries == 0:
                      raise exc
                  retries -= 1
                  time.sleep(0.5)
      
      
      @app.route('/')
      def hello():
          count = get_hit_count()
          return 'Hello World! I have been seen {} times.\n'.format(count)
      
      • 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

      在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。

      docker-compose.yml

      version: '3'
      services:
        web:
          build: .
          ports:
           - "5000:5000"
        redis:
          image: "redis:alpine"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      Dockerfile

      FROM python
      WORKDIR /code
      ENV FLASK_APP app.py
      ENV FLASK_RUN_HOST 0.0.0.0
      ENV flag flag{xiaoxiaoran}
      COPY requirements.txt requirements.txt
      RUN pip install -r requirements.txt
      COPY . .
      CMD ["flask", "run"]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      requirements.txt

      flask
      redis
      
      • 1
      • 2

      构建

      docker-compose up -d
      
      • 1
      docker run  --env flag=flag{vhdsfvjsg2} -d -p 8833:80 test_web
      
      docker exec -it  79adc5287bbb  /bin/bash -c  "cat /1.txt"
      
      • 1
      • 2
      • 3
    • 相关阅读:
      serveless 思想 Midway.js 框架使用教程(四)
      桥接模式ping不通主机和外网
      奇迹MU架设常见问题解决
      mybatis-plus的插件
      快速排序 ← PPT
      Mac安装rocketmq
      生命在于学习——docker逃逸
      Jupyter Notebook + Pyecharts——学习笔记(04)
      使用 Fiddler 抓包PC微信小程序
      《单片机原理及应用》-片外拓展
    • 原文地址:https://blog.csdn.net/qq_52549196/article/details/126301004