一、基础命令

1.运行一个镜像

[root@bogon ~]# docker run debian echo "Hello World"
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
3e17c6eae66c: Pull complete
Digest: sha256:2e43e863a4ab6e53caf87a37d01d8c144cdcb732ad1b944fcf45cbfd7248a02a
Status: Downloaded newer image for debian:latest
Hello World

提供一个容器中的shell

[root@bogon ~]# docker run -i -t debian /bin/bash
root@1bd73131a553:/# echo "Hello from Container-land!"
Hello from Container-land!
root@1bd73131a553:/# exit
exit

2.运行案例分析

1)docker pull

Docker Daemon从Docker Registry下载指定的容器镜像,并将镜像储存在本地Graph中。

流程分析:

A.Docker Client处理用户发起的docker pull命令,解析完请求以及参数后,发送一个HTTP请求给Docker Server,HTTP请求方法为POST,请求URI为“/images/create?”+“xxx”;

B.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

C.mux.Router将请求路由分发至相应的handler;

D.在PostImageCreate这个handler中,创建并初始化一个名为“pull”的Job,之后触发执行该Job;

E.这个Job在执行过程中执行pullRepository操作,即从Docker Registry中下载相应的一个或多个Docker镜像;

F.这个Job将下载的Docker镜像交给graphdriver管理;

G.graphdriver负责存储Docker镜像,一方面将镜像存储至本地文件系统中,另一方面为镜像创建对象,由Docker Daemon统一管理。

2)docker run

创建一个全新的Docker容器,并在容器中运行指定命令。

  • 创建Docker容器对象,并为容器准备所需的rootfs;
  • 创建容器的运行环境,运行用户指令;

流程分析:

A.Docker Client处理用户发起的docker run命令,解析完请求与参数之后,向Docker Server发送一个HTTP请求,HTTP请求方式为POST,请求URL为“/containers/create?”+“xxx”;(创建容器对象而非实际容器)

B.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

C.mux.Router将请求路由分发至相应的handler;

D.在PostContainersCreate这个handler中,创建并初始化一个名为“create”的Job,之后触发执行该Job;

E.这个Job在执行过程中执行Container.Create操作,该操作需要获取容器镜像来为Docker容器准备rootfs,通过graphdriver完成;

F.graphdriver从Graph中获取创建Docker容器rootfs所需要的所有镜像;

G.graphdriver将rootfs的所有镜像通过某种联合文件系统的方式加载至Docker容器指定的文件目录中;

H.若以上操作正常执行,没有返回错误或异常,则Docker Client收到Docker Server返回状态后,发起二次HTTP请求,URL为“/containers/”+container_ID+“/start”;(实现物理容器运行)

I.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

J.mux.Router将请求路由分发至相应的handler;

K.在PostContainersStart这个handler中,创建并初始化一个名为“start”的Job,之后触发执行该Job;

L.这个Job执行需要完成一系列与Docker容器相关的资源配置工作;

M.networkdriver为指定的Docker容器分配网络资源,防火墙规则

N.返回名为“start”的Job,执行完一些辅助操作后,Job开始执行用户指令,调用execdriver;

O.execdriver被调用,开始初始化Docker容器内部的运行环境,如命名空间、资源控制与隔离,以及用户命令的执行,相应的操作转交至libcontainer来完成;

P.libcontainer被调用,完成Docker容器内部的运行环境初始化,并最终执行用户要求启动的命令。

3.常用命令解析

1)启动容器

[root@bogon ~]# docker run -h CONTAINER -i -t debian /bin/bash
root@CONTAINER:/#

-h 设定新的主机名(hostname)

2)查看容器

为了测试,我将容器搞坏了
root@CONTAINER:/# mv /bin /basket
root@CONTAINER:/# ls
bash: ls: command not found 现在查看状态
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f64d43a4e26 debian "/bin/bash" 2 minutes ago Up 2 minutes competent_euclid 通过NAMES获取容器信息
[root@bogon ~]# docker inspect competent_euclid
[
{
"Id": "8f64d43a4e26dbe29626f82feb7aafc759fe805699f0f014aaf3b2be82790c82",
"Created": "2017-10-23T13:47:20.594553293Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2662,
"ExitCode": 0,
"Error": "",
"StartedAt": "2017-10-23T13:47:20.855942407Z",
"FinishedAt": "0001-01-01T00:00:00Z"
...省略部分 过滤相关内容
[root@bogon ~]# docker inspect competent_euclid |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@bogon ~]# docker inspect --format {{ .NetworkSettings.IPAddress }} competent_euclid
Template parsing error: template: :1: unexpected unclosed action in command
<注意:括号内不要有空格>
[root@bogon ~]# docker inspect --format {{.NetworkSettings.IPAddress}} competent_euclid
172.17.0.2 容器内的改变
[root@bogon ~]# docker diff competent_euclid
A /basket (A表示新增文件)
A /basket/vdir
A /basket/chgrp
A /basket/fgrep
A /basket/mv
A /basket/pidof
A /basket/rbash
...省略部分
D /bin (D表示被删除的文件) 容器执行日志
[root@bogon ~]# docker logs competent_euclid
root@CONTAINER:/# mv /bin /basket
root@CONTAINER:/# ls
bash: ls: command not found

3)删除容器

查看全部容器(包括已停止的)
[root@bogon ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f64d43a4e26 debian "/bin/bash" 11 minutes ago Exited (127) 23 seconds ago competent_euclid
1bd73131a553 debian "/bin/bash" About an hour ago Exited (0) About an hour ago cranky_austin 重新启动容器
docker start 删除容器
[root@bogon ~]# docker rm competent_euclid
competent_euclid 清理所有已停止的容器
[root@bogon ~]# docker ps -aq -f status=exited
1bd73131a553
69914367d6b4
74ef7227163a
5a1754f8433f
944c67e9d101
e0294c4a650a
[root@bogon ~]# docker rm -v $(docker ps -aq -f status=exited)
1bd73131a553
69914367d6b4
74ef7227163a
5a1754f8433f
944c67e9d101
e0294c4a650a -v 当所有由Docker管理的数据卷已经没有和任何容器关联时,一律删除 [root@bogon ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36c220e77949 busybox "/bin/ping webapp" 3 hours ago Created destination

4)创建一个全新的容器流程

[root@bogon ~]# docker run -it --name cowsay --hostname cowsay debian bash
root@cowsay:/# apt-get update
...
root@cowsay:/# apt-get install -y cowsay fortune
root@cowsay:/# /usr/games/fortune | /usr/games/cowsay
root@cowsay:/# exit 把容器转成镜像
[root@bogon ~]# docker commit cowsay test/cowsayimage
[root@bogon ~]# docker run test/cowsayimage /usr/games/cowsay "Moo"

二、通过Dockerfile创建镜像

1.Dockerfile

[root@bogon ~]# cat Dockerfile
FROM debian:wheezy RUN apt-get update && apt-get install -y cowsay fortune

2.镜像、容器和联合文件系统之间的关系

联合文件系统(联合挂载)—允许多个文件系统叠加,并表现为一个单一的文件系统;若有两个文件的路径完全相同,则最后挂载的文件覆盖之前的;

Docker支持多种不同的文件系统,AUFS、Overlay、devicemapper、BTRFS、ZFS;

[root@bogon ~]# docker info
Containers: 2
Running: 0
Paused: 0
Stopped: 2
Images: 12
Server Version: 17.09.0-ce
Storage Driver: overlay <<<<<<<<
Backing Filesystem: xfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs

Docker镜像由多个不同的层(layer)组成,每一层都是一个只读的文件系统;

Dockerfile里的每一个指令都会创建一个新的层,这个层位于前一个层之上;

当一个镜像被转化成容器时,Docker引擎会在镜像之上添加一个处于最上层的可读写文件系统。(尽量将指令写在一行来较少层的数量)

容器可处于:已创建(created)、重启中(restarting)、运行中(running)、已暂停(paused)、已退出(exited)

3.ENTRYPOINT

指定一个可执行文件,处理传给docker run的参数。

[root@bogon ~]# cat Dockerfile
FROM debian:wheezy RUN apt-get update && apt-get install -y cowsay fortune
COPY entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"] [root@bogon ~]# cat entrypoint.sh
#!/bin/bash
if [ $# -eq 0 ];then
/usr/games/fortune | /usr/games/cowsay
else
/usr/games/cowsay "$0"
fi [root@bogon ~]# docker build -t test/cowsay-dockerfile .
[root@bogon ~]# docker run test/cowsay-dockerfile "Moo"

4.上传镜像

[root@bogon ~]# cat Dockerfile
FROM debian:wheezy MAINTAINER hdlptz <hdlptz@163.com>
RUN apt-get update && apt-get install -y cowsay fortune
COPY entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"] [root@bogon ~]# docker build -t hdlptz/cowsay:stable
[root@bogon ~]# docker push hdlptz/cowsay:stable

5.镜像的命名空间

由镜像名称判断:

  • 以字符串和“/”开头,如hdlptz/revealjs,属于用户命名空间(user namespace)
  • 如debian或ubuntu的名称,不包含前缀或/,属于根命名空间(root namespace)
  • 以主机名或IP开头的名称,代表该镜像来自第三方的寄存服务,包括公司自己搭建的寄存服务

三、Redis镜像实例

[root@bogon ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
d13d02fa248d: Pull complete
a1846f364e39: Pull complete
dba901efed8c: Pull complete
b54b43b9d049: Pull complete
b5b9e2d5e9c6: Pull complete
7058d282fa00: Pull complete
Digest: sha256:07e7b6cb753f8d06a894e22af30f94e04844461ab6cb002c688841873e5e5116
Status: Downloaded newer image for redis:latest [root@bogon ~]# docker run -v /data test/webserver [root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hubuser/webapp latest cbe52807fcad 7 hours ago 362MB
redis latest 1fb7b6c8c0d0 13 days ago 107MB
debian latest 874e27b628fd 13 days ago 100MB
ubuntu 14.04 dea1945146b9 5 weeks ago 188MB
busybox latest 54511612f1c4 5 weeks ago 1.13MB [root@bogon ~]# docker run --name myredis -d redis
d07dd579ee128a9500b81507764edbcf81aef3281a22eee22fe04c74163c6986 [root@bogon ~]# docker run --rm -it --link myredis:redis redis /bin/bash root@cbe4f668dba7:/data# redis-cli -h redis -p 6379
redis:6379> ping
PONG
redis:6379> set "docker" 1234
OK
redis:6379> get "docker"
"1234"
redis:6379> exit
root@cbe4f668dba7:/data# exit
exit [root@bogon ~]# docker run --rm --volumes-from myredis -v $(pwd)/backup:/backup \
debian cp /data/dump.rdb /backup/ [root@bogon ~]# docker stop myredis
[root@bogon ~]# docker rm -v myredis
[root@bogon ~]# docker rm $(docker ps -aq)

Docker容器技术-基础命令的更多相关文章

  1. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  2. docker容器技术基础之联合文件系统OverlayFS

    我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...

  3. Docker容器技术基础

    Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...

  4. Docker容器技术-基础与架构

    一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...

  5. 1.docker容器技术基础入门

    内容来自:https://www.cnblogs.com/marility/p/10215062.html https://blog.51cto.com/gouyc/2310785?source=dr ...

  6. docker容器技术基础之linux cgroup、namespace

    一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...

  7. 1、docker容器技术基础入门

    Docker和传统虚拟机的区别               参考文章: https://lwn.net/Articles/531114/    操作中的命名空间详解 https://blog.yadu ...

  8. 1.云原生之Docker容器技术基础知识介绍

    转载自:https://www.bilibili.com/read/cv15180540/?from=readlist

  9. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

随机推荐

  1. postgresql on centos (sequelize+pg+nodejs):Failed to find PostgresSQL server.Pleast double check your settings

    公司的一个项目,使用的nodejs做服务端,数据库是postgresql,在本地时一切ok,放在centos时,postgresql配置ok,可以远程访问,但是nodejs在centos启动时,就会报 ...

  2. Fibonacci数列的幂和 zoj 3774

    题目大意: 求斐波那契数列前n项的k次幂和  Mod 1000000009.    n<=1e18, k<=1e5 这题的k比较大,所以不能用矩阵乘法来递推.学到了新姿势...  http ...

  3. Android-ViewPagerIndicator框架使用——使用概要

    概要:关于ViewPagerIndicator这个框架,我这里只讲解如何使用,而不去讲解他是如何实现的,所以想了解源码剖析的朋友,这个就可以略过了. ViewPagerIndicator这个框架通过自 ...

  4. Android桌面小组件的使用

    一:建立一个类继承AppWidgetProvider 二:建立AWP的布局文件: 布局自己定义一个,但是在使用控件上是有要求的: 以上是Widget目前支持的控件. 三:编写AWP的信息文件:需要在r ...

  5. poj 1144(求割点个数)

    题目链接:http://poj.org/problem?id=1144 思路:判断一个点是否是割点的两个条件:1.如果一个点v是根结点并且它的子女个数大于等于2,则v是割点.2.如果点v不是根结点,并 ...

  6. Dmidecode

    一.Dmidecode简介 DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行 ...

  7. mongo 过滤查询条件后分组、排序

    描述:最近业主有这么一个需求,根据集合中 时间段进行过滤,过滤的时间时间段为日期类型字符串,需要根据某一日期进行截取后.进行分组,排序 概述题目:根据createTime时间段做查询,然后以 天进行分 ...

  8. VS2008试用版到期解决办法----win7下VS2008升级补丁.zip

    打开好久没用的Visual studio 2008,才知道试用版已经到期了.在网上找来了序列号,可是连一个输入序列号的地方都没有,困惑了好久,终于找到了解决办法. 首先献上自己收集的Visual st ...

  9. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  10. SharePoint服务器端对象模型 之 使用CAML进行数据查询

    (一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...