1.运行一个镜像web
[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
提供一个容器中的shellredis
[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中。docker
流程分析:
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统一管理。shell
2)docker run
建立一个全新的Docker容器,并在容器中运行指定命令。json
流程分析:
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容器内部的运行环境初始化,并最终执行用户要求启动的命令。ubuntu
3.经常使用命令解析
1)启动容器bash
[root@bogon ~]# docker run -h CONTAINER -i -t debian /bin/bash root@CONTAINER:/#
-h 设定新的主机名(hostname)网络
2)查看容器app
为了测试,我将容器搞坏了 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)删除容器webapp
查看所有容器(包括已中止的) [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"
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.镜像的命名空间
由镜像名称判断:
[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)