目录

架构

http://study.p2hp.com/wp-content/uploads/2016/04/576507-docker1.png

概念

  • Docker 是一个开源的应用容器引擎

  • docker客户端

    docker客户端是用户与docker服务交互的窗口,也就是我们通常操作各种docker命令的终端。

  • docker服务

    docker daemon的守护进程

    docker deamon监听着客户端的请求,并且管理着docker的镜像、容器、网络、磁盘(图中只列出了镜像与容器)等对象

  • 仓库

    类似于代码仓库github,但这个是docker镜像的仓库

  • 镜像

    docker镜像是一个只读模板,可以用来创建docker容器。镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。

    镜像是一层套一层。

  • 容器

    镜像的一份运行实例

  • 容器数据卷

    容器内的数据需要持久化到宿主机上是很有必要的,这就需要用到数据卷

    容器数据卷的设计目的就是做数据的持久化和容器间的数据共享,数据卷完全独立于容器的生命周期,也就是说就算容器关闭或者删除,数据也不会丢失。简单点说就将宿主机的目录挂在到容器,应用在容器内的数据可以同步到宿主机磁盘上,这样容器内产生的数据就可以持久化了。关于容器卷的命令我们后面会有操作实例!

安装

Docker安装(Ubuntu) - 9ong

常用命令

本地镜像命令

  • docker images

    查看本地主机上所有的镜像。

    还可以通过docker images nginx指定某个具体的镜像查看对应信息。

    注意:镜像名是会重复的,只有image id才是唯一的标识。

  • docker rmi

    删除本地的镜像

  • docker tag

    标记本地镜像,将其归入某一仓库。

    docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
    
    docker tag ubuntu:15.10 jm/ubuntu:v3
    
  • docker history

    docker history jm/ubuntu:v3
    
  • docker build

    命令用于使用 Dockerfile 创建镜像。

    docker build [OPTIONS] PATH | URL | -
    

    options详见:Docker build 命令 | 高手教程

  • docker save

    将指定镜像保存成 tar 归档文件。

    docker save -o my_ubuntu_v3.tar jm/ubuntu:v3
    
  • docker import

    从归档文件中创建镜像。

    docker import  my_ubuntu_v3.tar jm/ubuntu:v4 
    

镜像仓库

  • docker login

    登陆到Docker Hub

    docker login -u 用户名 -p 密码
    

    登出Docker Hub

    docker logout
    
  • docker search

    根据镜像名称搜索远程仓库中的镜像

  • docker pull

    搜索到某个镜像之后就可以从远程拉取镜像啦,类似git中的pull命令,对应的还有个docker push的命令。

  • docker push

    将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。

    docker push myapache:v1
    

容器生命周期命令

  • docker run

    docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 可以基于某个镜像运行一个容器,如果本地有指定的镜像则使用本地镜像,如果没有则从远程拉取对应的镜像然后启动。

    使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

    docker run -p 80:80 -v /data:/data -d nginx:latest
    

    使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

    docker run -it nginx:latest /bin/bash
    
    -d:启动容器,并且后台运行(docker容器后台运行,就必须要有一个前台进程,容器运行的命令如果不是一直挂起的命令,容器启动后就会自动退出);
    启动后没有进入到容器内部,还是在宿主机。
    -i:以交互模式运行容器,通常与-t同时使用;
    -t:为容器重新分配一个伪输入终端,通常与-i同时使用(容器启动后进入到容器内部的命令窗口);
    -P:随机端口映射,容器内部端口随机映射到主机的高端口;
    -p:指定端口映射,格式为:主机(宿主)端口:容器端口;
    -v:建立宿主机与容器目录的同步;注意的是这里的同步是双向的。
    --name="myTomcat": 为容器指定一个名称(如果不指定,则有个随机的名字);
    
    

    更多options详见Docker run 命令 | 高手教程

  • docker create

    创建一个新的容器但不启动它

  • 退出容器

    进入到容器后可以通过exit命令退出容器,也可以通过ctrl+P+Q快捷键退出容器,这两种方式的不同之处是exit会退出并且关闭容器,而ctrl+P+Q快捷键只是单纯的退出,容器还在运行,并且还能再次进入。

  • docker start

    启动一个或多个已经被停止的容器

  • docker stop

    停止一个运行中的容器

  • docker restart

    重启容器

  • docker pause

    暂停容器中所有的进程。

  • docker unpause

    恢复容器中所有的进程。

  • docker exec

    在运行的容器中执行命令

    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    

    OPTIONS说明:

    -d :分离模式: 在后台运行

    -i :即使没有附加也保持STDIN 打开

    -t :分配一个伪终端

    在容器mynginx中以交互模式执行容器内/root/jm.sh脚本

    jm@jm:~$ docker exec -it mynginx /bin/sh /root/jm.sh
    

    在容器mynginx中开启一个交互模式的终端

    jm@jm:~$ docker exec -i -t  mynginx /bin/bash
    root@b1a0703e41e7:/#
    
  • docker rm

    删除一个或多少容器

  • docker kill

    杀掉一个运行中的容器

容器操作

  • docker ps

    列出容器,没有加options,默认展示正在运行的容器。

    options:

    -a :显示所有的容器,包括未运行的。
    
    -f :根据条件过滤显示的内容。
    
    --format :指定返回值的模板文件。
    
    -l :显示最近创建的容器。
    
    -n :列出最近创建的n个容器。
    
    --no-trunc :不截断输出。
    
    -q :静默模式,只显示容器编号。
    
    -s :显示总的文件大小。
    
    
  • docker top

    查看容器中运行的进程信息,支持 ps 命令参数

  • docker attach

    连接到正在运行中的容器。attach是可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。

  • docker inspect

    获取容器/镜像的元数据,关于容器/镜像配置信息。

  • docker events

    从服务器获取实时事件

    显示docker 2019年11月2日后的所有事件:

    docker events  --since="1572624000"
    
  • docker logs

    获取容器的日志

    -f : 跟踪日志输出
    
    --since :显示某个开始时间的所有日志
    
    -t : 显示时间戳
    
    --tail :仅列出最新N条容器日志
    
    
    sudo docker logs -f jm-php7-2-php-fpm
    
  • docker port

    列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。

容器其他命令

  • docker commit :从容器创建一个新的镜像。

    -a :提交的镜像作者;
    
    -c :使用Dockerfile指令来创建镜像;
    
    -m :提交时的说明文字;
    
    -p :在commit时,将容器暂停。
    
    

    将容器 jm-php-7-2-php-fpm 保存为新的镜像 php72web并打上tag为v1,添加提交人信息和说明信息。

    docker commit -a "tsingchan" -m "new php7.2 webserver" jm-php-7-2-php-fpm  php72web:v1
    
  • docker cp

    用于容器与主机之间的数据拷贝。

    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    

    options:

    -L :保持源目标中的链接
    
    

    注意:docker cp支持直接复制目录;

    注意:docker cp支持重命名;

    将主机/www/data目录拷贝到容器jm-php-7-2-php-fpm的/www目录下。
    docker cp /www/data jm-php-7-2-php-fpm:/www/
    
    将主机/www/data目录拷贝到容器jm-php-7-2-php-fpm中,目录重命名为www。
    docker cp /www/data jm-php-7-2-php-fpm:/www
    
    将容器jm-php-7-2-php-fpm的/www目录拷贝到主机的/tmp目录中。
    docker cp jm-php-7-2-php-fpm:/www /tmp/
    
  • docker diff

    检查容器里文件结构的更改

    sudo docker diff jm-php7-2-php-fpm
    
    C /run
    A /run/php-fpm.pid
    C /etc
    C /etc/php
    C /etc/php/7.2
    C /etc/php/7.2/fpm
    C /etc/php/7.2/fpm/conf.d
    A /etc/php/7.2/fpm/conf.d/99-overrides.ini
    
    

其他命令

  • docker info : 显示 Docker 系统信息,包括镜像和容器数。
  • docker version :显示 Docker 版本信息

Dockerfile

我们可以从远程pull一个镜像,那远程的镜像是怎么来的呢?

如果我们想自己创建一个镜像又该怎么做呢?

这就涉及到Dockerfile了,Dockerfile是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,docker能够从dockerfile中读取指令自动的构建镜像。

我们要想编写自己的Dockerfiler并构建镜像,那对Dockerfile的语法和命令的了解就是必须的。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大

更多关于dockerfile指令详解:Dockerfile基础知识梳理-9ong

docker-compose

Docker-compose基础知识梳理-9ong

Docker Machine

Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。

Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。

Swarm

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。