背景
在公司做开发,一般的模式是开发人员把代码写完测试完成后提交到测试开发环境,觉得没问题,
然后由运维人员提交到测试环境,在这个过程中,会出现一些不愉快的情况,
比如,程序在开发环境下好好的,在测试环境下又有问题出现,而这个过程中,
运维是没有修改开发人员的代码,那么造成这个问题的原因是什么呢?
其实主要还是程序运行的环境不同,这个环境就是我们所说的配置、数据、操作系统等因素,
那么这个问题怎么解决呢?
为什么会出现docker
docker的出现就是为了解决上述问题,简单说就是,
开发人员使用docker把开发环境和程序打包给运维,
再由运维放到测试环境上,那么开发环境和测试环境就保持一致了。
docker和虚拟机的区别
我们知道类似于vmware这样的虚拟机软件,安装一个linux系统时,会模拟一套真实硬件环境,
比如显卡,声卡,硬盘,网络适配器...很复杂,当然启动速度会变慢,而docker只是模拟一套内核,
对于硬件可以使用宿主机的,所以启动速度会比虚拟机快很多
1、docker安装
centeros 7 安装
卸载就版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test
yum install docker-ce
开启docker服务
systemctl start docker
验证docker服务
ps -elf | grep docker
2、配置阿里云加速器
登录dev.aliyun.com
登录账号
重新进入 dev.aliyun.com
点击管理中心
选择docker加速器
vim /etc/docker/daemon.json
将下面的文本写入这个json文件中
***我测试没有成功,不过不影响学习
3、运行hello-world
根据国际惯例运行helloWorld
docker run hello-world
4、docker的底层原理
5、镜像的常用命令
docker version 类似于java -version用来查看docker的版本
docker info 查看docker的相关信息
docker --help 这是最重要的一个命令,所有的docker命令的用法都通过这个命令来查看使用方法
5.1 和镜像相关的命令
docker images 列出本地所有的镜像列表
-a 所有镜像含有中间镜像层(一个镜像可能依赖其他镜像,使用这个选项可以显示当前镜像中依赖的所有镜像)
-q 静默模式、只显示镜像的id
--digests 显示摘要信息(digests:摘要,文摘)
--no-trunc 显示完整的id信息
docker search [镜像名] 在hub.docker.com上查找镜像
-s 50 表示过滤出star数超过50个的
--no-trunc: 显示完整的镜像描述信息
--automated 只列出auto_mated build类型的镜像
docker pull [tomcat:tag] 从拉取镜像
docker rmi [镜像名] 删除本地的某个镜像
-f 强制删除
docker rmi -f 镜像名:tag 镜像名:tag 删除多个镜像
docker rmi -f $(docker images -qa) 删除所有镜像
5.2 容器相关的命令
新建并启动容器
如果本地有就直接使用本地的如果本地没有就去远程仓库拉取该镜像并运行这个镜像的一个实例(容器)
docker run [options] image [command][args]
-i 以交互式的方式启动容器
-t 伪终端
相当于开日某个服务后开启一个终端,相当于打开VM上装了一个虚拟机并使用Xshell连接到这个虚拟机上
--name 给容器起名字 如果没有指定就默认生成
docker run -it imageId
docker run -d centos 以后台进程的方式启动容器(注意:启动后会立马自杀)
docker run -d centos /bin/sh -c "while true;do echo 11;sleep ;done"
列出所有运行的容器
docker ps
-a 正在运行的加上历史运行的
-l 上一个运行过的容器
-n 前n个运行容器
-q 静默模式 只显示容器ID
退出容器
exit 离开并关闭
ctrl +P+Q 离开并不关闭
docker exec -it 容器ID /bin/bash
docker attach 容器ID
区别:
attach 直接计入容器启动命令的终端 不会启动新的进程
exec 在容器中打开新的终端 并且可以启动行的进程(不进入容器中直接执行命令)
eg:docker exec -t xxxId /bin/bash 登录到xxxId代表的容器中并打开终端
docker exec -t xxxId ls -l / 直接查看根目录下的内容
docker attach xxxId 登录到容器并打开终端
docker run -it --name mycenteros centos
表示运行centos并且起名字叫mycenteros,已交互式的方式运行,
重启容器
docker restart 容器id/容器名 可以通过docker ps 查看其运行的时间
停止容器
docker stop 容器id/容器名
强制停止容器
docker kill 容器id/容器名
删除已经停止的容器
docker rm 容器ID/容器名 -f 表示强制删除
一次性删除多个容器
docker rm -f $(docker ps -q -a)
docker ps -a -q | xargs docker rm
查看容器日志
docker logs -f -t --tail 容器id
-t 时间
-f 追加
--tail 3 表示只看最后3行
查看容器内的进程
docker top 容器ID
查看容器内部的细节
docker inspect 容器ID 以json格式返回全部细节
从容器内拷贝文件到主机上
docker cp containerId:containerPath hostPath
docker 镜像的原理
联合文件系统
比如Tomcat要运行起来就要有内核 centos jdk tomcat
而内核是相同的,内存只需要加载一份内核就可以为所有的容器提供服务
提交容器副本使之成为一个新的镜像
docker commit -m="注释" -a="作者" 容器ID 前缀/目标镜像名:[标签名]
比如把某个容器做修改后提交为一个新的镜像
实验:自己做一个镜像
docker run -it -persistent-data -p 8088:8080 tomcat 宿主机的8088映射到docker容器的8080端口 -P是的随机指定
6、容器数据卷
作用:
-v (volume) 表示添加一个容器卷也就是说给虚拟的centos添加一块外接移动硬盘,这个目录上的数据对应宿主机上一个目录,实时和宿主机上的对应目录内容一样,这样就可以实现
1、容器数据的持久化
2、容器间数据的共享
docker run -it -v /宿主机的绝对路径:/容器被的目录 镜像名
在宿主机中添加一个文件后容器中的对应的目录也会出现这个文件,实现宿主机和容器的数据共享
当容器停止后 在宿主机的对应文件夹下新建的文件在同容器开启后会再次同步过去
docker run -it -v /宿主机的绝对路径:/容器被的目录:RO 镜像名
RO read only 容器内的数据只读 容器中不能写只能读
7、Docker File
Docker File
是对镜像(image)的描述文件
如果在dockerfile文件中添加容器卷 则可以通过docker inpect查看默认的
一般步骤
1、编写Dockerfile,手动编写一个符合file文件规范的dockerfile文件
2、docker build构建镜像,运行docker build命令 获得一个自定义的镜像
3、运行镜像,run运行这个镜像的实例(容器)
dockerfile的构建过程解析
1、docker从基础镜像运行一个容器
2、执行一条指令对容器做出修改
3、执行类似docker commit的操作提交一个新的镜像层
4、docker在基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令知道所有的指令完成
dockerfile基本语法介绍之保留字指令
dockerfile的作用是通过在原有镜像的基础上修改一些配置,
最终制作出符合当前业务的新的镜像,可以简单的理解为一个配置文件,
比如centos的dockerfile,centos是一个很大的软件,即使是内核也很大,他有很多地方可以做配置,
而dockerfile类似于一个配置文件,但它比配置文件的作用更强大,
除了做配置外也可以给当前的centos添加各种工具
FROM 镜像基础 当前的镜像是基于那个镜像的,类似于java中的extends
MAINTAINER 镜像维护者的姓名和邮箱地址, 类似于java doc的author
RUN 容器构建时需要运行的命令
EXPOSE 当前镜像对外暴露的端口,比如tomcat镜像一般暴露8080端口
WORKDIR 工作目录,比如centos登入后的目录可以使用这个来指定
ENV 环境变量,预设环境变量
COPY 拷贝功能
ADD 添加某个基础镜像 copy+解压缩
VOLUME 容器数据卷
CMD
指定容器启动时要运行的命令可以有多个CMD
最后一个CMD会覆盖前面的 而且会被docker run传入的参数覆盖
ENTRYPOINT 和CMD作用一样,在docker run的时候传入参数不会被覆盖而是追加
追加的意思是把docker run 后面的参数追加到参数后面 形成一个新的命令
ENTRYPOINT ["ps","-ef"]
docker run imagsId | grep java
相当于在容器启动时运行了 ps -ef | grep java 这个命令
ONBUILD 当某个子容器继承这个类的时候出发这个函数,类似于一个钩子函数
ONBUILD RUN ECHO "father images is build"
7.1、dockerfile 案例1:配置自己的centos为其添加vim功能
docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
初始centos 默认目录是根目录 不支持vim、ifconfig
FROM centos
MAINTAINER lyzx<lyzx_hero@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "构建成功"
CMD /bin/bash
构建一个镜像,
docker build -f dockerfile的绝对路径 -t 镜像的名字:tag .
(最后有一个. 镜像的名字必须是大写)
查看镜像的历史
docker history containerID
8、演示一个安装mysql的案例
安装mysql首先要有镜像
1、获取镜像
docker pull mysql:5.6
2、以后台模式运行mysql容器,其中有几个目录做了容器数据卷,便于备份数据
docker ps
docker run -p 3308:3306 --name mysql \
-v /root/text/mysql/conf:/etc/mysql/conf.d \
-v /root/text/mysql/logs:/logs \
-v /root/text/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.6
3、进去mysql容器
先用 docker ps 查看容器id
docker exec -it containerId /bin/bash
4、进入mysql终端
mysqld -uroot -p 回车
输入密码:123456
未完待续~~~