Docker简介
Docker 是一个开源的应用容器引擎,基于
Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
简单解释一下虚拟机和docker的区别:
- 左侧为虚拟机,Host OS为宿主机,也就是我们的正常使用的Windows,MacOS或者Linux系统;虚拟机主要是有一层虚拟层Hypervisor,这一虚拟层主要的作用就是虚拟出硬件,在硬件上我们会完全重新安装一套guestOS,例如centOS或者MacOS系统,可想而知,在原有系统上再运行一套完整的操作系统对系统的性能消耗是巨大的;这里我们最常用的就是VMware这个软件了,这个软件主要功能就是实现虚拟层Hypervisor,在此基础上安装我们所需要的操作系统,也就是虚拟机,并对虚拟机进行管理
- 右侧即为Docker,docker是不一样的,docker是有一层Docker Engine层,在这一层上面直接运行各种各样的程序,它主要是应用了包括Linux操作系统的命名空间(Namespace)、控制组(Control Group)、联合文件系统(Union File System)和Linux网络虚拟化支持等技术将各种应用程序和Host OS宿主机上运行的程序给区分开;甚至可以理解为这些应用程序是直接运行在宿主机上的,只是通过命名空间等技术和宿主机区分开了,那么docker就会比虚拟机轻量很多,在CPU和内存的消耗上也会比虚拟机小很多

Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜
Docker 容器通过 Docker 镜像来创建。
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
我个人比较喜欢下面这张图:这里先简单说一下自己的理解,大家先简单了解一下,待熟悉docker以后回头再看这张图可能会有更深的理解
- 中间为docker的宿主机,用来处理客户端发来的指令,管理docker容器和镜像
- 左侧为docker客户端,用来发起操作指令
- 最右侧为Registry镜像仓库,用来存储docker镜像的地方,可以是开源的Docker Hub,国内的有阿里云,时速云等,也可以是自己私有化部署的

安装docker
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。
社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。
社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。
开始安装
- Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
# uname -r
- 使用 root 权限登录 Centos。确保 yum 包更新到最新。
# yum update
# yum remove docker docker-common docker-selinux docker-engine
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
#yum install -y yum-utils device-mapper-persistent-data lvm2
如果执行上述命令报错了,改用一下命令
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 可以查看所有仓库中所有docker版本,并选择特定版本安装
# yum list docker-ce --showduplicates | sort -r
# yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
# yum install <FQPN> # 如果想安装其他版本,例如:sudo yum install docker-ce-17.12.0.ce
# systemctl start docker
# systemctl enable docker
补充:关于服务管理的基本操作语句:
启动一个服务:systemctl start docker
关闭一个服务:systemctl stop docker
重启一个服务:systemctl restart docker
显示一个服务的状态:systemctl status docker
在开机时启用一个服务:systemctl enable docker
在开机时禁用一个服务:systemctl disable docker
查看服务是否开机启动:systemctl is-enabled docker
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
systemctl enable设置开机启动
systemctl enable nginx.service(设置开机自启)
就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/docker.service 文件的链接。
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
- 验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
# docker version
# docker info
Docker基本语法
一、普通指令
启动 /停止/重启Docker
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl restart docker
修改配置后重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
查看版本
查看Docker 信息
Docker 帮助
二、镜像命令
列出本机Docker上已经安装的镜像:
搜索Docker hub上面的镜像
# 普通搜索,以Tomcat为例
docker search tomcat
# 搜索star大于50的镜像实例
docker search -s 50 tomcat
从Docker Hub上面下载镜像
# 以下载tomcat为例
docker pull tomcat[:version]
删除本地的某一个镜像
# 以删除tomcat为例
docker rmi tomcat[:version]
# 通过镜像ID删除
docker rmi -f 镜像ID
# 通过镜像ID删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 删除全部
# docker images -qa : 获取所有镜像ID
docker rmi -f $(docker images -qa)
镜像打包与运行
#打包一个我们自己的 tomcat
docker commit -a jianghai -m="package my tomcat" 要打包的镜像ID jianghai/tomcat:1.0
# -a : 作者名称
# -m : 打包信息
#启动我们自己打包生成的 tomcat
docker run -it -p 7700:8080 jianghai/tomcat:1.0
三、容器命令
启动容器
# 新建并进入容器,最后一个为本地容器的ID
docker run -it --name="rivercentos001" 9f38484d220f
# 为容器启一个名称
-name="新容器名称"
# 后台运行容器,并返回容器ID,也就是启动守护士容器
-d
# 以交互模式运行容器,通常与-t同时使用.
-i
# 为容器重新分配一个伪终端,通过与-i同时使用
-t
# 随机端口映射 [大写P]
-P
# 端口映射 [小写P]
-p
# 数据卷 加参数 ro:容器内的目录只读,不可写
-v /宿主机绝对路径目录:/容器内目录[:ro] 镜像名
查看当前正在运行的Docker 容器
# 参数
# 列出当前正在运行的以及历史上运行过的
-a
# 显示最近创建的容器
-l
# 显示最近创建的N个容器
-n
# 静默模式,只显示容器编号
-q
# 不截断输出
--no-trunc
退出容器
# 退出并停止
exit
# 容器不停止退出
ctrl+P+Q
启动容器
重启容器
docker restart 容器ID或容器name
停止
强制停止
删除容器
# 删除已经停止的容器
docker rm 容器ID或容器name
# 强制删除已经停止或正在运行的容器
docker rm -f 容器ID或容器name
一次性删除所有正在运行的容器
docker rm -f $(docker ps -qa)
重新进入容器
# 第一种方式
docker attach 容器ID或容器名称
# 第二种方式{隔山打牛式,在宿主机向容器发送命令并获取结果}
docker exec -t 容器ID或容器名称 ls# 列出文件列表
# 交互
docker exec -it rivertomcat /bin/bash
从容器内拷贝文件到宿主机
docker cp 容器ID或容器名称:/文件路径与文件名 宿主机地址
# 例,拷贝容器river的aaa文件夹下的a.txt到宿主机的当前位置
docker cp river:/aaa/a.txt .
四、日志命令
docker logs -f -t --tail 10 容器ID或容器名称
# 加入的时间戳
-t
# 跟随最新的日志打印
-f
# 输出最后几行的日志
--tail 行数
# 启动一个centos,并且每两秒在Console输出一个Hello jianghai
docker run -d --name river centos /bin/sh -c "while true;do echo hello jianghai;sleep 2;done"
# 查看最后10行的日志
docker logs -f -t --tail 10 river
#查看容器内的进程
docker top 容器ID或容器名称
DockerFile解析
FROM 基础镜像,当前新镜像是基于哪个镜像的。
MAINTAINER 镜像维护者的姓名和邮箱地址。
RUN 容器构建时需要运行的命令。
EXPOSE 当前容器对外暴露出的端口。
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,也不是运行并登录进来的当前目录位置。
ENV 用来构建镜像过程中设置环境变量。
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。
COPY 类似ADD,但只是复制,不带解压压缩包的功能。
VOLUME 容器数据卷,用于数据保存和持久化工作。
CMD 指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个会生效执行。
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的作用和CMD一样,都是在指定容器启动程序及参数
相当于CMD的升级版本,CMD只能执行一条命令,运行时如果加一些参数是不行的.但如果把CMD替换成ENTRYPOINT就可以在Run镜像的时候在尾部追回指令.
简单的说如果Run镜像的时候追回了命令,CMD会用追回的覆盖掉旧的,ENTRYPOINT会追回执行。
ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
下面将使用一个实际例子来深化对DockerFile的理解:
参考文章链接:
http://dockone.io/article/8350
https://www.cnblogs.com/runtimeexception/p/10942849.html
docker总结笔记:docker的安装、docker基本语法、Dockerfile、Docker Compose
原文:https://www.cnblogs.com/linuxtop/p/12256899.html