Docker快速入门(上)
docker介绍与安装
介绍
Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
docker的优势或者特点
1. 更高效的利用系统资源
2. 更快速的启动时间
3. 一致的运行环境
4. 持续交付和部署
5. 更轻松的迁移
6. 更轻松的维护和扩展
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟即 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker的主要用途,目前有三大类
1. 提供一次性的环境.比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境.
2. 提供弹性的云服务.因为 Docker 容器可以随开随关,很适合动态扩容和缩容.
3. 组建微服务架构.通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构.
docker的扩容与缩容
对于我们的系统来说在项目运行过程中会存在这最高峰值,和最低峰值;
整个项目运行过程中并不是一直是平稳的访问,对于这种时候如果说一次性就部署N个机器但是实际上只有在某几个时候有高峰期其余时间没有就会显得比较浪费,
这个时候如果说通过docker虚拟多个机器,然后通过多docker进行控制启动与停止实现扩容和缩容
1. 加速本地开发。通过Docker能够快速搭建好开发和运行环境,并且该环境可以直接传递
2. 给测试和产品部署。
3. 自动打包和部署应用。
4. 创建轻量、私有的PaaS环境。
5. 自动化测试和持续集成/部署。
6. 部署并扩展Web应用、数据库和后端服务器。
7. 创建安全沙盒
docker的应用范围
安装
本次安装的docker版本为docker-ce-18.03.1.ce,系统版本centos7
#1、更新update到最新的版本
yum update
#2、卸载老版本docker
yum remove docker docker-common docker-selinux docker-engine
#3、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#4、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#5、查看docker版本
yum list docker-ce --showduplicates|sort -r
#6、安装docker
yum install docker-ce-18.03.1.ce -y
#7、启动docker
systemctl start docker
#8、加入开机自启
systemctl enable docker
#9、配置国内镜像
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
#10、重启docker
systemctl start docker.service
#11.查询docker运行状态
ps -aux | grep docker
docker运行状态
docker常用的基本命令介绍
查询docker镜像信息
命令: docker images
运行结果:
名称 | 含义 |
---|---|
REPOSITORY | 镜像名称 |
TAG | 镜像标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
拉取镜像
命令 docker pull 镜像名(如:centos,ubuntu),例子:docker pull ubuntu
运行结果:
删除镜像
删除指定镜像
命令: docker rmi 镜像id(image id) 如: docker rmi ff0fea8310f3
运行结果:
强制删除指定镜像
命令: docker rmi -f 镜像id(image id) 如: docker rmi -f ff0fea8310f3
运行结果:
删除docker全部镜像
命令: docker rmi $(docker images -q)
运行结果:
运行镜像文件
命令 docker run --itd --name 容器名称,可以自定义(如:ubuntu_base) 镜像名:标签(如 ubuntu:latest)
docker run命令详解
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
运行结果
查询容器
命令: docker ps
docker ps命令详解
OPTIONS说明:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
运行结果
进入docker容器命令
命令:docker exec -it 容器名称(如:ubuntu_base) 执行类型,这个可以从docker ps容器列表中的COMMAND看到(bash/sh) 例子: docker exec -it ubuntu_base bash
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
运行结果:
容器的启动和关闭
启动命令: docker start 容器名称(如:ubuntu_base)
启动命令运行结果:
关闭命令: docker stop 容器名称(如:ubuntu_base)
关闭命令运行结果 :
删除容器(指定容器)
命令 : docker rm 容器名称(如:ubuntu_base)
运行结果
删除容器(全部容器)
命令 : docker rm $(docker ps -a -q)
导出容器
命令: docker export 容器名称(如:ubuntu_base) > 容器名称.tar 例子: docker export redis5 > redis5.tar
运行结果:
导入容器
命令 : docker import 容器文件(redis5.tar) redis5:v1
运行结果:
导出镜像
命令 : docker save 镜像名称(ubuntu) > 文件名.tar 例子 : docker save ubuntu > ubuntu_base.tar
运行结果 :
导入镜像
命令 : docker load < 文件名.tar 例子: docker load < ubuntu_base.tar
运行结果 :
save-load和import-export对比
类型 | 导出的对象 | 导出文件大小 | 是否可回滚到历史层 |
---|---|---|---|
export & import | 将容器导出 | 小 | 否 |
save & load | 用来将一个或多个image打包 | 大 | 是 |
相对于文件大小来说,save方式导出的文件比export方式导出的文件大
正是因为save方式保存了镜像的历史和层(layer),使其可以层回滚,即回滚到之前的历史层,
所以save方式导出的文件稍微大一些反观export方式,在导出过程中丢失所有的历史,导致其不可以层回滚,导出的文件会小一些可以通过 docker history 镜像名看到层关系
登录docker hub
命令 : docker login
发布
发布镜像的前提是必须要登录
执行命令结果:
第一个dockerfile的文件创建
dockerfile介绍
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
dockerfile常用指令介绍
FROM 指定基础镜像
指定待扩展的父级镜像。除了注释外,在文件开头必须是一一个FROM指令, 接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个FROM指令。
通过添加多个FROM命令可以在同一个Dockerfile文件中创建多个镜像。
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
就像我们之前运行了一个redis镜像的容器,再进行修改一样,基础镜像是必须指定的。
而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如ubuntu 、 debian 、 centos、 alpine 等这些操作系统的软件库
一般会以alpine为主,因为节约的资源比较少
RUN 执行命令
RUN 指令是用来执行命令行命令的。
格式:
RUN \<command\> (类似/bin/sh -cshell格式)
RUN ["executable", "param1", "param2"] (exec格式)
类似shell脚本风格的:
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
MAINTAINER
用来声明创建的镜像的作者信息。在上述代码中,xxh是用户名,xxh@qq.co .是邮箱。这个命令并不是必需的。
EXPOSE
用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。
运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器或主机就可以通过映射后的端口与此容器通信。
同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。
ADD
向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以是一个文件夹
ENV
设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量
编写dockerfile注意事项
注:Dockerfile 中每一个指令都会建立一层, RUN 也不例外。
每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,
执行结束后, commit这一层的修改,构成新的镜像。
使用 Dockerfile 定制镜像而上面的这种写法,创建了很多层镜像。
这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。
结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。
这是很多初学Docker 的人常犯的一个错误。Union FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。
第一个dockerfile文件(构建redis5)
构建redis5-docker前的软件准备,如下图所示
dockerfile文件
#设置镜像
FROM centos:centos7
#复制文件
COPY ./Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
#更新镜像源
RUN yum clean all && yum makecache && yum -y update
#创建redis用户组和用户
RUN groupadd -r redis && useradd -r -g redis redis
#安装redis前环境准备
RUN yum -y install epel-release wget gcc automake autoconf libtool make gcc gcc-c++
#创建data目录和新文件
RUN mkdir /data && touch /data/redis-5.0.7.tar.gz
#共享data文件夹
VOLUME /data
#复制redis5的压缩包
COPY ./redis-5.0.7.tar.gz /data/redis-5.0.7.tar.gz
#解压redis5
RUN tar -zxvf /data/redis-5.0.7.tar.gz
#进入解压好的redis5并编译
RUN cd /redis-5.0.7 && make && make PREFIX=/data/redis-5.0.7 install
#开放端口
EXPOSE 6379
构建命令: docker build -t 镜像名称,可以自定义(redis5) .
执行结果
构建redis6镜像(dockerfile文件),未执行过,需要尝试
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y && yum install epel-release -y
RUN yum install wget -y && yum -y install bzip2
RUN wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.gz
RUN mkdir -p /usr/src/gcc
RUN tar -xvf gcc-7.1.0.tar.gz -C /usr/src/gcc
RUN cd /usr/src/gcc/gcc-7.1.0 && ./contrib/download_prerequisites
RUN mkdir /usr/src/gcc/gcc-7.1.0/build
RUN cd /usr/src/gcc/gcc-7.1.0/build && ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
RUN cd /usr/src/gcc/gcc-7.1.0/build && make && make install
RUN wget https://github.com/antirez/redis/archive/6.0-rc2.tar.gz
RUN mkdir -p /usr/src/redis
RUN tar -zxvf 6.0-rc2.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-6.0-rc2/ && CC=/usr/local/bin/gcc make && make install
docker的镜像结构
镜像
Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Mysql或用户需要的其它应用程序。
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统被称为UnionFS。 镜像可以基于Dockerfile构建,Dockerfile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
容器
Docker利用容器来运行应用。
Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机, 可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库
如果你使用过git和github就很容易理解Docker的仓库概念。Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
Docker仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register) 来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。 Docker运行中使用的默认仓库是Docker Hub公共仓库。
仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
镜像结构
如下图展示了Docker镜像的系统结构。镜像的最底层必须是一个称为启动文件系统( bootfs )的镜像,用户不会与这一层直接打交道。bootfs的上层镜像叫作根镜像 ( rootfs ),它在通常情况下是一个操作系统,如Ubuntu、 Debian 和CentOS等。
用户的镜像必须构建于根镜像之上。
图中所示的镜像1是通过在根镜像ubuntu上安装 MySQL来创建的。
在镜像1的基础上再安装一个redis,就又创建了镜像2。
利用镜像2启动的容器里面运行的是一个已 经安装好了MySQL和Nginx的centos系统。
参考资料
- docker入门到实践