Docker容器技术-基础命令
一、基础命令
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容器技术-基础命令的更多相关文章
- docker容器技术基础入门
目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...
- docker容器技术基础之联合文件系统OverlayFS
我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...
- Docker容器技术基础
Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...
- Docker容器技术-基础与架构
一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...
- 1.docker容器技术基础入门
内容来自:https://www.cnblogs.com/marility/p/10215062.html https://blog.51cto.com/gouyc/2310785?source=dr ...
- docker容器技术基础之linux cgroup、namespace
一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...
- 1、docker容器技术基础入门
Docker和传统虚拟机的区别 参考文章: https://lwn.net/Articles/531114/ 操作中的命名空间详解 https://blog.yadu ...
- 1.云原生之Docker容器技术基础知识介绍
转载自:https://www.bilibili.com/read/cv15180540/?from=readlist
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
随机推荐
- LeetCode递归 -2(Recursion) 培训专题 讲解文章翻译 (附链接) (2019-04-09 15:50)
递归 - 空间复杂度 在本文中, 我们将讨论如何分析递归算法的空间复杂度. 在计算递归算法的空间复杂度时,最需要考虑的两个部分就是: 递归相关空间 (recursion related space) ...
- android EditText 限定中文个数与英文个数的解决方式
EditText 限定中文8个英文16个的解决方法. 在EditText上控件提供的属性中有限定最大最小长度的方法. 可是,对于输入时,限定中文8个英文16个时,怎么办?相当于一个中文的长度是两个英文 ...
- 理解和使用WPF 验证机制(值得推荐)
首先建立一个demo用以学习和实验WPF Data Validation机制.创建一个数据实体类: public class Employee { public string Name { get; ...
- wpf数据绑定更新通知
类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也在变化 就是一种心跳效果 在网上数据触发的感觉不多,废了不少时间,这里做个总结 1:通知 class Notif ...
- eclipse建maven pom报错
pom报:org.apache.maven.archiver.MavenArchiver.getManifest 解决办法: 升级m2eclipse插件版本 help->install news ...
- 10道mysql查询语句面试题
1.https://www.yanxurui.cc/posts/mysql/10-sql-interview-questions/ 2.http://mm.fancymore.com/reading/ ...
- 简单的c语言小程序 回光返照
主函数 int main(int argc,char * argv[]) -- arg代表英文的参数缩写 c代表count计数 argc { return 0; -- 0返还给系统,代表程序正确运行 ...
- [转]C#静态方法与非静态方法的比较
http://wenku.baidu.com/view/4e1704084a7302768e9939e0.html C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他 ...
- 20160924-1——mysql存储引擎
一.主要存储引擎 5.5以后的版本,默认存储引擎从myisam改成了innodb:线上推荐都用innodb 二.innodb存储引擎 (一)结构 INNODB存储引擎大致分三部分,图中已经(1)(2) ...
- Mybatis+MySql 一个标签中执行多条sql语句 这个坑 ,我心中有一句MMP
解决办法 转自网友: 亲测 解决了问题@ MySql默认是不支持这种骚操作的,但是并不代表不能实现,只需要在jdbc的配置文件中稍做配置: driver=com.mysql.jdbc.Driverur ...