docker基础学习

本文详细介绍了Docker的基础知识,包括常用命令如创建、列出、删除镜像和容器,以及如何通过Dockerfile构建镜像。此外,还讲述了Docker的可视化管理工具Portainer的使用,以及数据卷的创建和使用,实现数据持久化。最后,通过实例展示了如何发布镜像到DockerHub和阿里云容器服务。
摘要由CSDN通过智能技术生成

入门Docker

1、Docker常用命令总结

镜像相关

# 列出镜像
docker images
# 搜索镜像
docker search ImageName
# 下载镜像
docker pull ImageName
# 删除镜像
docker rmi ImageName/ImageID
# 提交修改
docker commit -m="提交的描述信息" -a="作者" containerId imageName:[TAG]
# 查看docker镜像是怎么制作的
docker history ImageName
# 命名镜像
docker tag imageID ImageName:TAG

容器相关

  • 新建容器并启动

    # 以下列出多种容器启动方式,其中options参数不针对特定场景,可自定义组合使用。
    ###################################
    docker run -it imageName /bin/bash
    ###################################
    options:
    -it:以交互方式运行
    /bin/bash: 提供一个控制台
    
    #############################################
    docker run -d --name nginx01 -p 3344:80 nginx
    #############################################
    options:
    -d:后台运行容器,并返回容器ID
    --name:为容器起一个名字
    -p:指定端口映射,主机端口:容器端口
    
    ##############################
    docker run -it --rm tomcat:9.0
    ##############################
    options:
    --rm:用完即删,之前的启动都是后台,停止容器后,容器还在,而加上--rm参数后,容器停止即自动删除
    
    ################################################################################################################
    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
    ################################################################################################################
    options:
    -e:设置环境变量
    
    ################################################################################################################
    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    ################################################################################################################
    
    options:
    --restart=always:当docker重启时,自动启动该容器
    -v:挂载目录,第一个目录是宿主机目录,第二个目录是容器目录
    --privileged=true:container内的root拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。
    
  • 列出容器

    # 列出正在运行的容器
    docker ps
    # 列出所有容器
    docker ps -a
    
  • 启动容器

    docker start containerId
    
  • 进入容器:

    # 开启一个新的终端
    docker exec -it containerId /bin/bash
    # 进入正在执行的终端
    docker attach containerId
    
  • 退出容器

    # 快捷键
    ctrl + P + Q
    # 命令
    exit
    
  • 查看容器日志

    #########################################
    docker logs -f -t --tail 100 containerId
    #########################################
    options:
    -f:实时跟踪日志
    -t:展示时间戳
    --tail:输出多少条
    
  • 查看容器内进程信息

    docker top containerId
    
  • 从容器内拷贝文件到宿主机

    docker cp containerPath hostPath
    
  • 查看容器占用的资源信息

    docker stats containerId
    
  • 查看容器的信息

    docker inspect containerId
    

其他

  • 查看volum信息

    docker volume ls
    
  • 通过Dockerfile构建镜像

    docker build -f dockerfilePath -t ImageName:TAG .
    

2、Docker可视化

portainer工具

portainer是一个轻量级的管理UI,用于管理不同的docker环境。

# 创建并启动portainer容器
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

options:
--restart=always:当docker重启时,自动启动该容器
-v:挂载目录,第一个目录是宿主机目录,第二个目录是容器目录
--privileged=true:container内的root拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。

访问宿主机8088端口:
在这里插入图片描述

3、小试牛刀

  • 部署nginx

    docker run -d --name nginx01 -p 3344:80 nginx
    
    # 测试
    curl localhost:3344
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
  • 部署tomcat

    docker run -d -p 3355:8080 --name tomcat01 tomcat
    
  • 部署ES+Kibana

    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
    
    # 测试
    curl localhost:9200
    
    {
      "name" : "a82ed4063289",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "rnaW5-VZRYOpAJJwP7obxg",
      "version" : {
        "number" : "7.6.2",
        "build_flavor" : "default",
        "build_type" : "docker",
        "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
        "build_date" : "2020-03-26T06:34:37.794943Z",
        "build_snapshot" : false,
        "lucene_version" : "8.4.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

4、Docker镜像

Docker是什么?

Docker镜像是一个可执行的独立软件开发包,它包含代码,运行时,库,环境变量,配置文件等。所有的软件和环境,直接打包为docker镜像,就可以跑起来!

UnionFS(联合文件系统)

联合文件系统是一种轻量级的高性能分层文件系统,它支持将文件中的修改信息作为一次提交,一次提交对应一层新的修改记录,修改记录以目录的形式存储在磁盘上,将不同修改目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。

这使得用户可以基于基础的镜像创建新的镜像,这些镜像共享同一个基础镜像层(即一个镜像可能创建出多个容器,这些容器共享同一个基础镜像) ,提高了存储效率。

在这里插入图片描述

当Docker利用镜像启动一个容器时,将在镜像文件系统的最顶端再挂载一个新的可读写的层给容器。容器中的内容更新将会发生在可读写层,如下图的Container layer

在这里插入图片描述

使用docker history可查看一个镜像由拿些层组成

docker history tomcat

fb5657adc892        2 days ago          /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B                                 
<missing>           2 days ago          /bin/sh -c set -eux;   savedAptMark="$(apt-m…   20.2MB                       
<missing>           3 days ago          /bin/sh -c set -eux;   arch="$(dpkg --print-…   343MB                          
<missing>           3 days ago          /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B                            
<missing>           3 days ago          /bin/sh -c set -eux;  apt-get update;  apt-g…   11.3MB              
<missing>           4 days ago          /bin/sh -c apt-get update && apt-get install…   152MB               
<missing>           4 days ago          /bin/sh -c set -ex;  if ! command -v gpg > /…   18.9MB              
<missing>           4 days ago          /bin/sh -c set -eux;  apt-get update;  apt-g…   10.7MB                           
<missing>           4 days ago          /bin/sh -c #(nop) ADD file:c03517c5ddbed4053…   124MB

Docker镜像加载原理

bootfs(boot file system),包括bootloaderkernelbootloader主要是引导加载kernel,将内核加载到内存中后,系统会卸载bootfs

rootfs(root file system),在bootfs之上,是各种操作系统发行版(例如ubuntu,centeos,Debian等),rootfs可以很小,只包含最基本的命令,工具和程序库,其内核共享宿主机的内核。所以docker中的ubuntu镜像一般很小,只有几百MB。

在这里插入图片描述

Image,在基础镜像之上创建,新的修改提交创建出新的一层记录。

docker镜像加载的分层结构如下所示: bootfs —> rootfs —> Image

在这里插入图片描述

5、容器数据卷

容器数据卷是什么?

目的: 实现数据持久化

方式: 将容器内目录与宿主机目录进行挂载,当在容器内修改文件时,会同步更新到宿主机目录。当容器删除后,文件依然存在于宿主机上,不会被删除。
在这里插入图片描述

挂载: 在启动容器时,通过-v参数进行挂载

# 1、指定路径挂载
docker run -it -v 宿主机目录:容器内目录
# 2、匿名挂载
docker run -it -v 容器内目录
# 3、具名挂载         
docker run -it -v 卷名:容器内路径    

优势: 修改数据时只需要在本地修改,容器内会自动同步。(节省了从宿主机拷贝或更新文件到容器内的步骤)

实战:使用MySQL同步数据

Dockerhub: https://hub.docker.com/_/mysql

docker run -d -p 3310:3306 
-v /export/nisl/qx/test/mysql/conf:/etc/mysql/conf.d 
-v /export/nisl/qx/test/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 
--name mysql01 
mysql:5.7.36

# -v:挂载配置文件和数据目录到宿主机
# -e: 设置环境变量,定义mysql密码
# --name: 设置容器名称

此时,在宿主机的/export/nisl/qx/test目录下,已经创建了confdata目录,并且完成了数据的同步

在这里插入图片描述

利用本地Navicat连接数据库

在这里插入图片描述

此时,在docker容器和宿主机上也生成了test目录,证明连接成功,可以在本地对数据库进行操作了!
在这里插入图片描述

最后,即使删除了容器,mysql的数据仍然存储在宿主机上,实现了数据持久化!
在这里插入图片描述

匿名挂载和具名挂载

  • 匿名挂载:挂载目录时不指定卷名称

    docker run -d -P --name nginx01 -v /etc/nginx nginx
    

    如下图所示,匿名挂载时创建的卷名是乱码:
    在这里插入图片描述

  • 具名挂载:挂载目录时指定卷名称

    docker run -d -P --name nginx02 -v naming-nginx:/etc/nginx nginx
    
    如下图所示,具名挂载创建的卷名是确定的:
    

    在这里插入图片描述

  • 查看卷:

    docker volume inspect naming-nginx
    

    在这里插入图片描述

    所有的docker卷,在没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data目录下

6、Dockerfile

创建一个简单的Dockerfile

Dockerfile是用来构建docker镜像的配置文件,通过它可以生成一个Docker镜像。

如下,编写一个简单的Dockerfile

FROM ubuntu

# 挂载卷,即生成两个卷与容器内的volume01和volume02挂载
VOLUME ["volume01", "volume02"]

CMD echo "----end----"
CMD /bin/bash

构建镜像(注意最后有一个点):

docker build -f /export/nisl/qx/test/Dockerfile -t test/ubuntu:1.0 .

生成容器并查看挂载信息:

# 创建一个容器
docker run -it 80d33ac04384 /bin/bash
exit
# 查看挂载信息
docker inspect d1bd18eca8d8

在这里插入图片描述

数据卷容器

目的: 实现容器间的数据共享

在这里插入图片描述

实例: 实现多个容器间mysql数据的共享

# 第一个容器
docker run -d -v /etc/mysql/conf.d 
-v /var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 
--name mysql01 
mysql:5.7.36

# 第二个容器
docker run -d -v /etc/mysql/conf.d 
-v /var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 
--name mysql02 --volumes-from mysql01
mysql:5.7.36

如下所示,两个容器内的mysql数据(位于/var/lib/mysql目录下)可以实现共享

在这里插入图片描述

当删除其中一个容器时,并不影响另一个容器的数据(因为host主机上的卷还存在)

在这里插入图片描述

注意:

一旦将数据持久化到了本地,这个时候,本地的数据是不会删除的!

如果需要删除本地的卷,需要使用docker volume prune命令

(base) nisl@xibeiidaxue-X299-WU8:test$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
b98ff4eb263aa69db16ecca97194271e85430b05b5137f5efea370e410a00083
d6ff04ca0eaed2ed29e587fbf51f039423bdf712915fb53fe62c1fcb088cb872

Total reclaimed space: 126.7MB

Dockerfile构建过程

基础知识:

  1. 关键字必须是大写字母

  2. 执行从上到下的顺序执行

  3. #表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交!

Dockerfile指令说明:

实战测试:构建一个centos

DockerHub中99%的镜像都是以scratch作为基础镜像创建起来的。

# 1、编写Dockerfile文件
FROM centos
MAINTAINER xingxing<nwu_qx@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash


# 2、通过这个文件构建镜像
docker build -f dockerfile文件路径 -t 镜像:版本


# 3、测试运行
pwd
vim
ifconfig

7、发布镜像

  • 发布到DockerHub

    1、网站注册:https://hub.docker.com/

    在这里插入图片描述

    2、docker登陆

    在这里插入图片描述

    3、发布镜像

    docker push ImageName:TAG
    
  • 发布到阿里云容器服务

    1、进入阿里云镜像服务控制台

    网站:https://cr.console.aliyun.com/cn-hangzhou/instance/repositories

    2、创建命名空间

    在这里插入图片描述

    3、创建镜像仓库

    在这里插入图片描述
    在这里插入图片描述

    4、发布镜像

    在这里插入图片描述

资料

【视频】Docker基础讲解:https://www.bilibili.com/video/BV1og4y1q7M4?p=21&spm_id_from=pageDriver

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值