随笔 - 22  文章 - 0  评论 - 0  阅读 - 1039

docker基本命令以及私有仓库创建

docker基本命令使用和私有仓库创建

本文介绍docker的基本功能和使用方式。并提供官方私有仓库的使用操作方法。
img

docker基础架构介绍

docker存在4个主要部分。
img

分别是:镜像、容器、数据卷、网络

  1. 镜像

    镜像是通过dockerfile或者从官方仓库(hub.docker)和国内镜像源(如阿里云)进行拉取下来的。这也是我们运行容器的基础环境。
    (比如说,我们要运行centos的环境就拉centos的镜像。要运行python3的环境,就拉python3的镜像)

    remarks:镜像类似于容器的类。基于镜像可以创建完全相同的容器

  2. 容器

    容器是基于镜像创建的不同的每个个体。通过参数可以约定它的启动情况。并给予文件和相关运行配置。使得每个个体各司其职。

    remarks:实际上每个容器(或者说它们的父亲镜像)都是一个最小化的linux系统。

  3. 数据卷

    理解数据卷之前,得先解释一下挂载。

    挂载:

    • why:我们运行容器之后,如果要在容器内运行自己的代码,那么就得把文件传输进去。然而我们的宿主机不是直接与容器进行通信。所以就需采取挂载的方式。
    • what:实际上,挂载就是将本机(也就是宿主机)的文件与容器的某个文件目录进行双向绑定。
      在进行挂载之后。无论是改变宿主机还是容器中被挂载的文件。双方都会同时改变。

    数据卷:

    创建数据卷实际上就是在宿主机上创建一个特定目录。然后把容器内的文件绑定在这个特定目录上。

    这个特定的文件可以用于备份。或者其他容器可以通过此卷再进行挂载。达到容器间某文件的一致性

    remarks:实际上,在我们未指定卷的情况下。每个容器存在自己的文件系统。而这个文件系统也会通过匿名卷的方式保存在卷目录下
    img
    其中那个特定姓名的是我们自己创建的卷,而其他的都是容器运行创建的匿名卷。

  4. 网络

    网络分为两种。一个是通过网络让容器与宿主机通信。另一个是通过容器间网络实现容器间互联

    • 容器-宿主机 :容器与宿主机一般不直接通信,而是采取端口暴露的方式。比如说容器8000端口暴露到宿主机8888端口(用参数就是 -p 8888:8000)。这样的话,在我们访问8888端口时。就可以访问到容器的8000端口的服务。

    img

    • 容器1-容器2-容器n:容器之间的通信就不是使用端口暴露(也叫端口映射)的方式实现,而是采取docker网络的形式。当docker建立network的固定网络之后。带着网络启动之后。容器之间,就可以通过容器名(即容器1:> ping 容器2名)的方式ping通。同样服务之间也可以这样相连接。

    img
    img

    remarks: docker提供了多种软件直接互联的网络方式。主要有以下几种网络种类:Bridge Network(桥接网络)、Host Network(主机网络)、Overlay Network(覆盖网络)

docker基本命令

对于已经比较了解的人,可以记下以下几点技巧:

  1. 输入容器或者镜像名时,可以输入它的前三个id值,就可以执行操作。
  2. sava和load命令可以打包镜像文件,commit命令可以将容器提交为镜像
  3. --rm启动镜像,在容器停止的时候会自动销毁
  4. 一个命令停止/删除所有容器
    docker stop/rm `docker ps -aq`
    
  5. 在输入ps或者images指令之后,接下来输入容器名的时候可以使用tab补全。

镜像

这里展示镜像的基本操作

    # 镜像的查看
    docker images;
    docker image ps;
    
    # 镜像拉取
    docker pull 镜像名:(镜像版本) # 版本不加默认拉latest

    # 镜像创建(必须得有Dockerfile脚本文件,名字不能错。)(这里不做Dockerfile脚本书写的讲解)
    docker build 带脚本的文件夹位置

    # 镜像改tag
    docker tag 旧镜像id/名字 新名字

    # 镜像删除
    docker rmi 镜像名

拉取/操作镜像

img

构建镜像

img

容器

    # 通过镜像创建容器并运行
    docker run --name 指定名字 镜像
    # 重要参数(注意仓鼠只能写在run后面,不能放最后)
    -d 后台运行 -P 随机端口映射运行 -p xxxx:xxxx 指定端口映射运行
    -i 则让容器的标准输入保持打开 -t 让Docker分配一个伪终端,并绑定到容器的标准输入上(it一般一起使用进入交互式终端)
    --rm 容器停止后自动移除 --name 设置容器名
    # 例如:docker run -it centos /bin/bash
    
    # 查找容器
    docker ps # 查找正在运行的容器
    docker ps -a # 查找所有运行过的容器,包括挂掉的
    # -q参数,只显示容器id

    # 查看容器日志
    docker logs 容器名/容器id(前三位即可)
    docker logs 容器名/容器id -f # 挂起容器输入日志

    # 进入容器
    docker exec -it 容器名/容器id /bin/bash

    # 操作容器
    docker stop/start/restart 容器名/容器id # 停止、启动、重启容器
    docker rm 容器名/容器id # 删除容器
    docker rm `docker ps -aq` # 删除所有容器

数据卷

    # 创建一个卷
    docker volume create test-vol

    # 查看所有数据卷
    docker volume ls

    # 查看指定卷信息
    docker volume inspect test-vol

    # -v或者--mount通过挂载方式启动容器
    docker run -d --name=test-nginx -p 8011:80 -v test-vol:/usr/share/nginx/html nginx:1.13.12
    docker run -d -it --name=test-nginx -p 8011:80 --mount source=test-vol,target=/usr/share/nginx/html nginx:1.13.12
    # 都是挂载命令,使用 -v 挂载时,如果宿主机上没有指定文件不会报错,会自动创建指定文件;当使用 --mount时,如果宿主机中没有这个文件会报错找不到指定文件,不会自动创建指定文件。

    # 删除卷
    docker volume rm test-vol # 单删除卷
    docker rm -v 容器名/容器id # 删除容器时绑定删除卷
    docker volume prune # 删除所有没使用的卷

注意:

上方挂载数据卷的方式同样也适用于挂载本地文件。数据卷可以看见一个本地文件路径的别名。(数据卷的位置一般在/var/lib/docker/volumes)

网络

    # -P/-p 端口映射启动
    docker run -d -P nginx:alpine

    # 查看端口的绑定情况
    docker port 容器名/容器id 端口号

    # 注意-p可以重复使用
    docker run -d \
    -p 80:80 \
    -p 443:443 \
    nginx:alpine

    # 创建桥接网络(还有主机网络、覆盖网络……,参考文档https://docs.docker.com/engine/network/drivers/)
    docker network create -d bridge my-net # -d是用来指定网络类型

    # 容器连接网络启动
    docker run -it --rm --name busybox1 --network my-net busybox sh
    docker run -it --rm --name busybox2 --network my-net busybox sh

    # 进入容器后执行ping的情况
        # ping busybox2
        PING busybox2 (172.19.0.3): 56 data bytes
        64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
        64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
        # ping busybox1
        PING busybox1 (172.19.0.2): 56 data bytes
        64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
        64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms

    # 查看已创建的网络
    docker network ls

    # 查看指定网络的详细信息
    docker network inspect my-net

    # 将一个已运行的容器连接到一个网络
    docker network connect my-net 容器名/容器id

    # 从网络中断开一个容器
    docker network disconnect my-net 容器名/容器id

    # 删除自定义网络
    docker network rm my-net
    

docker私有仓库部署

私有仓库配置

docker提供一个私有仓库镜像。只需要拉取它,就可以进行私有仓库的拉取和推送容器

这里直接展示示例

私有仓库服务器:124.71.140.159,配置如下

    # 下载镜像
    root@hcss-ecs-b72a:~# docker pull  registry
    Using default tag: latest
    latest: Pulling from library/registry
    930bdd4d222e: Pull complete 
    a15309931e05: Pull complete 
    6263fb9c821f: Pull complete 
    86c1d3af3872: Pull complete 
    a37b1bf6a96f: Pull complete 
    Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
    Status: Downloaded newer image for registry:latest
    docker.io/library/registry:latest

    # 准备好私有仓库镜像和需要推送的镜像
    root@hcss-ecs-b72a:~# docker images;
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    registry      latest    cfb4d9904335   11 months ago   25.4MB
    hhh/hello     latest    d2c94e258dcb   16 months ago   13.3kB

    # 镜像改名
    docker tag hhh/hello 124.71.140.159:8888/hello

    # 启动私有镜像库(挂载位置可自定,也可以使用数据卷)
    docker run -d -p 8888:5000 -v /opt/data/registry:/var/lib/registry registry

    # 推送镜像报错
    root@hcss-ecs-b72a:~# docker push 124.71.140.159:8888/hello
    Using default tag: latest
    The push refers to repository [124.71.140.159:8888/hello]
    Get "https://124.71.140.159:8888/v2/": http: server gave HTTP response to HTTPS client

    # 修改/etc/docker/daemon.json配置文件
    # 通过vim修改
    vim /etc/docker/daemon.json 
    # 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"]
    {
        "registry-mirrors": [
        "https://docker.m.daocloud.io", 
        "https://docker.jianmuhub.com",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://dockerhub1.beget.com",
        "https://noohub.ru"],
        "insecure-registries":["124.71.140.159:8888"]
    }
    # 读取配置重启
    systemctl daemon-reload
    systemctl restart docker

    # 重新启动容器(会挂掉,或者直接启动一个新的)
    docker run --privileged=true -d -p 8888:5000 -v /opt/data/registry:/var/lib/registry registry

    # 再进行推送就ok了
    root@hcss-ecs-b72a:~# docker push 124.71.140.159:8888/hello
    Using default tag: latest
    The push refers to repository [124.71.140.159:8888/hello]
    ac28800ec8bb: Pushed 
    latest: digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7 size: 524

如此,在推送成功后,我们可以在这个api当中看到我们推送上去的仓库json:http://124.71.140.159:8888/v2/_catalog

img

接下来在我本地的虚拟机上执行拉取操作:

    # 先配置需要配置的/etc/docker/daemon.json并重启
     vim /etc/docker/daemon.json 
    # 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"]
    {
        "registry-mirrors": [
        "https://docker.m.daocloud.io", 
        "https://docker.jianmuhub.com",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://dockerhub1.beget.com",
        "https://noohub.ru"],
        "insecure-registries":["124.71.140.159:8888"]
    }
    # 读取配置重启
    systemctl daemon-reload
    systemctl restart docker

    # 执行拉取操作
    root@long:/opt/test_docker# docker pull 124.71.140.159:8888/hello
    Using default tag: latest
    latest: Pulling from hello
    c1ec31eb5944: Pull complete 
    Digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7
    Status: Downloaded newer image for 124.71.140.159:8888/hello:latest
    124.71.140.159:8888/hello:latest

    # 这样就可以成功拉取和运行了

还有一种简单的镜像移植方式

还有通过sava-load指令的镜像移植方式。

    # sava保存镜像
    docker save 镜像名/镜像id > /opt/centos.tar.gz # 也可以指定其他文件

    # scp给其他服务器发过去
    scp /opt/centos.tar.gz root@124.71.140.159:/opt/

    # load加载镜像
    docker load < /opt/centos.tar.gz

如果想要制作私有镜像,还可以把修改的容器提交为镜像(commit命令):docker commit 059 chaoyu/centos-vim

docker报错汇总

  1. 进行私有仓库推送时:
    Using default tag: latest
    The push refers to repository [124.71.140.159:8888/hello]
    Get "https://124.71.140.159:8888/v2/": http: server gave HTTP response to HTTPS client

    解决方式:
    配置/etc/docker/daemon.json并重启docker

        # 先配置需要配置的/etc/docker/daemon.json并重启
        vim /etc/docker/daemon.json 
        # 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"]
        {
            "registry-mirrors": [
            "https://docker.m.daocloud.io", 
            "https://docker.jianmuhub.com",
            "https://huecker.io",
            "https://dockerhub.timeweb.cloud",
            "https://dockerhub1.beget.com",
            "https://noohub.ru"],
            "insecure-registries":["124.71.140.159:8888"]
        }
        # 读取配置重启
        systemctl daemon-reload
        systemctl restart docker
    
  2. 容器内报网络错误

    比如说我dockerfile下flask的时候报错:

    WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0xffffb5bd3100>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /pypi/simple/flask/

    找不到问题,结果改容器的dns可以解决:

        # 先配置需要配置的/etc/docker/daemon.json并重启
            vim /etc/docker/daemon.json 
        # 改成如下内容,注意这里
        # "dns" : [
        #        "114.114.114.114",
        #        "8.8.8.8"
        #    ]
        {
            "registry-mirrors": ["https://docker.m.daocloud.io", 
            "https://docker.jianmuhub.com",
            "https://huecker.io",
            "https://dockerhub.timeweb.cloud",
            "https://dockerhub1.beget.com",
            "https://noohub.ru"],
            "insecure-registries":["124.71.140.159:8888"],
            "dns" : [
                "114.114.114.114",
                "8.8.8.8"
            ]
        }
        
        # 读取配置重启
        systemctl daemon-reload
        systemctl restart docker
    
posted on   longsihua2003  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示