Docker初级篇
go语言开发的
只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
虚拟机的缺点:
1 资源占用多 2 冗余步骤多 3 启动慢
比较了 Docker 和传统虚拟化方式的不同之处:
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
docker把所有环境和软件打包成镜像
软件容器虚拟化
linux容器不是模拟整套操作系统。没有对硬件的虚拟,每个容器相互隔离。
docker三要素:
镜像:
容器:
仓库:docker hub
仓库pull到本地是镜像,每个镜像的实例就是容器
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(Repository)是集中存放镜像文件的场所。
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
CentOS7安装
查看linux版本 : cat /etc/redhat-release
yum 安装gcc
yum -y install gcc
yum -y install gcc-c++
卸载旧的版本
yum -y remove docker docker-common docker-selinux docker-engine
安装需要的软件
yum isntall -y yum-utils device-mapper-persistent-data lvm2
设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce/repo
更新yum包索引
yum makecache fast
安装docker ce
yum -y install docker-ce
启动docker
systemctl start docker
测试
docker version
docker run hello-world
配置镜像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
#网易云
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
#阿里云
{
"registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
卸载
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
运行hello-world
docker run hello-world
run一个镜像,以镜像为模板生成一个hello-world容器实例,先在本地查找,没有pull从阿里云拉取。
大海是当前宿主机
大鲸鱼是docker
集装箱是容器实例
容器实例通过镜像生成
帮助命令
docker version
docker info
docker --help
镜像命令
docker images 查看主机上得镜像
-a :列出本地所有得镜像
-q :只显示镜像ID
–digests:显示镜像摘要信息
–no-trunc:显示镜像完整信息
docker -search xxx 从ducker.hub查询
docker -search -s 30 tomcat点赞数超过30得
下载镜像 docker pull tomcat
docker pull tomcat:lasest 下载最新版,可以冒号后写版本号
删除镜像 docker rmi xxxx
删除单个docker rmi -f 镜像ID 强制删除
删除多个 docker rmi -f 镜像名1:TAG镜像名2:TAG
删除全部 docker rmi -f $(docker images -qa)
docker上安装centos镜像 docker pull centos
新建并启动容器,以centos模板启动容器
docker run [options] image []
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps 查看docker现在运行得容器
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
–no-trunc :不截断输出。
退出容器
exit 容器停止退出
ctrl +P+Q 容器不停止退出
启动容器
docker start 容器ID活容器name
重启容器
docker restart 容器id或者容器name
停止容器
docker stop 容器ID或者容器name
强制停止容器
docker kill 容器id或者容器名
删除已停止的容器
docker rm 容器ID
一次性删除多个
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
docker run -it --name centos0115 centos运行一个名为centos0115的容器
启动守护式容器 docker run -d 容器名
docker run -d centos
docker ps 没有记录,退出了
因为前端没有交互,后台应用自杀
查看容器日志 docker logs -f -t --tail 容器ID
-f 跟随最新的日志打印
-t 是加入时间
–tail 数字,显示最后多少条
docker run -d centos /bin/sh -c “while true;do echo hello zzyy;sleep 2;done”
后台进程一直打印
查看容器内的进程
docker top 进程ID
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器,并以命令行交互
容器通过ctrl+P+Q退出客户端后台运行
docker attach 容器ID 进入
不进入容器,在外面进行交互
docker exec -t dd58ceb041c7 ls -l /tmp
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
**
镜像
**
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
分层的镜像
为什么分层?
最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
docker镜像的commit操作
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m=“描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
启动tomcat对外提供服务,-p8888是docker的端口,8080是tomcat端口
docker run -it -p 8888:8080 tomcat
docker run -it -P tomcat 随机生成docker端口号
docker run -d -p 6666:8080 tomcat 后台启动
docker容器数据卷
容器的持久化
容器间继承+共享数据
数据卷
容器内添加,两种方法,直接命令添加,DockerFile添加
直接命令添加:
docker run -it -v /宿主机绝对目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
会新建这两个文件,一个在主机上,一个在容器内,数据共享
数据共享,可读可学
查看数据是否挂载成功?docker inspect 容器ID
容器停止,是否还数据共享?
可以共享/
docker run -it -v /宿主机绝对路径:/容器内目录:ro镜像名
ro是指readonly
**
DockerFile:
**
1 手动编写一个dockerfile文件,必须符合file规范
2 有了这个文件后,直接docker build 命令执行,获取一个自定义的镜像
3 run
dockerFile构建过程解析:
基础知识:1每条保留字指令都必须大写,后面至少跟一个参数
2 指令按照从上到下,顺序执行
3 # 表示注释
4 每个指令都会创建一个新的镜像层,并对镜像进行提交
dockerFile执行流程:
1docker从基础镜像运行一个容器
2 执行一条指令对容器进行修改
3 执行类似docker commit 操作提交一个新的镜像层
4 docker在基于刚提交的镜像运行一个容器
5 执行dockerfile中的下一条指令直到所偶有指令都执行完成
dockerFile是软件的原材料
docker镜像是软件的交付品
docker镜像则可以认为是软件的运行态
dockerFile面向开发,docker镜像称为交付标准,docker容器运维部署
三者关系
1dockerfile,需要定义一个dockerfile,定义了进程需要的一切东西,dockerfile涉及的内容包括执行代码或者文件,环境变量,依赖包,运行时环境,动态链接库,操作系统发行版,服务进程和内核进程。
2 Docker镜像,在Dockerfile定义一个文件之后,docker build时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务
3 docker 容器,直接提供服务
dockerFile保留字指令
FROM :基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER :镜像维护者和游戏
RUN : 容器构建时需要运行的命令
EXPOSE : 当前容器对外暴露的端口
WORKDIR : 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV :用来在构建镜像时候设置环境变量。
ADD :将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理url和解压tar包
COPY:类似ADD,拷贝文件到镜像,不能解压。COPY src dest或者COPY [“src”,“dest”]
VOLUME:容器数据卷,用于数据保存和数据持久化工作
CMD :指定一个容器启动时候要启动的命令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。
ENTRYPOINT:指定一个容器启动时候要启动的命令
ONBUILD: 当构建一个被继承的dockerFile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发。
案例:
Base镜像(scratch):docker Hub中99%的镜像都通过在base镜像中安装和配置需要的软件构建出来的。
自定义镜像centos:
初始目录是 /
精简版不支持vim ,ifconfig
自定义的centos目的使我们自己的镜像具备如下:
登陆后的默认路径
vim编辑器
查看网络配置ifconfig支持
编写dockerFile文件
vim DockerFile2
docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .
构建镜像,名为centos版本1.3 .是当前路径
docker images查看
运行新建的镜像docker run -it mycentos:1.3
检查pwd,ifconfig和vim
列出镜像历史 docker history 镜像images ID
ONBUILD
创建自定义tomcat
文件dockerFile
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
docker run
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9
总结
docker安装mysql
docker search mysql
docker pull mysql:5.6
docker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
命令说明:
-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。
–name mysql:运行服务名字
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。
-v /zzyyuse/mysql/data:/var/lib/mysql :将主机/zzyyuse/mysql目录下的data目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.6 : 后台程序运行mysql5.6
进行交互,进入到容器
docker exec -it MySQL运行成功后的容器ID /bin/bash
进入客户端mysql -uroot -p123456
安装Redis 3.2
docker pull redis:3.2
生成实例容器
docker run -p 6379:6379 -v /zzyyuse/myredis/data:/data -v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
发布到阿里云
通过commit生成centos1.4
docker commit -a lhk -m ‘new centos1.4 with vim and ifconfig’ c77d29f11e17 mycentos:1.4
push到阿里云