14年左右最早接触过docker,当时在ubuntu系统中只简单的运行过几个命令稍略测试过。在红帽RHCA中有DO280课程(红帽DIY 的 docker + k8s + etcd + haproxy组合产品),趁着学习DO280课程的机会 ,做下DOCKer内容的小结,本篇先从docker架构开始说起。

一、docker架构和常用命令

在开始之前,先简单的看下docker的架构图,如下:

docker
docker

docker的常用命令如下

1容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
2容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
3容器rootfs命令 — docker [commit|cp|diff]
4镜像仓库 — docker [login|pull|push|search]
5本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
6其他命令 — docker [info|version]

二、命令执行

1、images镜象

这里先从国内的163镜像源下载一个image镜像,查看并运行该镜像,使期产生一个容器:

1[root@localhost docker]# docker pull hub.c.163.com/public/centos:7.2.1511   //从国内163源拉取一个docker镜像
2[root@localhost centos7]# docker images   //查看现有镜像
3REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
4hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB
5[root@localhost centos7]# docker run -i -t 84352c4ff678 /bin/bash   //使用刚刚的镜像运行一个容器
6[root@81adc321fd6c /]# ps auxf
7USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
8root         1  1.3  0.0  11768  1876 ?        Ss   03:13   0:00 /bin/bash
9root        17  0.0  0.0  35880  1436 ?        R+   03:13   0:00 ps auxf

2、commit image

在该容器内执行了一系统操作后,可以将该container 重新commit 为一个新的image,如下:

1[root@localhost centos7]# docker ps
2CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3dc27fe50bb80        84352c4ff678        "/bin/bash"         About an hour ago   Up About an hour    22/tcp              gloomy_hugle
4[root@localhost centos7]# docker commit -m "some tools installed" dc27fe50bb80  361way/centos:7.2
5sha256:5a3a8963b1e8a575d860ca3e32dbbccab0138dc70da065700eef2a90659eed2c
6[root@localhost centos7]# docker images
7REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
8361way/centos                 7.2                 5a3a8963b1e8        6 seconds ago       570.5 MB
9hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB

请注意,当你反复去commit一个容器的时候,每次都会得到一个新的IMAGE ID,假如后面的repository:tag没有变,通过docker images可以看到,之前提交的那份镜像的repository:tag就会变成none:none,所以尽量避免反复提交。

3、 save、load、tag与images

使用docker save可以将当前的images备份成一个tar文件,方便在其他主机上通过load载入,使用tag可以修改对应的标签。具体用法可以 man docker-save 、man docker-load、man docker-tag进行查看。示例如下:

 1[root@localhost ~]# docker images
 2REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
 3361way/centos                 7.2                 5a3a8963b1e8        8 minutes ago       570.5 MB
 4hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB
 5[root@localhost ~]#
 6[root@localhost ~]#
 7[root@localhost ~]# docker save 5a3a8963b1e8  -o 361way.tar
 8[root@localhost ~]# docker save 5a3a8963b1e8 > 361way.tar   //也可以使用重定向的方向
 9[root@localhost ~]# docker save --output=centos-latest.tar 361way/centos:7.2 //也可以tag标签进行save
10[root@localhost ~]# ls
11361way.tar  anaconda-ks.cfg  docker-training
12[root@localhost ~]# docker rmi 5a3a8963b1e8
13Untagged: 361way/centos:7.2
14Deleted: sha256:5a3a8963b1e8a575d860ca3e32dbbccab0138dc70da065700eef2a90659eed2c
15Deleted: sha256:bda71a8e48dc76fa11fd32d22687e48bf0a66425e4dde0d5386712bfde6a1b0e
16[root@localhost ~]# docker images
17REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
18hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB
19[root@localhost ~]# docker load -i 361way.tar.gz
201dfed3279435: Loading layer [==================================================>] 220.9 MB/220.9 MB
21Loaded image ID: sha256:5a3a8963b1e8a575d860ca3e32dbbccab0138dc70da065700eef2a90659eed2c
22[root@localhost ~]# docker images   //可以看到刚刚导入的images没有tag标签
23REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
24<none>                        <none>              5a3a8963b1e8        10 minutes ago      570.5 MB
25hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB
26[root@localhost tmp]# docker tag 5a3a8963b1e8 361way/centos:latest
27[root@localhost ~]# docker images
28REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
29361way/centos                 latest              5a3a8963b1e8        8 minutes ago       570.5 MB
30hub.c.163.com/public/centos   7.2.1511            84352c4ff678        7 months ago        355.7 MB

4、容器相关命令

容器相关的常用参数有docker run 、ps 、attach、log、commit、rm、inspect 。其中docker run -i -t “image id” 命令,会将一个imager作为容器运行起来;ps用于查看当前活动的所有容器,其经常和其他参数配合使用:

1[root@localhost ~]# docker ps
2CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3dc27fe50bb80        84352c4ff678        "/bin/bash"         4 hours ago         Up 10 minutes       22/tcp              gloomy_hugle
4[root@localhost ~]# docker ps -a -q
5dc27fe50bb80
6[root@localhost ~]# docker rm -f $(docker ps -a -q)  //删除所有容器

attach主要是连接上当前正常在运行的容器;log命令用于打印容器运行中所产生的所有日志;commit用于将一个容器重新提交成images文件;inspect命令用于查看容器或images的属性信息,这里比如提取某个容器的IP信息的命令如下:

1[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' dc27fe50bb80
2172.17.0.2

如果不加任何格式过滤(后面直接跟容器id或images id),会打印出所有的容器或images信息。docker相关的命令这里先写这么多,因为docker所有的参数命令都可以通过man docker-参数 的方式获取帮助信息 。