docker 知识点整理

系统启动docker
systemctl start docker
系统关闭docker
systemctl stop docker
查看docker安装的镜像
docker images
查看运行的docker容器
docker ps
查看所有docker容器
docker ps -a

yum安装docker
yum install -y docker
查看是否安装完成
yum list installed |grep docker
查看当前的docker服务
systemctl status docker
查看docker版本
docker version


查看远程docker
docker search mysql

拉取镜像mysql
docker pull mysql:指定版本
查看本地镜像
docker images


换镜像拉取地址
vi /etc/docker/daemon.json

{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

删除容器(需要先停止容器)

docker rm 容器id或者容器名称
删除镜像
docker rmi mysql:5.7 镜像名称+版本

docker rmi imageId

创建容器
docker run  
-i 表示运行容器
--name 名字
-p 暴露出的端口  前面是宿主机的端口,后面是容器的duankou 
-P 大写P 是映射宿主机随机端口
-d 后台运行  会创建一个守护石容器在后台运行, 如果只加 -it 创建容器会直接进入到容器中
-v 表示目录映射关系 前者是宿主机目录 后者是映射到宿主机上的目录  可以使用多个 -v做多个目录或文件映射 
-t  可以为容器重新分配一个伪输入终端
docker run   运行并进入


docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag  //正确
参数解释
-p : 端口映射
--name: 给容器命名
-e :指定密码
-d :选择镜像

运行docker容器
docker exec -it fe bash 


将我们使用的docker的用户添加到docker组中

将一个已有用户 username 增加到一个已有用户组 docker 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod 指令。-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。不过需要与 -G 选项配合使用:

sudo usermod -a -G docker username


如果要同时将 username 的主要用户组改为 docker,则直接使用 -g 选项
usermod -g docker username


镜像和容器的关系   就是类和对象的关系   镜像就相当于模板   容器才是真正运行的东西

镜像分层 是什么?

多个容器都公用一个阉割版的linux    

举例  docker pull redis   会拉取很多东西 ,比如其中有一个是c语言的环境  那么以后拉取其他容器也需要c语言的环境,那就不需要再进行拉取c语言的环境的

Volume数据卷
容器既然运行起来,跑起来就会产生数据 容器是很容易丢失的  作用就是用来保存数据的,  可以让容器里面的数据映射到宿主机上面  运行容器的时候可以指定映射


Registy 注册中心
Docker hub是一个用于管理公共镜像的好地方,

我们可以使用registry镜像来构建一个容器,搭建我们的私有仓库服务

docker pull registry  可以构建局域网仓库


容器相关命令

查看本机容器
docker ps -a

查看本机运行的容器
docker ps 

查看过滤容器
docker ps -f  name=value


守护进程创建
docker run   -di  --name mynginx  -p 80:80 nginx

如何进入
 docker exec -it mynginx  /bin/bash


文件拷贝
宿主机到容器
docker cp  需要拷贝的文件或者目录  容器名称:容器目录
容器到宿主机

docker cp 容器名称:容器目录    需要拷贝的文件或目录


目录挂载

我们可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到数组及,实现备份功能

但是容器被删除的时候,宿主机的内瓤不会被删除,如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会收到影响

容器和宿主机之间的数据卷属于引用的关系,数据源是从外界挂载到容器内部中,所以可以脱离容器的生命周期而独立存在,正式由于数据卷的生命周期不等同于容器的生命周期,在容器退出或者删除以后,数据卷不会收到影响,

创建容器添加-v参数  格式为宿主机目录:容器目录

例如
docker run -di -v /mydata/docker_centos/data :/usr/local/data --name centos7-01 centos:7
多目录挂载
docker run -di -v /宿主机目录:/容器目录  -v /宿主机目录2:/容器目录2  镜像名


如果挂在时候出现权限不足的情况, 是因为centos中安全模块SELinux把权限禁用掉了,  通过 --privileged=true  给该容器加权限来解决挂载目录没有权限的问题

匿名挂载 (不关心容器中的文件具体挂载到了宿主机的哪个地方)

匿名挂载只需要写容器目录即可 
容器外对应的目录会在var/lib/docker/volumes中生成

docker run -di -v /usr/local/data --name centos7-02 centos:7


docker 修改配置信息 来修改目录卷

docker inspect 容器名称  里面有个"Mounts" 修改信息

容器详细配置信息目录
var/lib/docker

具名挂载

就是指定镜像挂载的位置  docker run -di -v docker_nginx_data :/usr/local/data --name nginx06 nginx
到  var/lib/docker/volumes/中就会有一个docker_nginx_data文件夹

docker在挂载的时候还能设置权限

只读 只能通过宿主机内容实现对容器的数据管理
docker run -it -v /宿主机目录 :/容器目录 :ro 镜像名

读写 默认 
docker run -it -v


挂载继承
volunes-form

容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data :/usr/local/data --name centos7-01 centos:7

容器 centos7-05 相当于继承centos01容器的挂载目录

docker run -di --volums-from centos7-01 --name centos7-05 centos:7


查看目录卷详细信息
docker volume inspect docker_nginx_data

查看容器ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名

docker inspect 容器名称|容器id
也可以使用


docker inspect nginx07  查看NETworks 信息

构建一个镜像
docker commit :从容器创建一个新的镜像
docker build: 配合Dockerfile文件创建镜像

docker commit
目标  通过基础镜像centos7 在该镜像中安装jdk和tomcat以后 将其制作成为一个新的镜像mycentos:7

1.创建容器

docker pull centos:7

docker run -di --name mycentos centos:7

2.拷贝资源
将宿主机上的jdk和tomcat拷贝到容器
docker cp xxxx  mycentos:/root
docker cp xxx mycentos:/root


3.解压文件

4.构建镜像
docker commit -a = "chenchen" -m ="这是构建信息" 容器名称  目标镜像名称
-a 作者
-m "构建信息"

5.docker images 查看

6.基于创建的镜像  生成一个带有jdk的容器

docker run -di --name 容器名 镜像名:tag

docker file 常用命令

1。From 语法 FROM <image>:<tag> 指明构建的新镜像来自于哪个基础镜像,如果没有选择tag 那么默认为latest

如果不以任何镜像为基础 那么写法为 FROM scratch     官方说明scratch镜像是一个空镜像

2.MAINTAINER(deprecated)
语法 MAINIAINER <name>  知名镜像维护者以及连接方式  过时 推荐LABEL

3. LABEL  <KEY>=<VALUE> <KEY>=<VALUE>
 功能是为镜像指定标签,也可以使用LABEL指定镜像作者

 4.RUN
 RUN <command>

 构建镜像时运行的Shell脚本, 比如构建的新镜像中我们想在/usr/local目录下创建一个java目录

 RUN mkdir -p /usr/local/java

 5 ADD 拷贝资源
 
 ADD <src> ....<dest>
 拷贝文件或目录到镜像中 src可以是一个本地文件按或者是一个本地压缩文件,压缩文件会自动解压,还可以是一个url 如果吧src携程一个url 那么ADD就类似与wget 然后自动下载和解压

 ADD jdk-11.0.tat.gz  /usr/local/java

 6.COPY
 拷贝我呢见或者目录到镜像中,不支持自动下载和解压

 7.EXPOSE 暴露容器中端口给外部,可以指定端口是监听TCP还是UDP 默认是TCP
 EXPOSE 80 443 8080/tcp   
 如果想让容器与宿主机的端口有因施工和关系,必须在容器启动的时候加上-P 参数

 8 ENV
 语法 ENV <key><value 添加单个  ENV <KEY>=<VALUE> 添加多个

设置容器内环境变量

ENV JAVA_HOME /usr/local/java/jdk-11.0.6

9CMD
语法:

CMD ["executable"  "param1","param2"]  比如 CMD ["./usr/local/tomat/bin/catalina.sh","run"]

CMD ["param1","param2"] 比如 CMD ["echo","$JAVA_HOME"]

CMD command param1 param2  比如 CMD echo $JAVA_HOME

启动容器时执行的Shell命令 在Dockerfile中只能有一条CMD命令 如果设置了多条CMD 只有最后一条会生效

 CMD echo $JAVA_HOME
如果创建容器的时候指定了命令 则CMD命令会被替代 假如镜像叫centos:7 创建容器的命令是 docker run -it --name centos7 centos:7 echo "helloworld"
或者 docker run -it --name centos7 centos:7 /bin/bash 就不会输出$JAVA_HOME的环境变量信息了,因为CMD命令被 "echo helloworld"  "bin/bash" 覆盖了 

10 ENTRYPOINT entrypoint

ENTRYPOINT ["executable"  "param1","param2"]  比如 ENTRYPOINT ["./usr/local/tomat/bin/catalina.sh","run"]

ENTRYPOINT ["param1","param2"] 比如 ENTRYPOINT ["echo","$JAVA_HOME"]

ENTRYPOINT command param1 param2  比如 ENTRYPOINT echo $JAVA_HOME

和CMD命令一样,只是指令不会被覆盖

如果Dockerfile中 同时写了 CMD 和 ENTRYPOINT 并且CMD指令不是一个完整的可执行命令 那么CMD指定的内容将会作为ENTRYPOINT的参数
如果Dockerfile中  同时写了CMD 和 ENTRYPOINT 并且CMD指令是一个完整的可执行命令 那么他两个会相互覆盖, 谁在后面谁生效


11 WORKDIR 设置一个工作目录

WORKDIR  /usr/local 默认进来的目录

12 VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器, 一般场景为需要持久化存储数据时
容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷 匿名卷在宿主机的 /var/lib/docker/volumes 目录下

一般不会在Dockerfile中用到,更常见的还是在docker run 的时候通过-v指定数据卷

容器必须有前台任务在执行,否则直接退出  run 会阻塞展示  

构建DockerFile

docker build -f  /usr/local/dockerfile/Dockerfile  -t mycentos:7 /资源位置

-f 指定dockefile文件位置
-t 指定创建的镜像的名字

mkdir -p usr/local/docker-nginx
 
 vi docker-compose.yml

#描述Compose文件的版本信息
 version:"3.8"
 #定义服务,可以多个
 services:  
     nginx: #服务名称
       image:nginx #创建容器时所需要的镜像
       container_name: mynginx #容器名称, 默认为"工程名称_服务条目名称_序号"
       ports: #宿主机与容器的端口映射
        -"80:80" #左边宿主机端口:右边容器端口
       networks: #配置容器连接的网络,引用顶级networks下的条目
        -nginx-net

#定义网络,可以多个,如果不声明,默认会创建一个网络名称为"工程名称_default"的bridge网络
networks:
    nginx-net: #一个具体网络的条目名称
        name:nginx-net #网络名称,默认为"工程名称_网络条目名称"
        driver:bridge #网络模式,默认为bridge

https://vuepress.mirror.docker-practice.com/

docker-compose up 创建并启动所有服务,这个简单的案例只有一个Nginx
前台启动 docker-compose up
后台启动
docker-compose up -d 

docker-compose down 删除容器,移除网络


用docker-compose搭建redis集群
1.编写Redis配置文件
2.编写Docker-compose文件

version:"3.8"

services:
    redis-6371:
        image:redis
        container_name:redis_6371
        restart:always
        network_mode:"host"
        volumes:
            - /usr/local/docker-redis/redis-cluster/6371/config/redis.conf:/usr/lcoal/etc/redis/redis.conf
            -/usr/local/docker-redis/redis-cluster/6371/data:/data
        command:redis-server /usr/local/etc/redis/redis.conf #覆盖容器启动后默认执行的命令

    redis-6372:
        image:redis
        container_name:redis_6372
        restart:always
        network_mode:"host"
        volumes:
            - /usr/local/docker-redis/redis-cluster/6372/config/redis.conf:/usr/lcoal/etc/redis/redis.conf
            -/usr/local/docker-redis/redis-cluster/6372/data:/data
        command:redis-server /usr/local/etc/redis/redis.conf #覆盖容器启动后默认执行的命令


3.创建集群

Swarm概念
Docker Swarm 是Docker官方推出的容器集群管理工具,基于go语言实现,使用它可以将多个Docker主机封装为单个大型的虚拟docker主机,快速打造一套容器云平台

docker swarm 是生产环境中运行docker应用程序最简单的方法,作为容器集群管理器,Swarm最大的优势之一就是100%支持标准呢的Docker API 
各种基于表中API的工具比如 compose docker_py 各种管理软件,甚至docker本身等都可以很容易的与Swarm进行集成,Swarm内置了对Docker网络插件的支持,用户可以很容器的部署跨主机的容器集群服务

和Compose一样, 都是Docker官网编排工具,但不同的是, Docker Compose是一个在单个服务器或主机上创建多个容器的工具,而docker Swarm则可以咋多个服务器或主机上创建容器集群服务,对于微服务的部署,显然docker swarm会更加适合。 如果数量巨大 ,建议使用k8s

 一个Swarm由多个主机组成,以Swarm集群模式运行,Swarm集群由manager节点(管理者角色,管理成员和委托任务)和worker节点(工作者角色,运行Swarm服务)组成,这些Docker主机有些是Manager节点,有些是Worker节点,或者同时扮演这两种角色。


  Swarm创建服务的时候,需要指定要使用赶得及ing想,在运行的容器中执行的命令,定义其副本的数量,可用的网络和数据卷,将服务公开给外部的端口等等,与独立容器相比,群居服务的主要优势之一是,你可以修改服务的配置,包括它所连接的网络和数据卷,而不需要手动重启服务,还有就是如果一个worker node 不可用了,Docker会调用不可用的Node的task任务到其他nodes上。

 Nodes 
  Swarm集群由Manager阶段和worker节点组成, 一个节点就是Swarm集群中的一个示例,也就是一个Docker主机,你可以运行一个或者多个节点在单台物理机上或云服务器上,但是生产环境上,典型的部署方式是 Docker节点交叉分布式部署在堕胎物理机或云主机上,节点名称默认为机器的hostname

  Manager  负责整个集群的管理工作,包括集群配置,服务管理,容器编排等所有跟集群有关的工作,他会选举出一个leader来指挥编排任务

  worker 工作节点接受和执行从管理节点分派的任务(task)运行在相应的服务(services)上


  Services and Task

  服务是一个抽象的概念,是对要在管理节点或者工作节点上执行的任务的定义,他是集群胸痛的中心结构,是用户与集群交互的主要根源,Swarm创建服务是,可以为服务定义以下信息:
  服务名称:
  使用哪个镜像来创建容器
  要运行多少个副本
  服务的容器要连接到哪个网络上
  要映射哪些端口

  任务 包括一个docker 容器和在容器中运行的命令,任务是一个集群的最小单元,任务与容器是一对一的关系,管理节点根据服务规模中设置的副本数量将任务分配给工作节点, 一旦任务被非陪到一个节点,便无法移动到另一个节点,他只能在分配的节点上运行或失败

  Reolicated and global services 副本和全局 服务

   swarm 提供了节点的弹性扩容和缩容,

   副本服务,当服务需要动态扩容是,只需要通过scale参数或者--replicas n参数指定运行相同任务的数量,即可复制出新的副本,将一系列复制任务分发至各节点当中,这种操作成为副本服务

   全局服务, 可以通过 --mode global 参数将服务分发至全部节点智障,这种操作我们成为全局服务,在每个节点上运行一个相同的任务,不需要预先指定任务的数量,每增加一个节点到Swarm中,协调器就会创建一个任务,然后调度器把任务分配给新的节点


   Overlay网络(虚拟化产生的技术)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值