您的位置:首页 > 运维架构 > Docker

Docker 专题总结

2021-03-16 21:49 399 查看

Docker 专题总结

Docker 的基本命令

  • 启动 Docker

    $ systemctl start docker
  • 停止Docker

    $ systemctl stop docker
  • 重启Docker

    $ systemctl restart docker
  • 开启自启动Docker

    $ systemctl enable docker
  • 查看Docker的概要信息

    $ docker info
  • 查看Docker的帮助文档

    $ docker --help
  • 查看Docker的版本信息

    $ docker version

Docker 镜像的常用命令

  • docker images 列出本机所有镜像

    $ docker images

    列出本机所有镜像 :

    标签 说明
    REPOSITORY 镜像的仓库源
    TAG 镜像的标签(版本)同一个仓库有多个TAG的镜像,多个版本;我们用REPOSITORY:TAG来定义不同的镜像;
    IMAGE ID 镜像ID,镜像的唯一标识
    CREATE 镜像创建时间
    SIZE 镜像大小

    列出镜像可选参数

    OPTIONS 可选参数:
    -a 显示所有镜像(包括中间层)
    -q 只显示镜像ID
    -qa 可以组合
    --digests 显示镜像的摘要信息
    --no-trunc 显示完整的镜像信息
  • docker search 搜索镜像

    $ docker search

    https://hub.docker.com/ 这里的搜索效果一样;

    OPTIONS可选参数:

    可选参数 说明
    --no-trunc 显示完整的镜像描述
    -s 列出收藏数不小于指定值的镜像
    --automated 只列出Docker Hub自动构建类型的镜像
  • docker pull 下载镜像

    docker pull 镜像名称:[TAG]

    注意:不加TAG,默认下载最新版本latest

  • 删除单个镜像

    # 1,删除单个:
    docker rmi 镜像名称:[TAG]

    如果不写TAG,默认删除最新版本latest

    有镜像生成的容器再运行时候,会报错,删除失败;

    我们需要加 -f 强制删除

  • docker rmi -f 镜像名称1:[TAG] 镜像名称2:[TAG]

    $ docker rmi -f 镜像名称1:[TAG] 镜像名称2:[TAG]
  • 删除全部

    $ docker rmi -f $(docker images -qa)

Docker容器常用命令

  • 查看正在运行的容器

    $ docker ps [OPTIONS]
    
    $ docker ps 查看正在运行的容器
    
    $ docker ps -a 查看所有容器
    
    $ docker ps -n 2  显示最近创建的2个容器
    
    $ docker ps -f status=exited 查看停止的容器

    OPTIONS说明:

    -a :显示所有的容器,包括未运行的。

    -f :根据条件过滤显示的内容。

    --format :指定返回值的模板文件。

    -l :显示最近创建的容器。

    -n :列出最近创建的n个容器。

    --no-trunc :不截断输出。

    -q :静默模式,只显示容器编号。

    -s :显示总的文件大小。

  • 容器停止退出

    $ exit  	#容器停止退出
    $ ctrl + P + Q   #容器不停止退出
  • 进入容器

    $ docker attach 容器ID or 容器名
  • 启动容器

    $ docker start 容器ID or 容器名
  • 重启容器

    $ docker restart 容器ID or 容器名
  • 停止容器

    $ docker stop 容器ID or 容器名
    
    #暴力删除,直接杀掉进程 (不推荐)
    docker kill 容器ID or 容器名
  • 删除容器

    $ docker rm 容器ID
    
    #如果删除正在运行的容器,会报错,我们假如需要删除的话,需要强制删除;
    $ docker rm -f 容器ID
    
    #删除多个容器
    $ docker rm -f 容器ID1  容器ID2 中间空格隔开
    
    #删除所有容器
    docker rm -f $(docker ps -qa)
  • docker宿主机和容器间文件拷贝

    #宿主机文件 copy to 容器内
    docker cp 需要拷贝的文件或者目录   容器名称:容器目录
    # 比如 docker cp /home/data/001.jpg 6498bcb8d66f /home/data/001.jpg
    
    #容器内 copy to 宿主机
    docker cp 容器名称:容器目录    宿主机目录
  • docker 查看容器日志

    $ docker logs [OPTIONS] CONTAINER
    #也可以去docker日志文件目录查找,docker日志文件目录 /var/lib/docker/containers/

    Options:

    --details 显示更多的信息

    -f, --follow 跟踪实时日志

    --since string  显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    
    --tail string  从日志末尾显示多少行日志, 默认是all

    -t, --timestamps 显示时间戳

    --until string  显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
  • docker 查看容器进程

    $ docker top 容器ID
  • docker 进入容器执行命令,直接操作容器,执行完 回到 宿主主机终端;

    我们一般用于 启动容器里的应用 比如 tomcat nginx redis elasticsearch等等

    $ docker exec -it 容器名称 或者 容器ID /bin/bash
  • 提交运行时容器成为镜像

    docker commit -a='作者' -m='备注' 运行时容器ID 新镜像名称
  • 容器端口映射

    # 端口映射;
    $ docker run -it -p 8888:8080 镜像ID
    $ docker run -it -P 镜像ID
  • 创建并启动容器

    $ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    # 启动普通容器
    $ docker run --name 别名 镜像ID
    # 启动交互式容器 运行一个容器 取别名 交互模式运行 以及分配一个伪终端
    $ dokcer run -it --name 别名 镜像ID
    # 守护式方式创建并启动容器,执行完命令后,终端依然再宿主机上;
    $ docker run -di --name 别名 镜像ID
    #启动容器,并执行/bin/bash命令;
    $ docker run -it --name 别名 镜像ID  /bin/bash命令

    --name="容器新名字":为容器指定一个名称;

    -i:以交互模式运行容器,通常与-t或者-d同时使用;

    -t:为容器重新分配一个伪输入终端,通常与-i同时使用;

    -d: 后台运行容器,并返回容器ID;

    -P: 随机端口映射,容器内部端口随机映射到主机的端口

    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

Docker目录挂载

  • 简介:容器目录挂载,我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以实现宿主机和容器目录的双向自动同步;

  • 作用:前面的 cp 命令来实现数据传递,这种方式比较麻烦;我们通过容器目录挂载,能够轻松实现代码上传,配置修改,日志同步等需求;

  • 语法:

    #单个目录挂载
    $ docker run -it -v  /宿主机目录:/容器目录 镜像名
    
    #多个目录挂载
    $ docker run -it -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2  镜像名
    
    #挂载目录只读:
    $ docker run -it -v  /宿主机目录:/容器目录:ro 镜像名

注意:

如果同步的是多级目录,可能会出现权限不足的提示;

这是因为Centos7中的安全模块selinux把权限禁掉了,我们需要在启动命令后添加 --privileged=true 来解决挂载的目录没有权限的问题;

Docker tomcat端口映射的坑

问题描述:启动容器后,外网无法映射访问 Tomcat

排查思路:

  1. 查看firewall-cmd --state,添加策略对外打开指定的端口

    #查看
    firewall-cmd --list-ports
    firewall-cmd --list-services
    
    #添加策略
    firewall-cmd --add-port=5000/tcp --permanent
    firewall-cmd --remove-port=5000/tcp --permanent
    firewall-cmd --reload
  2. 查看 sysctl net.ipv4.ip_forward 是否转发 0-未转发 1-转发

  3. 查看容器 tomcat的 webapp目录下是否存在文件,讲webapp.dist目录内文件 拷贝至wepapp

Docker 配置 Tomcat

  • 配置思路:先进行镜像的拉取安装,然后指定端口启动并进入容器。在本地建立Tomcat 同级目录,并将容器Tomcat目录下内容拷贝至宿主机,再进行宿主机与容器之间的挂载,这样容器与宿主机间的数据关系就同步了。

  • 配置步骤:

      安装镜像并运行容器

      $ docker pull tomcat:8.5.31
      $ docker run -di -p 8888:8080 镜像id
    1. 宿主机里home目录下新建tomcat目录,复制容器里conf,webapps到宿主机

      $ docker cp  容器id:/usr/local/tomcat/conf  /home/tomcat/
      $ docker cp  容器id::/usr/local/tomcat/webapps  /home/tomcat/
    2. 把容器里的tomcat里的webapp,logs,conf挂载到宿主机tomcat目录下,方便上传代码,同步持久化日志,以及方便配置tomcat;关掉容器,启动容器;

      $ docker run -d --name 容器名称 -p 80:8080 -v /home/tomcat/conf/:/usr/local/tomcat/conf/
      -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/
      -v /home/tomcat/logs/:/usr/local/tomcat/logs/ 镜像名称
    3. 配置tomcat server.xml 以及 同步上传war包

      <Context path="" docBase="/usr/local/tomcat/webapps/WebTest" debug="0" reloadable="true" />

Docker 配置 MySQL

  • 简介:docker安装MySQL 和 安装Tomcat 差不太多,这边主要介绍下配置思路

  • 安装步骤:

      拉取需要的MySQL镜像

      $ docker pull mysql:5.7
    1. 创建宿主机挂载目录,存储MySQL配置文件、数据文件及相关日志信息

      $ docker cp  容器id:/etc/mysql/conf.d  /home/mysql/
      $ docker cp  容器id:/var/log  /home/mysql/
      $ docker cp  容器id:/var/lib/mysql  /home/mysql/
    2. 创建并运行容器,端口指定,目录挂载

      $ docker run -p 3306:3306  -d  -v /etc/mysql/conf.d/:/home/mysql/conf/
      -v /var/log:/home/mysql/log/   -v /var/lib/mysql/:/home/mysql/mysql/
      -e MYSQL_ROOT_PASSWORD=123456  镜像ID
    3. 用sqlyog连接docker里的数据库,导入sql脚本

  • 注意事项:

    运行的项目里的数据库连接地址,要写docker里的mysql容器所在的虚拟IP地址;容器间通信IP;

    # 查看 inspect中的  "IPAddress": "172.17.0.2" 信息 项目中locahost 替换为容器IPAddress 地址
    $ docker inspect 容器ID

Docker迁移与备份

  • 大公司开发过程中,经常自定义镜像,然后commit提交成镜像到本地仓库,但是我们发布到客户服务器的时候,可以用前面讲得发布到hub官方,或者阿里云,但是有些机密性的项目,是禁止公网存储的,所以我们只能通过docker镜像备份和迁移实现。

  • 实现方式:

    #备份镜像
    $ docker save -o 备份镜像的名称  源镜像名称:tag版本
    比如: $ docker save -o mytomcat7.1.tar java1234/tomcat7:7.1
    
    #将打好的tar 进行sftp或网络传输 可实现自定义镜像的恢复
    $ docker load -i 镜像文件
    比如:$ docker load -i mytomcat7.1.tar

DockerFile

  • 简介:

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建的一个新镜像;通过用手工的方式,修改配置文件,或者添加,删除文件目录的方式,来构建一种新镜像;这种手工方式麻烦,容易出错,而且不能复用;Dockerfile使用脚本方式来构建自动化,可复用的,高效率的创建镜像方式,是企业级开发的首选方式;

    在软件系统开发生命周期中,采用Dockerfile来构建镜像;

    1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;

    2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;

    3、对于运维人员:在部署时,可以实现应用的无缝移植。

  • DockerFile常用指令

    #定义了使用哪个基础镜像启动构建流程
    FROM image_name:tag
    
    #声明镜像维护者信息
    MAINTAINER user_info
    
    #设置环境变量(可以写多条)
    ENV key value
    
    #构建容器时需要运行的命令(可以写多条)
    RUN command
    
    #设置终端默认登录进来的工作目录
    WORKDIR path_dir
    
    #当前容器对外暴露出的端口
    EXPOSE port
    
    #将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    ADD source_dir/file dest_dir/file
    
    #和ADD相似,但是如果有压缩文件是不能解压
    COPY source_dir/file dest_dir/file
    
    #创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
    VOLUME
    
    #指定容器启动时要运行的命令,假如有多个CMD,最后一个生效
    CMD
    
    #指定容器启动时要运行的命令
    ENTRYPOINT
    
    #当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以把ONBUID理解为一个触发器。
    ONBUILD
  • DockerFile构建自定义CentOS

    #第一步:编写DockerFile
    
    FROM centos
    MAINTAINER zhangtao<zhangtao2021@126.com>
    
    LABEL name="zhangtao CentOS Image" \
    
    build-date="20210316"
    
    ENV WORKPATH /home/
    WORKDIR $WORKPATH
    
    RUN yum -y install net-tools
    RUN yum -y install vim
    
    EXPOSE 80
    CMD /bin/bash
    
    #2.通过DockerFile构建镜像
    构建 docker build -f myCentosDockerFile -t zhangtao/mycentos:1.1 .
    
    #3:测试运行镜像
    运行 docker run -it 镜像ID
    
    #4.查看镜像历史
    查看镜像历史  docker history 镜像ID

DockerFile通过VOLUME实现容器卷

  • 简介:前面用启动命令 -v 宿主机目录:容器卷目录 来实现容器卷目录挂载。但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都有这样的特定目录,所以在Dockerfile定义中,只能指定容器卷目录;

  • 语法:

    #编写DockerFile
    
    FROM centos
    
    VOLUME ["/home/v1","/home/v2"]
    
    CMD /bin/bash
    
    #构建
    $ docker build -f myVolumeDockerFile -t zhangtao/myTest:1.1 .
    
    #运行
    $ docker run -it  镜像ID

    容器运行后,进入home目录,找到v1,v2两个容器卷目录;然后我们通过 docker inspect 容器ID 来查看下默认生成的容器卷对应的宿主机目录,通过新建文件和 修改,实现容器卷同步

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: