1. Docker基本概念

1.1 什么是 docker hub

DockHub是一个仓库

https://hub.docker.com/

仓库是集中存放镜像文件的场所

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

  • docker拉取命令

    docker pull centos
  • docker 查看镜像

    docker images

1.2 什么是docker镜像?

Docker镜像是一个特殊的文件系统 除了运行时所需要的程序,库 资源 配置等文件意外,还包含了一些运行时的准备的的一些配置参数(如匿名卷、环境变量、用户等).镜像不包含任何动态数据、其内容在构建之后也不会被改变。



共享一个base镜像 但是base镜像不会被修改

只会修改单个容器内

这个用到了docker特性

每当一个镜像被创建 就会创建一个可写层在上方

这个可写层又被称为容器层 容器层的下方统一叫镜像层

使用centos镜像创建一个容器

sudo docker run --name centos_test -it centos /bin/bash

1.3 什么是容器

容器是一种轻量级,可移植,自包含的软件打包技术 ,是一种应用程序,可以

在九乎任何地方以相同的方式运行。

开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系

统的虚拟机,物理服务器或公有云主机上运行。

那为什么需要容器 以及为什么被称为容器?

1.4 docker容器的优势

容器的优势 ,对于开发人员来说,创建一次,可以在任何地方运行,对于运维人员来说,配置一次,可以运行所有应用

1.5 docker容器是如何工作的

docker的核心组件包括:

docker客户端,docker服务器,docker镜像,registry,docker容器

1.6 docker客户端

在Linux系统下,Docker Client 和Docker daemon和容器直接运行在宿主机上,这意味着容器可直接使用宿主机端口资源,不需要在容器和宿主机之间映射端口。

在Windows或Max X系统下,Docker服务运行在Linux虛拟机里,Dockerclient运行在宿主机下跟Docker服务通信。,当运行容器里,它用的端口资源是虛拟机里的,必须跟宿主机上的端口映射。



6.1.7 docker 服务

Docker 服务是Docker最核心的后台进程,它负责响应来自Docker client的请求,然后将这些请求翻译成系统调用完成容器管理操作。

该进程会在后台启动一个API Server负责接收由Docker client发送的请求;接收到的请求将通过Docker 服务内部的一个路由分发调度,再由具体的西数来执行请求。

2. docker 命令

容器运行

$ docker run -it centos /bin/sh

docker 客户端使用docker命令来运行 run参数 表明客户端要运行一个新的容器.

docker客户端要运行一个容器需要告诉 docker守护进程的最小参数是:

  1. 这个容器从哪个镜像中创建.这是centos,基础的centos镜像
  2. 在容器中要运行的命令,这里是/bin/bash 在容器中运行bash shell

那么运行这个命令在底层发生了什么?

按照顺序

  1. 拉取镜像 检查是否存在 如果没有会在docker pub中下载.如果已存在 创建新的容器
  2. 创建新的容器,当docker 有了这个镜像之后,docker 会用他创建一个新的容器.
  3. 分配文件按系统 并且挂载一个可读写的曾,容器会在这个文件系统中创建.并且一个可读写的曾被添加到镜像中,
  4. 分配网络/桥接接口,创建一个运行容器与本地主机通信的网络接口.
  5. 设置一个ip地址:从池中寻找一个可用的ip并且附加到容器中
  6. 运行你指定的程序 运行该程序
  7. 铺货并且提供应用输出: 链接并且记录标准输出,输入和错误,让你可以看到你的程序如何运行的

查看所有运行 的容器

docker ps -a

停止 docker

docker stop id

杀死进程

docker kill id

进入容器内部

docker attach id

通过 docker exec -it + 短id 进入容器内部

docker exec -it + 短id

attach 和exec的区别

attach 和exec主要区别如下

  • attach 直接进入容器启动命令的终端,不会启动新的进程.
  • exec 则是在容器中打开新的终端 并且可以启动新的进程
  • 如果像直接在终端查看命令的输出 用attach
  • 其他请看用exec

其他的一些命令

# 启动死掉的容器
docker start 短id # 重启 docker容器
docker restart 短id # 暂停 docker 容器 # 不会占用资源
docker pause 短id # 重新运行 容器
docker unpause 短id # 删除docker 容器 #可以同时删除两个 空格隔开
docker rm 短id 短id # 批量删除 所有死掉的docker
docker rm -v $(docker ps -aq -f status=exited) # 删除镜像
docker rmi hello-world # 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'` # 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'` # 清除所有无容器使用的镜像 注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
docker system prune -a

4. docker-appium的使用

docker 安装apoium 巨坑!! 不建议安装

这里推荐另一种方式 直接从docker hub上安装

sudo docker search appium



然后 docker pull 镜像即可

sudo docker pull appium/appium

如果下载的太慢 可手动配置加速器

  • 创建一个Docker的配置文件。

    • sudo vim /etc/docker/daemon.json
  • 编写配置文件
    • { "registry-mirrors": ["此处写镜像源地址"]
    • Docker镜像源地址:

官方国内镜像 https://registry.docker-cn.com

网易 http://hub-mirror.c.163.com

中国科技大学 https://docker.mirrors.ustc.edu.cn

  • 重新加载配置文件并重启Docker。

    • sudo systemctl daemon-reload
    • sudo systemctl restart docker
  • 验证镜像源是否修改成功
    • sudo docker info
    • 查看docker 容器ip
      • docker inspect 容器ID | grep IPAddress

5. 自己提交一个镜像

我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像,这时候我们就需要使用 commit 命令来构建一个新的镜像

docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag

我们拉取一个tomcat镜像 并持久化运行 且设置与宿主机进行端口映射

docker pull tomcat

docker run -itd -p8080:8080 --name tom tomcat /bin/bash

使用 提交命令 将在运行的tomcat 容器 打包为一个全新的镜像 名字为tom Tag为1.0

docker commit -a="leilei" -m="第一次打包镜像,打包后直接访问还会404吗" 231f2eae6896 tom:1.0

6. Docker镜像创建的两种方法

6.1. 使用commit 命令创建docker镜像

创建一个nginx镜像

sudo docker run --name webserver -d -p 80:80 nginx

运行完命令 创建成功

然后我们访问浏览器

假设我们不喜欢这个页面 想修改这个页面

我们可以进入docker容器内

sudo docker exec -it webserver bash

然后 输入命令

echo '<h1>hello,docker!</h1>' >/usr/share/nginx/html/index.html

然后就修改了页面了

docker diff命令

我们修改了文件即修改了存储层

可以通过命令查看刚刚有哪些操作

sudo docker diff webserver

Docker commit 命令

Docker commit 命令可以叠加内容从而重新生成一个镜像

docker commit [选项]<容器ID或容器苗> [<仓库名>][:<标签>]

sudo docker commit --author "lzc <hybpjx@163.com>" --message "modify Default page" webserver nginx:v2

这个时候就可以通过sudo docker images来查看了

或者通过sudo docker histroy nginx:v2

我们再创建一个为81端口的nginx容器

sudo docker run --name web2 -d -p 81:80 nginx:v2

然后访问 192.168.2.91:81

可以发现 页面还是一样的 说明镜像创建成功

!!!! 慎用 docker commit 命令

使用docker commit 命令虽然可以比较直观的帮助理解镜像分层的概念 但是实际开发环境不会这么使用

因为由于命令执行了 很多文件发生了改动 这还仅仅是简单错误 如果是安装文件 编译构建 那么镜像会非常臃肿,

此外 使用docker commit 意味着 所有对镜像的操作都是黑箱操作,生成的镜像也被称之为 黑箱操作

6.2 使用Dockerfile 创建docker镜像

什么是dockerfile

Dockerfile 是一个文本文件。其包含了一条一条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应该如何构建。

命令:

必须命名为Dockerfile

mkdir mynginx
cd mynginx
touch Dockerfile

然后编辑此文件

FROM nginx
RUN echo '<h1>Hello,world</h1>' > /usr/share/nginx/html/index.html

然后执行命令(记住有个 点 . 代表执行dockerfile的目录)

sudo docker build -t nginx:v3 .

我们可以把镜像上传到docker中去

https://hub.docker.com/repositories

在我们上传镜像 要确保我们的docker 账号是登录状态的

  • 登录命令命令

    sudo docker login -u xxx -p xxx
  • 修改tag命令

    sudo docker tag nginx:v3 hybpjx/nginxv3:v3

使用这个名字

然后执行

sudo docker push hybpjx/nginxv3:v3

即可完成上传

FROM 和RUN

【FROM指定基础镜像】

基础镜像是必须指定的。而FROM就是指定基础镜像,因此应该Dockfile中FROM是必备的指令。并且必须为第一条指令。

【Run指令的两种格式】

shell 格式:RUN<命令>,就像是再命令行中输入的命令一样。

exec格式:RUN["可执行文件","参数1","参数2"],这更像是函数中调用的格式

比如

RUN apt-get update
RUN apt-get install vim

就是创建了两层镜像 这样毫无意义

最大不能超过127层的

正确写法为:

RUN apt-get install \
&& apt-get install vim

注意: 任何无关的文件都要清理

docker常用配置以及命令的更多相关文章

  1. Redis常用配置和命令总结

    Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  2. LINUX常用配置及命令

    一.   Fedora系统配置 1.      [设置网卡IP] 步骤如下: 1)     用root用户登陆,打开/etc/sysconfig/network-scripts/ifcfg-eth0文 ...

  3. H3C常用配置和命令

    邻居发现命令display lldp neighbor-information list DHCP中继配置dhcp enabledhcp relay server-group 1 ip x.x.x.x ...

  4. Cisco常用配置和命令

    1.ASA常用管理management-access inside      #开启远程连接inside口 show snmp-server oidlist          #查看ASA snmp的 ...

  5. docker 常用的容器命令

    容器命令 # --name 给容器起名 # -p 端口映射 # -d 后台启动 # -it 交互模式启动 # 交互模式启动 # docker run -it 镜像名/id /bin/bash # do ...

  6. 02-docker入门-docker常用的一些命令

    在这里,有必要先对ducker在做一次介绍 ducker 是一个容器. 容器内部运行的是一个系统. 系统内部安装好了要调试 / 发布的工程,然后这个系统被打包成了一个镜像. ducker 就是这个镜像 ...

  7. Iptables 防火墙常用配置

    转至:https://blog.csdn.net/lswzw/article/details/87971259 Iptables 防火墙常用配置 概念 命令行模式 查看 & 命令 -n:直接显 ...

  8. 关于Docker 常用命令

    Docker 常用命令 分类列一下常用的CLI命令 仓库相关 search/ pull / push / login etc. 例:docker pull ubuntu 从仓库下载ubuntuimag ...

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

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

随机推荐

  1. [CF1519C] Berland Regional (数论分块)

    题面 有 n 个学生和 n 所大学,每个学生在其中一所大学中学习,且各有一个能力值 s i s_i si​ . 某次组队打比赛的召集令会给一个数字 k ,表示团队数量.然后每所大学会先把自己的所有学生 ...

  2. Java中字节流的总结及代码练习

    Java中的字节流 在描述字节流时,先知道什么是流 流可以分为:输入流和输出流 输入流和输出流 示意图: 字节流读取内容:二进制,音频,视频 优缺点:可以保证视频音频无损,效率低,没有缓冲区 字节流可 ...

  3. C++ Protobuf

    Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准.通过将结构化的数据进行序列化(串行化),用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的 ...

  4. Sys_Bulkload 工具使用

    一.介绍 sys_bulkload是KingbaseES提供的快速加载数据的命令行工具.用户使用sys_bulkload工具能够把一定格式的文本数据简单.快速的加载到KingbaseES数据库中,或将 ...

  5. DFS算法-求集合的所有子集

    目录 1. 题目来源 2. 普通方法 1. 思路 2. 代码 3. 运行结果 3. DFS算法 1. 概念 2. 解题思路 3. 代码 4. 运行结果 4. 对比 1. 题目来源 牛客网,集合的所有子 ...

  6. 升级Windows 2003域控制器到Windows 2012 R2

    由于Windows 2003包括R2的扩展支持在今年7月14日就会过期.如果在扩展周期结束之前没有和微软签订昂贵服务协议,那么系统将得不到任何补丁和技术支持. 我这里准备了两台测试用的机器做这个实验. ...

  7. thinkphp5.1 cookie跨域、thinkphp5.1 session跨域、tp5.1cookie跨域

    cookie跨域: //config/cookie.php return [ //... //仅7.3.0及以上适用 'samesite' => 'None', //是否加密cookie值,fa ...

  8. Java内部类初探

    Java内部类初探 之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结. Java内部类一般可以分为以下三种: 成员内部类 静态内部类 匿名内部类 一.成员内 ...

  9. 2.2 virtualenv 虚拟环境

    有的时候因为各种原因,在操作系统下,我们会安装很多版本的Python解释器.同样,我们也有可能因为各种原因,需要不同版本的模块,比如Django1.8,Django1.11.再加上pip工具管理器的版 ...

  10. 云原生分布式文件存储 MinIO 教程

    文章转载自:https://mp.weixin.qq.com/s/_52kZ5jil1Cec98P5oozoA MinIO 提供开源.高性能.兼容 s3 的对象存储,为每个公共云.每个 Kuberne ...