部分图取自https://www.bilibili.com/video/av27122140
为什么会有Docker出现
总结:开发和运维之间项目启动的环境问题,导致可能出现bug。Docker通过把原始环境直接搬运过来,解决了这个问题。
因为一个产品从开发到上线,从操作系统到运行环境,再到应用配置。作为开发+运维的协作我们需要关心很多东西。不同版本的迭代,环境兼容问题,都是对运维的考验。
Docker的理念
目标是:Build,Ship and Run Any App,Anywhere
一次安装,到处运行
Docker能干什么
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
下载中的问题
CentOS Docker安装的时候
只支持
CentOS 7 (64bit)
CentOS 6.5(64bit)或者更高
使用uname -r 查看自己系统相关信息
Docker的基本组成
镜像:就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
相当于Person p= new Person(); 左边相当于容器(对象),右边相当于镜像(类)
容器:可以看成是一个简易的Linux环境(包括root用户权限,进程空间,用户空间,等)
容器的定义和镜像几乎一模一样,唯一的区别是在于容器最上面那一层的可读可写的
仓库:集中存放镜像文件的场所
CentOS6.8安装安装步骤
(之前没有安装过得掠过)CentOS-6 中 安装 docker-io 之前需要先卸载 docker 包。
sudo yum -y remove docker
1 、 yum install -y epel -release
Docker使用EPEL发布,RHEL系得OS首先要确保已经持有EPEL仓库,否则先检查OS得版本,然后安装相应得EPEL包
2 、 yum install -y docker -io
3 、安装完成后得配置文件: /etc/sysconfig/docker
正常存在就ok
4 、启动Docker后台服务: service docker start
5 、docker version验证
CentOS7安装安装步骤
较旧的Docker版本称为docker或docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
1、设置存储库
安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。
yum install -y yum-utils
2、此时官网上得地址下载可能会出问题
推荐使用
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(如果出现Failed to set locale, defaulting to C.UTF-8
echo “export LC_ALL=en_US.UTF-8” >> /etc/profile
执行命令后重新登录即可
)
3、更新yum软件包索引 yum makecache fast
4、安装DOCKER CE yum -y install docker-ce
5、启动docker systemctl start docker
6、查看版本docker version 或者docker run hello-world
7、配置镜像加速度
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
“registry-mirrors”:[“https://{}”.mirror.aliyuncs.com]
}
systemctl daemon-reload
systemctl restart docker
8 卸载步骤
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
Docker启动
当 Docker 安装完成之后,你需要启动 docker 进程。
sudo service docker start
如果我们希望 Docker 默认开机启动,如下操作:
sudo chkconfig docker on
HelloWorld
docker run hello-world
我已经下载过一次helloworld 所以可能有点不一样,但是出来了Hello from Docker就是正常的
Docker运行底层原理
Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行再主机上的容器。
容器,是一个运行时环境,就是我们说的集装箱。
Docker是秒级的,虚拟机是分钟级的
Docker帮助命令
docker version 查看docker版本
docker info 查看docker本地的一些信息
docker help 查看docker的一些命令
Docker镜像命令
docker images 列出本地主机上的镜像
PEPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
相关指令附加
-a 列出本地所有镜像(包含中间映像层)
-q 只显示镜像id
–digests:显示镜像的摘要信息
–no-trunc:显示完整的镜像信息
docker search 某个镜像的名字
相关指令附加
-s列出收藏数不小于指定值的镜像 docker search -s 30 tomcat
–automated:只列出automated build类型的镜像 docker search --automated tomcat
–no-trunc:显示完成的说明docker search —no-trunc tomcat
docker pull 镜像的名字[:TAG] 没写版本自动添加latest
docker rmi 镜像的名字id 后面没写版本等,默认删除latest 删除镜像
如果程序正在启动 加 -f 强制删除
删除单个 docker rmi -f 镜像id
删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部 docker rmi -f${docker images -qa}
Docker容器命令1
有镜像才能创建容器,这是根本前提
新建并启动容器 : docker run -it 镜像的名字,或者id
docker run [OPTIONS] images [ COMMAND][ARG…]
OPTIONS:
–name=“容器新名字”:为容器指定一个名称:
-d:后台运行容器,并返回容器id,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有4中格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
列出当前所有正在运行的容器 docker ps[OPTIONS]
-a:列出当前所有正在运行的容器+历史运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
–no-trunc:不截断退出
退出容器 exit 容器停止退出 ctrl+p+q 容器不停止退出
停止容器 docker stop 容器id或者容器名字
强制停止 docker kill 容器id或者容器名字
删除已经停止的容器
docker rm 容器id
删除多个docker rm -f ${docker ps -a -q}
docker ps -a -q |xargs docker rm
启动容器 docker start 容器id或者容器名字
重启容器 docker restart 容器id或者容器名字
Docker容器命令2-重要
启动守护式容器
docker -run -d 容器名 此时docker ps是查不到的
docker ps -a 会发现容器已经退出
Docker容器后台运行,就必须有一个前台进程
如果容器运行的不是一起挂起的命令,会自动退出
查看容器日志 docker logs -f -t–tail容器id
docker run -d centos /bin/sh -c “while true;do echo hello xxxx;sleep 2;done”
-t 加入时间戳
-f 跟随最新的日志打印
-tail 数字 显示最后多少条
查看容器内运行的进程 docker top 容器id
查看容器内部细节 docker inspect 容器id
进入正在运行的容器并以命令行交互
docker exec -it 容器id ls -l /tmp 在外部就可以直接查看
重新进入 docker attach 容器id
attach和exec区别
attach直接进入容器启动命令的终端,不会启动新的进程
exec是在容器中打开新的终端,并且可以启动新的进程
从容器内拷贝文件到主机上docker cp 容器id:容器内路径 目的主机路径
Dokcer镜像原理
Dokcer镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时,库,环境变量和配置文件
Docker的镜像实际上是由一层层的文件系统组成,这种层级的文件系统UnionFS
UnionFS(联合文件系统)
例如:一个tomcat中需要多层,最内层kernel内核,在外层centos,在外层,jdk8,在外层tomcat,所以内存下载下来比较大,在pull的时候会由的很多层,对外只暴露最外层
为什么要采用分层结构
共享资源
当多个资源都需要相同的镜像,在宿主机上只用保存一份镜像
镜像的每一层都可以被共享
特点
镜像都是只读的,
当容器启动时,一个新的可写层被加载到镜像的顶部
这一层通常被称为“容器层”,容器层之下的都叫镜像层
Docker镜像commit操作补充
docker commit 提交容器副本使之称为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器id
要创建的目标镜像名:[标签名]
例子:docker run -it -p 8080:8080 tomcat
第一个8080是docker对外暴露的端口 第二个8080是真正tomcat在的端口
-p固定端口
-P随机分配
Docker容器数据卷
是什么
用来保存数据在docker中我们使用的卷
因为Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后自然就不存在了。
所以数据需要持久化。
能干嘛
持久化
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续没有容器使用为止
数据卷用V命令添加
命令:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos 这个只有只读权限
使用docker inspect 容器id
有这部分就表示成功
此时在主机中新建一个文件
touch host.txt
在docker的centos的dataVolumeContainer下也存在相同的文件
此时容器和宿主机就共享文件了
就算容器退出了,主机修改后也是同步的
用DockerFile添加
Hello.java —》Hello.class
Docker images—》DockerFile
在根目录下新建mydocker文件夹进入
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeCOntainer2" ]
CMD echo “finished, -----successl”
CMD /bin/bash
build后生成镜像 获得一个新镜像xxxx/centos
docker build -f /mydocker/dockerfile -t xxxx/centos .
此时就会用指定路径的文件 用数据卷生成新的镜像文件
run容器
此时想要查看主机跟目前共享的容器就使用inspect
可以查看共享的目录
数据卷容器–volumes-from
命名的容器挂载数据卷,其他容器通过挂在这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
一句话:活动硬盘上挂活动硬盘 ,实现数据的传递依赖
先启动一个父容器dc01 —在dataVolumeContainer2新增内容
docker run -it --name dc01 xxxx/centos
docker run -it --name doc2 --volumes-from dc01 xxxx/centos
此时他们就绑定好了可以同步数据
如果删除1,2跟3也可以继续共享
生命周期一直持续到没有容器使用它为止
DockerFile解析
是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建3步骤 1编写DockerFile文件 2docker build 3docker run
DockerFile内容基础知识
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
DockerFile保留字指令
FROM :基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUM:容器创建时需要运行的命令
EXPOSE:当前容器对外暴露的端口
WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV:用来在构建镜像过程中设置环境变量
ps:ENV MY_PATH /user/mytest 引用的时候$MY_PATH
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中 ,将从构建上下目录中<源路径>
的文件/目录复制到新的一层的镜像内的<目录路径>位置
VOLUME:容器数据卷,用于数据的保存和持久工作
CMD:指定一个容器启动时要运行的命令
dockerfile中可以由多个cmd命令,但是只有一个生效,cmd会被docker run之后的参数覆盖
ENTRYPOINT:指定一个容器启动时要运行的命令
entrypoint的目的和cmd一样,都是在指定容器启动程序及参数
ONBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像
的onbuild被触发
自定义镜像mycentos
docker本身的centos是不支持vim 和ifconfig的
我们自定义让他拥有
FROM centos
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
然后 build
docker build -f /mydocker/dockerfile -t mycentos:1.3 .
用新的镜像运行
就正常运行了
自定义镜像tomcat9
-
mkdir -p /xxxxuse/mydockerfile/tomcat9
-
在上述目录下 touch c.txt
-
将jdk和tomcat安装的压缩包拷贝进上一步目录
apache-tomcat-9.0.8.tar.gz
jdk-8u171-linux-x64.tar.gz
-
在/xxxxuse/mydockerfile/tomcat9目录下新建Dockerfile文件
-
构建 build
-
运行 run
安装mysql
先查本地是否已经安装 用 docker images mysql
如果没有就docker search mysql
docker pull mysql:版本号
下载完成就run
docker run -p 12345:3306 --name mysql -v /xxxxuse/mysql/conf:/etc/mysql/conf.d -v /xxxxuse/mysql/logs:/logs -v /xxxxuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
docker exec -it 容器id /bin/bash
导入内部的数据成文件备份
安装redis
docker pull redis:3.2
docker run -p 6379:6379 -v /xxxxuse/myredis/data:/data -v /xxxxuse/myredis/conf//redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
vim /xxxxuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf/redis.conf
把redis的基本配置写入
本地镜像发布到阿里云
方法1编写DockerFile
方法2从容器中创建一个镜像
docker commit [options] 容器id [repository:[:TAG]]
-a 作者
-m 提交时的说明文字
docker commit -a xxxx -m “new mycentos 1.4 from 1.3” 容器id mycentos:1.3
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
创建本地镜像
然后点管理
运行下面的代码