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目录下内容拷贝至宿主机,再进行宿主机与容器之间的挂载,这样容器与宿主机间的数据关系就同步了。

  • 配置步骤:

    1. 安装镜像并运行容器

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

      $ docker cp  容器id:/usr/local/tomcat/conf  /home/tomcat/
      $ docker cp 容器id::/usr/local/tomcat/webapps /home/tomcat/
    3. 把容器里的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/ 镜像名称
    4. 配置tomcat server.xml 以及 同步上传war包

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

Docker 配置 MySQL

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

  • 安装步骤:

    1. 拉取需要的MySQL镜像

      $ docker pull mysql:5.7
    2. 创建宿主机挂载目录,存储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/
    3. 创建并运行容器,端口指定,目录挂载

      $ 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
    4. 用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 来查看下默认生成的容器卷对应的宿主机目录,通过新建文件和 修改,实现容器卷同步

Docker 专题总结的更多相关文章

  1. docker专题(2):docker常用管理命令(上)

    http://segmentfault.com/a/1190000000751601 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备 ...

  2. docker专题 从入门到放弃

    1.docker是什么 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚 ...

  3. Docker镜像与容器命令 专题

    https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html docker的工作流程图: 至少需要配备三样东西去使用doc ...

  4. 🏆【CI/CD技术专题】「Docker实战系列」(1)本地进行生成镜像以及标签Tag推送到DockerHub

    背景介绍 Docker镜像构建成功后,只要有docker环境就可以使用,但必须将镜像推送到Docker Hub上去.创建的镜像最好要符合Docker Hub的tag要求,因为在Docker Hub注册 ...

  5. Linux下Docker安装

    1 在 CentOS 6.4 上安装 docker   docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172).   docker官方文档说要求 ...

  6. Docker技术学习

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/1598249 貌似Doc ...

  7. spring cloud 专题一 (spring cloud 入门搭建 之 Eureka注册中心搭建)

    一.前言 本文为spring cloud 微服务框架专题的第一篇,主要讲解如何快速搭建spring cloud微服务及Eureka 注册中心 以及常用开发方式等. 本文理论不多,主要是傻瓜式的环境搭建 ...

  8. spring cloud 专题二(spring cloud 入门搭建 之 微服务搭建和注册)

    一.前言 本文为spring cloud 微服务框架专题的第二篇,主要讲解如何快速搭建微服务以及如何注册. 本文理论不多,主要是傻瓜式的环境搭建,适合新手快速入门. 为了更好的懂得原理,大家可以下载& ...

  9. ubuntu 15 安装docker

    最近听说Docker很火,不知道什么东西,只知道是一个容器,可以跨平台.闲来无事,我也来倒弄倒弄.本文主要介绍:Ubuntu下的安装,以及基本的入门命令介绍:我的机器是Ubuntu 15.04 64位 ...

随机推荐

  1. Pymongo 笔记

    Pymongo 1.MongoDB概念 MongoDB是一种非关系型数据库(NoSQL),MongoDB数据存储于内存,内存不足则将热度低数据写回磁盘.存储的数据结构为文档.每个数据库包含若干集合(c ...

  2. u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植

    网卡芯片的工作原理 DM9000AE具有以下主要性能: ①48管脚的LQFP封装,管脚少体积小: ②支持8/16位数据总线: ③适用于10Base-T和100Base-T,10/100M自适应,适应不 ...

  3. USB2.0协议学习笔记---描述符

     USB设备描述符 字段名 长  度(字节)  地址偏移 含           义 bLenth   1  0  描述符长度 bDescriptorType   1  1 描述符类型 (这里为 1) ...

  4. Windows中VS code无法查看C++ STL容器的值 - 解决方法

    Windows中VS code debug时无法查看C++ STL容器内容 首先,你很可能用的是x64版本的Windows. 我发现一个有效的解决方法,但在x64版本的Windows上安装MinGW时 ...

  5. JavaScript 词法 All In One

    JavaScript 词法 All In One JavaScript 词法 这部分描述了JavaScript 的词法(lexical grammar). ECMAScript 源码文本会被从左到右扫 ...

  6. GitHub SSH key

    GitHub SSH key https://help.github.com/en/github/authenticating-to-github steps HTTPS clone !== SSH ...

  7. how to read the system information by using the node cli tool?

    how to read the system information by using the node cli tool? node cli & get system info demos ...

  8. .dmg & .pkg & .ipa

    .dmg & .pkg & .ipa Apple, macOS, iOS .dmg mysql-8.0.21-macos10.15-x86_64.dmg https://dev.mys ...

  9. AIoT & IoT

    AIoT & IoT Artificial Intelligence of Things Internet of Things AIoT === AI + IoT 人工智能物联网 === 人工 ...

  10. React-Native Tutorials

    React-Native Tutorials https://egghead.io/courses/react-native-fundamentals part free https://egghea ...