docker基础

docker基础,第1张

docker基础 入门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
    
    
    
    
    Welcome to nginx!
    
    
    
    Welcome to nginx!
    

    If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

    For online documentation and support please refer to nginx.org.
    Commercial support is available at nginx.com.

    Thank you for using nginx.

  • 部署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                                 
           2 days ago          /bin/sh -c set -eux;   savedAptMark="$(apt-m…   20.2MB                       
           3 days ago          /bin/sh -c set -eux;   arch="$(dpkg --print-…   343MB                          
           3 days ago          /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B                            
           3 days ago          /bin/sh -c set -eux;  apt-get update;  apt-g…   11.3MB              
           4 days ago          /bin/sh -c apt-get update && apt-get install…   152MB               
           4 days ago          /bin/sh -c set -ex;  if ! command -v gpg > /…   18.9MB              
           4 days ago          /bin/sh -c set -eux;  apt-get update;  apt-g…   10.7MB                           
           4 days ago          /bin/sh -c #(nop) ADD file:c03517c5ddbed4053…   124MB
Docker镜像加载原理

bootfs(boot file system),包括bootloader和kernel,bootloader主要是引导加载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目录下,已经创建了conf和data目录,并且完成了数据的同步

利用本地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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5690296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存