我是靠谱客的博主 微笑心锁,最近开发中收集的这篇文章主要介绍docker详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

以下笔记整理来自于bilibili狂神说Java,建议结合视频自学。

【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

-----------------------------------------------docker入门start---------------------------------------------------------

Docker使用的内核是宿主机的内核,轻便。秒级

虚拟机需要虚拟出一整套操作系统及硬件,非常庞大,笨重。分钟级

  1. 安装docker(不同系统命令不一样,以官网为准 Get Docker | Docker Documentation 

2、镜像加速器

阿里云  阿里云-上云就上阿里云

控制台 --> 产品与服务(输入 “镜像” 搜索)--> 镜像加速器 --> 拷贝命令,运行

产品与服务(输入 “镜像” 搜索)

 

镜像加速器

 

拷贝命令,直接运行即可

通过将用户添加到docker用户组可以将sudo去掉,命令如下

        sudo groupadd docker          #添加docker用户组

        sudo gpasswd -a $USER docker   #将登陆用户加入到docker用户组中

        newgrp docker                #更新用户组

3、docker服务命令

systemctl  start  docker    启动

systemctl  status  docker   查看状态

systemctl  stop   docker    停止

systemctl  restart  docker  重启

systemctl  enable  docker  开机自启动

4、docker镜像命令

docker  images    查看所有镜像

docker  images -q  查看所有镜像id

docker  search  image_name    从网络中查找需要的镜像。

docker  pull  镜像名称 : 版本号(默认lastest)   

拉取镜像,版本号可去Docker Hub 查看

删除镜像

        docker  rmi 镜像id

        docker  rmi 镜像名称 : 版本号

删除全部镜像

        docker  rmi  `docker  images  -q`

修改镜像名称

        docker  tag  IMAGE_ID  new_image_name : new_image_tag

        docker  rmi  old_image_name : old_image_tag   #删除旧的镜像,也可以不删除,看个人需            求

查看镜像历史,镜像是如何生成的(官方镜像,或者dockerfile自己生成的镜像)

        docker  history  镜像id(或者  镜像名:版本)

5、docker容器命令

创建容器

        docker  run  -it(-id)  --name=cyy_python   镜像名称:镜像版本   /bin/bash

        -i  一直保持连接(容器没有客户端连接。就开会断开)

        -t  给容器分配尾终端,可以输入命令,-it交互式容器,退出即关闭

        -d  后台运行,退出后依然在,-id守护(后台)模式运行容器,退出后依然在

        -p  指定容器的端口  -p  8080 : 8080

                -p  ip:主机端口 : 容器端口

                -p  主机端口 : 容器端口

                -p  容器端口

        -P  随机指定端口     大写P,随机指定端口

        --name=container_name  容器名称

        /bin/bash  打开shell窗口  ,也可以是其它命令,ip   ping    ls   等

docker  run  -it  --rm  tomcat : 9.0

        # 一般用来测试,容器创建,使用完自动删除

进入当前正在运行的容器

        docker  exec  -it   容器名  /bin/bash  

        docker  exec  -it  -u  root  容器名  /bin/bash   (root身份进入docker容器)

        #  exec进入容器后开启一个新的终端,可以在里面 操作(常用)

        docker  attach  容器id  

        #  attach进入容器正在执行的终端,不会启动新的进程!

退出容器

        Exit                  #停止容器并退出

        Ctrl  +  P  + Q  #不停止容器退出

查看正在运行的容器

        docker  ps

查看所有容器

        docker  ps  -a

查看容器id

        docker  ps  -q

查看最近创建的容器,前5个

        dockers  ps  -n=5

启动容器

        docker  start  container_name

        docker  restart  container_name    #重启

停止当前正在运行的容器  

        docker  stop  container_name

强制停止当前容器

        docker  kill  container

删除容器(正在运行的容器不能删除,先停后删)     -f  强制删除

        docker  rm  container_name(container_id)  

删除所有容器

        docker  rm  `docker  ps  -aq`

        或者  docker  ps  -a  -q  |  xargs  docker  rm

其它常用命令

        docker  run  -d  镜像名       #后台运行

       #  Docker容器使用后台运行就必须要有一个前台进程,docker发现没有应用,就会 自动停             止。

        显示日志

        docker  logs  -tf  --tail  num    容器id

                -tf      #显示日志

                --tail    #要显示的条数

        查看容器的进程信息  top命令

        docker  top  容器id

        查看镜像元数据(查看容器详细信息)  inspect

        docker  inspect  container_name

        从容器内拷贝文件到主机

        docker  cp  容器id : 容器内路径  目的的主机路径

        下载的镜像缺少东西:

        阿里云镜像默认下载最小镜像,所有不必要的都剔除掉,保证最小可运行环境。

        查看docker运行中的容器的实时数据流

        docker  stats

环境配置   -e

        如mysql需要配置密码

        Docker  run  ……  -e MYSQL_ROOT_PASSWORD=myPwd  --name=……

联合文件系统

        Docker下载镜像时,会自底向上逐层下载,两个不同的镜像,其底层可能相同,docker在下

        载镜像时,不会再下载相同的层

----------------------------------------------------docker入门end------------------------------------------------------

6、docker容器的数据卷    -v

数据卷概念

        数据卷是宿主机的一个目录或文件  

        容器目录与数据卷目录绑定后,数据同步(容器内目录挂载到linux上面)  

        一个数据卷可以被多个容器同时挂载  

        一个容器可以挂载多个数据卷  

数据卷作用:

        容器数据持久化,防止删除容器时,数据也删除

        外部机器与容器间接通信

        容器之间数据交换、共享

配置数据卷  

        docker  run  ……   -v  宿主机目录(文件):容器内目录(文件) ……

        Eg: docker  run  -it  --name=c1  -v  /root/data:/root/data_container

               --privileged=true python:3.9.9-bullseye  /bin/bash  

**注意事项  

  1. 目录必须是绝对路径
  2. 目录不存在,自动创建
  3. 可以挂载多个数据卷(多个-v)

数据卷容器

1、创建启动c3数据卷容器,使用-v参数,设置数据卷(容器挂载主机)

        docker  run  -it  --name=c3  -v  /volume(名称不固定)  python:3.9.9-bullseye  /bin/bash 

2、创建启动c1、c2容器,使用--volumes-from 参数设置数据卷(容器挂载容器)

        docker  run  -it  --name=c1  --volumes-from  c3  python:3.9.9-bullseye  /bin/bash

        docker  run  -it  --name=c2  --volumes-from  c3  python:3.9.9-bullseye  /bin/bash

        # c3相当于宿主机的地位

查看所有volum的情况

        docker  volume  ls

具名挂载和匿名挂载

匿名挂载

        -v  容器内目录

具名挂载     常用

        -v  卷名:容器内路径

docker  volume  inspect  卷名    

        # 查看挂载的目录(主机) /var/lib/docker/volumes/卷名/_data  

-v  容器内路径:ro(rw)  改变读写权限,一旦设置容器权限,容器对挂载出来的内容就有限定了,ro就说明这个路径只能通过宿主机操作,不能通过容器操作,限制容器

        ro:只读       read only

        rw:可读可写   read write

8、Dockerfile(制作镜像)

docker镜像的本质是:一个分层的文件系统

制作镜像:

  1. 容器转为镜像

        docker  commit  -m=”描述信息”  -a=”作者”  容器id  目标镜像名称:版本号   

        docker  save  -o  压缩文件名称  镜像名称:版本号   (镜像转压缩文件)

        docker  load  -i   压缩文件名称   (压缩文件转镜像)  

        2、Dockerfile(常用)  

        Dockerfile是一个文本文件。

        docker  build  -f  ./dockerfile  -t  新镜像名称:新镜像版本  .(路径)  

Dockerfile 文件内容,指令(大写)  参数

        FROM  centos

        VOLUME  [“volume01” , ”volume02”]

        CMD  echo  “----end----”

        CMD  /bin/bash

构建步骤

  1. 编写一个dockerfile文件
  2. docker  build  构建成为一个镜像
  3. docker  run  运行镜像--容器
  4. docker  push  发布镜像(DockerHub、阿里云镜像仓库)

Dockerfile :      构建文件,定义了一切步骤,源代码

DockerImages :   通过Dockerfile构建生成的镜像,最终发布和运行的产品,原来是jar  war

DockerContainer : 容器就是镜像运行起来提供服务。

DockerFile指令

        FROM        # 基础镜像,一切从这里开始构建

        MAINTAINER  #  镜像作者   姓名+邮箱

        RUN         #镜像构建的时候需要运行的命令

        ADD         #步骤:tomcat镜像,这个tomcat压缩包,添加内容

        WORKDIR     #镜像的工作目录

        VOLUME      #挂载的目录

        EXPOSE       #暴露端口配置

        CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

        ENTRYPOINT   # 指定这个容器启动的时候要运行的命令,可以追加命令

        ONBUILD      #当构建一个被继承dockerfile,就会运行ONBUILD的指令,触发指令

        COPY         #类似ADD,将文件拷贝到镜像中

        ENV          #构建的时候设置环境变量

*** CMD  ENTRYPOINT 区别

CMD:

        FROM centos

        CMD ["ls","-a"]

        运行镜像  docker  run  centos_cmd_test:1.0  -l

docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

ERRO[0000] error waiting for container: context canceled

解释:cmd的请理下   -l  替换了  ls  -a  命令 ,-l不是命令,所以报错

ENTRYPOINT

        FROM centos

        CMD ["ls","-a"]

        运行镜像  docker  run  centos_cmd_test:1.0  -l

        命令追加 ls -a -l  不报错

创建一个自己的centos

  1. 编写dockerfile的文件

        FROM  centos

        MAINTAINER   chengyuyun<1686843416@qq.com>

        ENV MYPATH /home/cyy/workspace/docker

        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.通过dockerfile文件构建镜像

        docker  build  -f  dockerfile文件路径  -t  镜像名 : 版本号   .    

创建tomcat镜像

1、准备镜像文件tomcat压缩包,jdk压缩包

2、编写dockerfile

        FROM centos

        MAINTAINER  cyy<1686843416@qq.com>

        COPY readme.txt   /usr/local/readme.txt

        ADD jdk-8u321-linux-x64.tar.gz /usr/local

        ADD apache-tomcat-9.0.58.tar.gz /usr/local

        RUN yum -y install vim

        ENV MYPATH /usr/local

        WORKDIR $MYPATH

        ENV JAVA_HOME /usr/local/jdk1.8

        ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

        ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58

        ENV CATALINA_PATH /usr/local/apache-tomcat-9.0.58

        ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

        EXPOSE 8080

   CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out

发布镜像--docker  hub

  1. Docker Hub注册账号
  2. 服务器端登录  docker  login  (登出  docker  logout)
  3. docker  -u  yourUserName
  4. docker  -p  yourPwd
  5. 登录后可以提交镜像

        镜像要命名成  dockerHubUsername/XXXX:版本号

        docker  push  dockerHubUsername/mytomcat:1.0  

发布到aliyun镜像服务上面

  1. 登录aliyun    阿里云-上云就上阿里云
  2. 找到容器镜像服务
  3. 创建命名空间

        4.创建容器镜像(之后按网页提示操作)

一下内容来阿里云网页

        1. 登录阿里云Docker Registry

        $ docker  login  --username=xxx  registry.cn-hangzhou.aliyuncs.com 

        用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

        您可以在访问凭证页面修改凭证密码。

        2. 从Registry中拉取镜像

        docker  pull  registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号] 

        3. 将镜像推送到Registry

        $ docker  login  --username=xxx  registry.cn-hangzhou.aliyuncs.com 

        $ docker  tag  [ImageId] registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号] 

        $ docker  push  registry.cn-hangzhou.aliyuncs.com/空间名/仓库名:[镜像版本号] 

        请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

        4. 选择合适的镜像仓库地址

        从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

        如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

        5. 示例

        使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

$ docker images

REPOSITORY                  TAG        IMAGE ID      CREATED    VIRTUAL SIZE

registry.aliyuncs.com/acs/agent  0.7-dfb6816  37bb9c63c8b2  7 days ago  37.89 MB

$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

使用 "docker push" 命令将该镜像推送至远程。

$  docker  push  registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816 

docker  网络

        ip  addr

        lo:本机回环地址

        docker0:docker地址

        查看容器内部网络地址,容器启动的时候IP地址是docker分配的

Linux可以ping通docker容器内部

原理:

  1. 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是veth-pair技术。
  2. 容器带来的网卡,都是一对一对的。
  3. veth-pair就是一堆的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备

结论

        容器和容器之间是可以ping通的

        所有容器不指定网络的情况下,都是由docker0路由的,docker会给容器分配一个默认的可用ip

        Docker使用的是linux的桥接,宿主机中是一个docker容器的网桥  docker0

        Docker中的所有网络接口都是虚拟的,虚拟的转发效率高。

        只要容器删除,对应的网桥一对就没了

        启动容器时,--link 容器名  可以指定连接容器,指定后可以直接ping容器名,而不用 ping ip 。 不建议使用link。

        自定义网络不适用docker0

        Docker0问题:不支持容器名连接访问。

自定义网络

查看所有docker网络  docker  network  ls

网络模式

        bridge  :  桥接(默认,自己创建也使用bridge模式)

        none  :  不配置网络

        host  :   与宿主机共享网络

        container  :  容器内网络连通(用的少,局限大)

创建自定义网络(docker0的问题都解决了,可以不使用--link)

docker network create --driver bridge --subnet 192.168.0.0/16  --gateway 192.168.0.1  cyy-net

 

网络连通

把一个容器连接到网络上

        docker  network  connect  [OPTIONS]  NETWORK  CONTAINER

        docker  network  connect  cyy-net  tomcat01

连通之后将tomcat01放到cyy-net网络下

        一个容器两个ip地址

配置 Elasticsearch

        docker run -d --name=es_7.6.2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

配置 Mysql

   docker run -d -p 3310:3306 -v /home/cyy/workspace/mysql/conf:/etc/mysql/conf.d -v /home/cyy/workspace/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yourPwd --name=mysql_8    mysql:8.0

Redis集群部署

创建自定义网络

        docker  network  create  redis  --subnet  172.38.0.0/16

Shell脚本

        for port in $(seq 1 6);

        do

        mkdir -p /home/cyy/workspace/mydata/redis/node-${port}/conf

        touch /home/cyy/workspace/mydata/redis/node-${port}/conf/redis.conf

        cat << EOF >>/home/cyy/workspace/mydata/redis/node-${port}/conf/redis.conf

        port 6379

        bind 0.0.0.0

        cluster-enabled yes

        cluster-config-file nodes.conf

        cluster-node-timeout 5000

        cluster-announce-ip 172.38.0.1${port}

        cluster-announce-port 6379

        cluster-announce-bus-port 16379

        appendonly yes

        EOF

        done

开启第一个

        docker run -p 6371:6379 -p 16371:16379 --name redis-1  

        -v /home/cyy/workspace/mydata/redis/node-1/data:/data  

        -v /home/cyy/workspace/mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf  

        -d --net redis  --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

开启第二个

        docker run -p 6372:6379 -p 16372:16379 --name redis-2  

        -v /home/cyy/workspace/mydata/redis/node-2/data:/data  

        -v /home/cyy/workspace/mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf  

        -d --net redis  --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

……  把六个都开启

创建集群(先进入redis容器内)

        docker  exec  -it  redis-1  /bin/sh  

创建集群

   redis-cli  --cluster  create  172.38.0.11:6379  172.38.0.12:6379  172.38.0.13:6379 172.38.0.14:6379  172.38.0.15:6379  172.38.0.16:6379  --cluster-replicas 1 

SpringBoot微服务打包docker镜像

  1. 构建springBoot微服务项目
  2. 打包应用
  3. 编写Dockerfile,将Dockerfile与jar放在同一目录下
  4. 构建镜像  docker  build   -t  cyy:1.0    .  
  5. 发布运行  docker run -d -P --name cyy_springboot-web  cyy:1.0

Others

1、清空日志:

        cat /dev/null >/var/lib/docker/containers/containerid/containerid.log-json.log

        例:cat /dev/null >/var/lib/docker/containers/29ef21de818cbe2a25c79aa8216bfe3e5108cbe5f73ada60a1086ee44692b5c8/29ef21de818cbe2a25c79aa8216bfe3e5108cbe5f73ada60a1086ee44692b5c8-json.log

containerid:全id,docker ps 只能看到部分,cd /var/lib/docker/containers/ 看全部id

2、日志导出文件

        docker logs --since=”startTime”  容器id >> fileName.log

        例:docker logs --since=”20200416”  容器id >> fileName.log

3、docker服务重启

       service docker restart

容器内部分命令无法使用

Docker容器内无法使用vim

  1. root身份进入docker容器docker  exec  -it  -u  root  容器名  /bin/bash(如果容器未启动,先启动容器,再进入 docker  start  container_id)
  2. vim: command not found,-->  安装vim    apt-get install vim

可是当你敲apt-get install vim命令时,提示:

            Reading package lists... Done

            Building dependency tree       

            Reading state information... Done

            E: Unable to locate package vim

  1. apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和

/etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

  1. apt-get install vim

Docker 容器无法使用ll(ls  -a)命令

        1. vim ~/.bashrc

        2. 加入一行   alias ll='ls $LS_OPTIONS -l'   保存退出

        3. source ~/.bashrc

Docker 容器内无法运行ip、ping命令,进入容器

        apt-get update

        apt-get install -y iproute2    # 装ip

        apt install iputils-ping          # 装ping

docker添加用户到用户组(切换到管理员身份)

sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组

最后

以上就是微笑心锁为你收集整理的docker详解的全部内容,希望文章能够帮你解决docker详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部