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. JavaScript事件:事件处理模型(冒泡、捕获)、取消冒泡、阻止默认事件

    (一)事件处理模型---事件冒泡.捕获 (1)事件冒泡 24 <body> 25 <div class="warpper"> 26 <div clas ...

  2. springboot demo(二)web开发demo

    如入门般建立项目,引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</g ...

  3. 大数据开发-linux后台运行,关闭,查看后台任务

    在日常开发过程中,除了例行调度的任务和直接在开发环境下比如Scripts,开发,很多情况下是shell下直接搞起(小公司一般是这样),看一下常见的linux后台运行和关闭的命令,这里做一个总结,主要包 ...

  4. 编程方式建视频——GitHub 热点速览 v.21.07

    作者:HelloGitHub-小鱼干 假期过半,大家过得如何,吃好喝好了吗?GitHub 很好!本周的 GitHub Trending 又上爆款项目--github1s 装完之后,一秒 GitHub ...

  5. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  6. css background transparent All In One

    css background transparent All In One opacity ul { max-height: 100px; /* max-height: 187px; */ overf ...

  7. shit leetcode edge testcases

    shit leetcode edge testcases Merge Intervals try "use strict"; /** * * @author xgqfrms * @ ...

  8. 为什么说USDN是一种应用型稳定币?

    USDN是由NGK Global出品的一种新型稳定币系统,里面是涵盖了包括货币供需.Bancor.抵押借贷等在内的一整套算法.该稳定币构想一经提出,便在社区引发了不小的热度. 官方对于USDN的定位是 ...

  9. CPU飙升的问题

    本文转载自CPU飙升的问题 问题发现 事情是这样的,最近小码仔负责的项目预定今天凌晨2点上进行版本更新.前几天测试小姐姐对网站进行压力测试,观察服务的CPU.内存.load.RT.QPS等各种指标. ...

  10. 代码小知识之UUID

    1.生成UUID(UUID保证对在同一时空中的所有机器都是唯一的,UUID的唯一缺陷在于生成的结果串会比较长.UUID 来作为数据库数据表主键是非常不错的选择,保证每次生成的UUID 是唯一的) UU ...