浅谈Docker
虚拟化:是资源的一种逻辑表示,并不会受限于物理资源,可以将一台物理资源丰富的服务器虚拟化成多个独立的性能一般的服务器;也可以将多台物理资源一般的服务器虚拟化为一台性能很好的服务器。通过上述描述就会发现:虚拟化就是一种基于逻辑的资源整合,进行资源的再分配,减少资源的损耗和淘汰,高效,弹性的使用物理资源。
在学习的过程当中,使用的VM就是一种虚拟化技术,VM给开发者提供了在windows当中方便运行Linux或者其他系统的可能,对初学开发的同学的来说提供了一个很好的虚拟环境,但是VM的安装文件大,使用占用资源多这些问题也成为了限制大家使用和开发的重要因素,所以docker兴起了。
Docker(码头工人),首先docker比VM确实有更加轻量,使用更加廉价的优势。
对比两种虚拟化,很显然,docker没有虚拟化系统内核,而是选择直接在宿主机的系统内核上进行其他虚拟化系统的运行,所以轻量很多。
但是这并不是docker兴起的主要原因,跟多的是在项目部署过程当中,从开发到测试,从项目开发到项目上线的标准化问题,在开发,测试和部署项目当中,最担心也是遇到的最多的问题就是项目的兼容问题,很有可能由于开发,测试和上线环境问题,导致兼容问题,甚至是项目崩溃,于是有了这样的设计思路:
开发一种独立的轻量级的环境,将项目部署到这个环境上,而这个环境本身有完整的标准化,且足够轻量,所以之后考虑的就不再是兼容问题,而是直接跑这个环境,那么这种思路就是docker。
docker提供了一个轻量级的虚拟化方案,开发者可以在这个虚拟化环境当中进行开发,一旦完成之后测试和运维直接跑这个虚拟化环境,所以就很大程度的规避了兼容和环境导致的项目失败问题。
在docker学习的过程当中,必须要知道一些基本的概念和原理:
作为开发,在docker使用过程当中,必须需要注意上述的概念:
Client部分:在docker安装完成之后,开发者可以通过命令行进行控制,这个部分就是用户操作的部分。
Docker Server部分:实际上操作docker在系统当中是以一个服务或者进程存在的,在这个服务当中保存在可以为开发者提供的资源,这部分也是开发者需要着重了解的部分,docker虚拟机是由image镜像和container容器组成的:
image:类似VM当中的镜像,里面是指定好的系统和应用,但是不可以直接使用
container:用来加载镜像,形成具体的虚拟化实例(也就是虚拟机),提供给开发者使用
Registry 仓库:用来存放镜像,类似git的仓库,开发者可以从仓库当中下载或者上传镜像。
所以使用docker的过程就是:
1、 从仓库当中下载镜像
2、 然后用容器加载(运行)镜像开始开发
3、 将修改后的容器再次编译成镜像上传到仓库
4、 测试使用二次编译的镜像直接测试
5、 运维直接部署二次编译的镜像
从这个角度上看,镜像更类似在python面向对象过程当中的一个类,而容器运行镜像形成的就是实例,真正的操作和修改都作用于实例。
所以上述的图可以用下面的轨迹进行描述,当然命令会在后面的课程学习
Docker 安装
1、 安装FastDFS Linux依赖包
yum install libevent libevent-devel gcc* -y
2、 安装docker
yum install docker -y
3、 启动docker服务,查看版本
systemctl start docker
docker version
Docker基本命令
docker命令本身有很多参数选项,有的使用比较频繁,有的在个别特殊的情况下才可能用到,建议在初学的同学首先掌握常用的命令和参数,然后在附录里面查看所有的参数。
Image
1、 查询image
docker search python
结果
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/python Python is an interpreted, interactive, obj... 5281 [OK]
docker.io docker.io/django Django is a free web application framework... 970 [OK]
docker.io docker.io/pypy PyPy is a fast, compliant alternative impl... 241 [OK]
docker.io docker.io/kaggle/python Docker image for Python scripts run on Kaggle 141 [OK]
0
docker search 查询所有当前源地址上的类似镜像
查询返回的字段
index 镜像索引
name 镜像仓库源的名称
description 镜像描述
stars 点赞
official 是否官方发布
automated 自动构建
2、 下载image
docker pull python
docker pull python:3.7
3、 查看image
docker image list
4、 删除image
docker rmi image_id
Containers
1、 创建containers
docker container create [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器实例
docker container create 是命令的主体
[OPTIONS] 代表docker可以使用的选项,带有中括号代表可以写,也可以不写
--name 指定docker容器实例的名称,如果不写,采用默认名称命名实例
-i 保持标准输入的开启
-t 分配tty设备,该可以支持终端登录,默认为false
IMAGE 指的是创建容器实例加载的镜像,必须指定
[COMMAND] 启动容器实例后执行的命令 通常会写/bin/bash 其实就是指开启命令行
案例一:
需要先执行:
docker pull centos
创建一个centos的实例
[root@localhost ~]# docker container create centos
c4e003a9c41d6911a9d0b3d816c7a31a67e1767277cd151fef788245dbcd7c4e
[root@localhost ~]# docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4e003a9c41d centos "/bin/bash" 20 seconds ago Created stupefied_meninsky
案例二:
创建一个名字为contos1的centos实例
[root@localhost ~]# docker container create --name Centos1 centos
976fd40a03bdaf662d7e46d8b193c721b6e86e026ba63c2ed08f422c28aaf213
[root@localhost ~]# docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
976fd40a03bd centos "/bin/bash" 2 seconds ago Created Centos1
案例三:
创建一个记录标准数据输出的centos实例
[root@localhost ~]# docker container create -it --name Centos2 centos
14aa970305e18375aaca6bdf6f395d6d893c11599bbbea06cd192540acbeda1d
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14aa970305e1 centos "/bin/bash" 46 seconds ago Created Centos2
2、 查看containers
docker container list --all
3、 启动containers
docker container start
-a 参数带上了的话,那么会把pid1程序的输出都带到终端上
-i 添加容器的输入
docker container run
-a 参数带上了的话,那么会把pid1程序的输入输出都带到终端上
-c 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d 指定容器运行于前台还是后台,默认为false
-h 指定容器的主机名
-I 保持标准输入的开启
-l 设置容器的源数据
-m 限制容器内应用使用的内存,单位可以是b、k、m或g
-p 将容器的端口发布到主机
-P 随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-t 分配tty设备,该可以支持终端登录,默认为fa
-u 指定容器的用户
-v 给容器挂载存储卷,挂载到容器的某个目录
-w 指定容器的工作目录
docker container run = docker container create + docker container start
4、 停止containers
docker container stop container_id #等待关闭之后停止
docker container kill container_id #杀死进程
5、 启动containers
docker container start
-a 参数带上了的话,那么会把pid1程序的输出都带到终端上
-i 添加容器的输入
docker container exec 对指定的容器执行命令,并把结果返回回来
例一:查看Centos2实例的根目录:
docker container exec Centos2 ls
例二:切入Centos2进行更多命令操作
docker container exec -it Centos2 /bin/bash
docker container attach Centos2
注意:切入容器实例之后可以用
ctrl+p+q 退出实例,但是保持容器实例运行
exit命令,退出并且关闭容器实例
docker container run
-a 参数带上了的话,那么会把pid1程序的输入输出都带到终端上
-c 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d 指定容器运行于前台还是后台,默认为false
-h 指定容器的主机名
-I 保持标准输入的开启
-l 设置容器的源数据
-m 限制容器内应用使用的内存,单位可以是b、k、m或g
-p 将容器的端口发布到主机
-P 随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-t 分配tty设备,该可以支持终端登录,默认为fa
-u 指定容器的用户
-v 给容器挂载存储卷,挂载到容器的某个目录
-w 指定容器的工作目录
docker container run = docker container create + docker container start
6、 删除containers
docker container rm container_id
打包新的镜像:
上述可以对容器实例进行初步的修改,修改后的容器实例当中已经拥有了项目的功能,那么现在就可以进行镜像打包了,就是讲修改后的容器实例再次封装成一个镜像。在docker当中,封装镜像有两种方法:
1、 使用命令
docker commit -a "bian<3392279511.qq.com>" -m "set image test" Centos2 laobian/centos2
2、 使用docker_file
DockerFile
在工作当中直接把镜像拷贝给其他同事的操作其实不多见,更多的时候是传递镜像文件,然后通过镜像文件来构建镜像,那这里的镜像文件其实就是描述镜像的文件。
docker常用预留字
预留字 |
预留字描述 |
FROM |
镜像来源,镜像的父镜像 scratch所有容器的父容器 |
MAINTAINER |
作者名和邮件 laobian<laobian@qq.com> |
RUN |
在构建镜像的时候执行,比如安装命令 |
EXPOSE |
暴露的端口,提供给命令 -p 绑定 |
WORKDIR |
切入容器的初始化目录 |
ENV |
变量声明 ENV MYPATH /opt 使用变量$MYPATH |
ADD |
从宿主机复制并解压目录到容器机 |
COPY |
从宿主机复制目录到容器机 |
VOLUME |
挂载 单个目录直接写 多个目录需要用列表 |
CMD |
执行命令,只能执行一条,写多条,最后一条覆盖前面的命令 |
ENTRYPOINT |
追加式执行 |
ONBUILD |
在作为父镜像构建时回调执行 |
构建流程
1、 创建一个目录(建议)
mkdir -p /opt/MyDocker
2、 编写docker文件(名称必须为Dockerfile)
vim Dockerfile
3、 编写docker文件
FROM centos RUN yum install wget -y CMD /bin/bash
4、 进行镜像构建
docker build -f /opt/MyDocker/Dockerfile -t laobin/centos:v2 .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM centos
---> 831691599b88
Step 2/3 : CMD yum install wget
---> Running in b53c7e154277
---> ba4d2c1a4fd7
Removing intermediate container b53c7e154277
Step 3/3 : CMD /bin/bash
---> Running in 37bb18c00ec2
---> bccf8434eece
Removing intermediate container 37bb18c00ec2
Successfully built bccf8434eece
案例加深
使用命令挂载目录
--privileged=true 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
FROM centos:7 ENV MYPATH /opt WORKDIR $MYPATH ADD nginx-1.12.2.tar $MYPATH RUN yum -y install make crypt pcre pcre-devel zlib zlib-devel openssl gcc* RUN cd $MYPATH/nginx-1.12.2 && $MYPATH/nginx-1.12.2/configure && make && make install RUN ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx EXPOSE 80 CMD /bin/bash
使用:
docker container run -it --name nginx_test -p 80:80 -v /opt/nginx/html:/usr/local/nginx/html --privileged=true c5f0cbfff9fd /bin/bash
使用DOCKERFILE挂载
FROM centos:7 ENV MYPATH /opt WORKDIR $MYPATH ADD nginx-1.12.2.tar $MYPATH RUN yum -y install make crypt pcre pcre-devel zlib zlib-devel openssl gcc* RUN cd $MYPATH/nginx-1.12.2 && $MYPATH/nginx-1.12.2/configure && make && make install RUN ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx VOLUME /usr/local/nginx/html EXPOSE 80 CMD /bin/bash
使用:
docker container run -it --name nginx_test1 -p 8000:80 --privileged=true ba9c39c76389 /bin/bash