• Docker 讲解与基本操作


     哈喽~大家好,这篇来看看Docker 讲解与基本操作。

     🥇个人主页:个人主页​​​​​             

    🥈 系列专栏:【微服务】       

    🥉与这篇相关的文章:            

    目录

    一、前言

    二、结构

    1、镜像名称

    2、镜像命令的流程

    三、Docker常用命令

    1、与仓库相关

    2、与容器相关

    3、与镜像相关

    4、与run命令相关

    四、隔离环境

    1、说明

    2、数据卷(容器数据管理)

    3、什么是数据卷

    4、创建和查看数据卷

    1) 创建数据卷

    2)查看所有数据

    3)查看数据卷详细信息卷

    4)、小结

    5、挂在数据卷

    6、小结

    五、自定义镜像

    1、镜像结构

    2、Dockerfile语法

    3、Docker-Compose

    六、搭建私有镜像仓库

    1、带有图形化界面版本

    2、配置Docker信任地址

    3、推送、拉取镜像


    一、前言

    在之前的云原生篇对 Docker 有做讲解,由于不太详细,所以单独出了一篇作为讲解,并且为之后的操作都是在docker里面进行操作。

    二、结构

    1、镜像名称

    镜名称一般分两部分组成:[repository]:[tag]。

    在没有指定tag时,默认是latest,代表最新版本的镜像

    2、镜像命令的流程

    三、Docker常用命令

    总结Docker常用命令,便于梳理和巩固对Docker的学习,也便于能够研究Docker更深层面的技术实现。

    1、与仓库相关

    1. $ docker search $KEY_WORD              # 查找镜像
    2. $ docker pull $REGISTRY:$TAG           # 获取镜像
    3. $ docker push $IMAGE_NAME:$IMAGE_TAG   # 推送镜像到仓库,需要先登录
    4. $ docker login $REGISTRY_URL           # 登录仓库
    5. $ docker logout $REGISTRY_URL          # 退出仓库
    6. $ docker info                          # 显示Docker详细的系统信息,可查看仓库地址
    7. $ docker --help                        # 显示Docker的帮助信息

    2、与容器相关

    1. $ docker attach $CONTAINER_ID # 启动一个已存在的docker容器
    2. $ docker stop $CONTAINER_ID   # 停止docker容器
    3. $ docker start $CONTAINER_ID   # 启动docker容器
    4. $ docker restart $CONTAINER_ID # 重启docker容器
    5. $ docker kill $CONTAINER_ID   # 强制关闭docker容器
    6. $ docker pause $CONTAINER_ID   # 暂停容器
    7. $ docker unpause $CONTAINER_ID # 恢复暂停的容器
    8. $ docker rename $CONTAINER_ID # 重新命名docker容器
    9. $ docker rm $CONTAINER_ID     # 删除容器
    10. $ docker logs $CONTAINER_ID   # 查看docker容器运行日志,确保正常运行
    11. $ docker inspect $CONTAINER_ID # 查看container的容器属性,比如ip等等
    12. $ docker port $CONTAINER_ID   # 查看container的端口映射
    13. $ docker top $CONTAINER_ID     # 查看容器中正在运行的进程
    14. $ docker commit $CONTAINER_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 将容器保存为镜像
    15. $ docker ps -a                 # 查看所有容器
    16. $ docker stats                 # 查看容器的资源使用情况

    3、与镜像相关

    1. $ docker images                     # 查看本地镜像
    2. $ docker rmi $IMAGE_ID               # 删除本地镜像
    3. $ docker rm -f xxx                   # 强行删除本地镜像
    4. $ docker inspect $IMAGE_ID           # 查看镜像详情
    5. $ docker save $IMAGE_ID > 文件路径   # 保存镜像为离线文件
    6. $ docker save -o 文件路径 $IMAGE_ID # 保存镜像为离线文件
    7. $ docker load < 文件路径             # 加载文件为docker镜像
    8. $ docker load -i 文件路径           # 加载文件为docker镜像
    9. $ docker tag $IMAGE_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 修改镜像TAG
    10. $ docker run 参数 $IMAGE_ID $CMD     # 运行一个镜像
    11. $ docker history $IMAGE_ID           # 显示镜像每层的变更内容

    4、与run命令相关

    1. # -d,后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl+C退出命令同时会关闭容器
    2. # -i,以交互模式运行容器, 通常与-t同时使用
    3. # -t,为容器重新分配一个伪输入终端, 通常与-i同时使用
    4. # --name container_name,设置容器名称, 不指定时随机生成
    5. # -h container_hostname,设置容器的主机名, 默认随机生成
    6. # --dns 8.8.8.8,指定容器使用的DNS服务器, 默认和宿主机一致
    7. # -e docker_host=172.17.0.1,设置环境变量
    8. # --cpuset="0-2" or --cpuset="0,1,2",绑定容器到指定CPU运行
    9. # -m 100M,设置容器使用内存最大值
    10. # --net bridge,指定容器的网络连接类型, 支持bridge/host/none/container四种类型
    11. # --ip 172.18.0.13,为容器指定固定IP(需要使用自定义网络none)
    12. # --expose 8081 --expose 8082,开放一个端口或一组端口,会覆盖镜像设置中开放的端口
    13. # -p [宿主机端口]:[容器内端口],宿主机到容器的端口映射,可指定宿主机的要监听的IP,默认为0.0.0.0
    14. # -P,注意是大写的, 宿主机随机指定一组可用的端口映射容器expose的所有端口
    15. # -v [宿主机目录路径]:[容器内目录路径],挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件)
    16. # --add-host [主机名]:[IP],为容器hosts文件追加host, 默认会在hosts文件最后追加[主机名]:[容器IP]
    17. # --volumes-from [其他容器名],将其他容器的数据卷添加到此容器
    18. # --link [其他容器名]:[在该容器中的别名],添加链接到另一个容器,在本容器hosts文件中加入关联容器的记录,效果类似于--add-host

    eg:创建并运行一个容器

    创建并运行nginx容器的命令:

    docker run --name containerName -p 80:80 -d nginx

    命令解读:

    docker run :创建并运行一个容器

    --name : 给容器起一个名字,比如叫做mn

    -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口

    -d:后台运行容器

    nginx:镜像名称,例如nginx

    四、隔离环境

    1、说明

    这里的-p参数,是将容器端口映射到宿主机端口。

    默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

    现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

    进入容器。进入我们刚刚创建的nginx容器的命令为:

    docker exec -it mn bash

    命令解读:

    docker exec :进入容器内部,执行一个命令

    -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

    mn :要进入的容器的名称

    bash:进入容器后执行的命令,bash是一个linux终端交互命令

    修改index.html的内容

    容器内没有vi命令,无法直接修改,我们用下面的命令来修改:

    sed -i -e 's#Welcome to nginx#xxxxx#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html

    2、数据卷(容器数据管理)

    在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。

    这就是因为容器与数据(容器内文件)耦合带来的后果。

    要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。

    3、什么是数据卷

    数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

    一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

    这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了

    数据卷操作的基本语法如下:

    docker volume [COMMAND]

    docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

    create 创建一个volume

    inspect 显示一个或多个volume的信息

    ls 列出所有的volume

    prune 删除未使用的volume

    rm 删除一个或多个指定的volume

    4、创建和查看数据卷

    需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

    1) 创建数据卷

    docker volume create html

    2)查看所有数据

    docker volume ls

    3)查看数据卷详细信息卷

    docker volume inspect html

    可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data目录。

    4)、小结

    数据卷的作用:

    将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

    数据卷操作:

    docker volume create:创建数据卷

    docker volume ls:查看所有数据卷

    docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置

    docker volume rm:删除指定数据卷

    docker volume prune:删除所有未使用的数据卷

    5、挂在数据卷

    我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:

    1. docker run \
    2. --name mn \
    3. -v html:/root/html \
    4. -p 8080:80
    5. nginx \

    这里的-v就是挂载数据卷的命令:

    -v html:/root/htm把html数据卷挂载到容器内的/root/html这个目录中

    eg:挂载 mysql

    1. docker run \
    2. --name mysql2 \
    3. -e MYSQL_ROOT_PASSWORD=123456 \
    4. -p 3306:3306 \
    5. -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
    6. -v /tmp/mysql/data:/var/lib/mysql \
    7. -d \
    8. mysql:5.7.25

    挂载sentinel

    1. docker run \
    2. --name sentinel1 \
    3. -d \
    4. -p 8858:8858 \
    5. -d \
    6. bladex/sentinel-dashboard
    7. docker run -dit sentinel1 /bin/bash

    挂载nacos

    1. docker run \
    2. --name mynacos \
    3. -e MODE=standalone \
    4. -p 8848:8848 \
    5. -d \
    6. nacos/nacos-server

    6、小结

    docker run的命令中通过 -v 参数挂载文件或目录到容器中:

    -v volume名称:容器内目录

    -v 宿主机文件:容器内文

    -v 宿主机目录:容器内目录

    数据卷挂载与目录直接挂载的

    数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找

    目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

    五、自定义镜像

    常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

    而要自定义镜像,就必须先了解镜像的结构才行。

    1、镜像结构

    镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

    我们以MySQL为例,来看看镜像的组成结构:

    简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

    我们要构建镜像,其实就是实现上述打包的过程。

    2、Dockerfile语法

    构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

    我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

    而描述上述信息的文件就是Dockerfile文件。

    Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

    更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Documentation

    3、Docker-Compose

    Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

    Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:

    1. version: "3.8"
    2. services:
    3.   mysql:
    4.     image: mysql:5.7.25
    5. environment:
    6. MYSQL_ROOT_PASSWORD: 123
    7.     volumes:
    8.      - "/tmp/mysql/data:/var/lib/mysql"
    9.      - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
    10.   web:
    11.     build: .
    12.     ports:
    13.      - "8090:8090"

    上面的Compose文件就描述一个项目,其中包含两个容器:

    mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录

    web:一个基于docker build临时构建的镜像容器,映射端口时8090

    DockerCompose的详细语法参考官网:Compose specification | Docker Documentation

    其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。

    部署示例 docker-compose文件

    1. version: "3.2"
    2. services:
    3. nacos:
    4. image: nacos/nacos-server
    5. environment:
    6. MODE: standalone
    7. ports:
    8. - "8848:8848"
    9. mysql:
    10. image: mysql:5.7.25
    11. environment:
    12. MYSQL_ROOT_PASSWORD: 123
    13. volumes:
    14. - "$PWD/mysql/data:/var/lib/mysql"
    15. - "$PWD/mysql/conf:/etc/mysql/conf.d/"
    16. userservice:
    17. build: ./user-service
    18. orderservice:
    19. build: ./order-service
    20. gateway:
    21. build: ./gateway
    22. ports:
    23. - "10010:10010"

    可以看到,其中包含5个service服务:

    nacos作为注册中心和配置中心

    image: nacos/nacos-server 基于nacos/nacos-server镜像构

    environment环境变量

    MODE: standalone单点模式启动

    ports端口映射,这里暴露了8848端口

    mysql数据库

    image: mysql:5.7.25镜像版本是mysql:5.7.25

    environment环境变量

    MYSQL_ROOT_PASSWORD: 123设置数据库root账户的密码为123

    volumes数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据

    userserviceorderservicegateway都是基于Dockerfile临时构建的

    六、搭建私有镜像仓库

    Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

    搭建方式比较简单,命令如下:

    1. docker run -d \
    2. --restart=always \
    3. --name registry \
    4. -p 5000:5000 \
    5. -v registry-data:/var/lib/registry \
    6. registry

    命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

    访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

    1、带有图形化界面版本

    使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

    1. version: '3.0'
    2. services:
    3. registry:
    4. image: registry
    5. volumes:
    6. - ./registry-data:/var/lib/registry
    7. ui:
    8. image: joxit/docker-registry-ui:static
    9. ports:
    10. - 8080:80
    11. environment:
    12. - REGISTRY_TITLE=xxxxx
    13. - REGISTRY_URL=http://registry:5000
    14. depends_on:
    15. - registry

    2、配置Docker信任地址

    我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

    1. # 打开要修改的文件
    2. vi /etc/docker/daemon.json
    3. # 添加内容:
    4. "insecure-registries":["http://192.168.71.132:8080"]
    5. # 重加载
    6. systemctl daemon-reload
    7. # 重启docker
    8. systemctl restart docker

    3、推送、拉取镜像

    推送镜像到私有镜像服务必须先tag,步骤如下:

    1)重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/

    docker tag nginx:latest 192.168.150.101:8080/nginx:1.0 

    2)推送镜像

    docker push 192.168.150.101:8080/nginx:1.0 

    3)拉取镜像

    docker pull 192.168.150.101:8080/nginx:1.0 

    不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!

  • 相关阅读:
    一文带你了解TikTok广告账户以及如何进行TikTok广告投放
    iphone网络编程
    数字经济时代文化消费新特征
    Ubuntu 软件管理学习笔记
    Golang 企业级web后端框架
    想要精通算法和SQL的成长之路 - 最长连续序列
    多模态神经成像之EEG-fMRI同步
    带你贯穿微信公众号
    10-Linux输入输出
    二叉排序树的查找、插入、创建和删除
  • 原文地址:https://blog.csdn.net/aasd23/article/details/128211125