一、系统要求;docker介绍为什么要用docker
1.测试用系统安装在vmwear的centos7(安装docker需要内核在3.10和之上的版本才可以centos从7开始内核版本为3.10);
2.为什么要使用docker?
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。
更高效的利用系统资源
由于容器不需要进行硬件虚拟及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统的虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行与宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级别的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些BUG并未在开发过程中被发现。而Docker的镜像提供了除了内核外完整的运行时环境,确保了应用运行环境得一致性,从而不会再出现“这段代码在我机器上没问题”这类问题。
持续交付和部署
对开发和运维人员来说,最希望的就是一次性创建或配置,可以在任意地方正常运行。
使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过DockerFile来进行镜像构建,并结合 持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。
而使用DockerFile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于Docker确保了执行环境得一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用迁移到另一个平台,而不用担心运行环境得变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker使应用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变的非常简单。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
二、下载docker-ce.repo;安装docker-ce
1.下载https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/下docker-ce.repo到linux下/etc/yum.repos.d/下
2.yum clean all
3.yum install docker-ce –y
4.创建/etc/docker目录在目录下创建daemon.json文件
文件内容:
{
"storage-driver":"overlay2",
"data-root":"/data/docker/lib",
"exec-root":"/data/docker/run",
"registry-mirrors": ["https://p6c4bmkc.mirror.aliyuncs.com","https://registry.docker-cn.com"],
"insecure-registries": ["wxzy01.yaya.com"]
}
这里定义了storage-driver和overlay2模式磁盘效率比默认devicemapper+loopback要更快
data-root、exec-root对应的/data目录是把/dev/sdb1格式化为xfs并挂载在/data
先、fdisk /dev/sdb 后、mkfs.xfs –n ftype=1 /dev/sdb1 最后、mount /dev/sdb1 /data
wxzy01.yaya.com这个是我创建的私有仓库的域名,因为是用的http而docker上传镜像默认是用的https所以会有问题要对仓库关闭安全模式
5.开启docker; systemctl start docker;
6.docker version “查看docker版本信息”
三、docker 通过Dockerfile生成自己的docker镜像
1.首先创建一个单独的目录;在目录里创建Dockerfile文件;和要上传到镜像的文件;
2.举例如下:
img3目录结构如下:
entrypoint.sh脚本内容
Dockerfile内容
FROM nginx:1.14-alpine “这里定义源镜像的名称和版本”
ENV 定义的是变量名
ADD 是上传本地目录下的文件到镜像上的指定目录;(和COPY功能一样)
EXPOSE 80/tcp “是把本地TCP80端口映射出去”
HEALTHCHECK “为开启后是否显示为健康状态通过在容器开启后多久运行测试CMD;超时时间(可选);尝试次数(可选 )”
ONBUILD ADD “在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。”
CMD “运行构新成的新镜像时运行”
当CMD和ENTRYPOINT同时出现时CMD的操作都被当参数传给ENTRYPOINT运行的命令如上面ENTRYPOINT运行的就是/bin/entrypoint.sh /usr/bin/nginx –g daemon off;
而entrypoint.sh脚本在最后exec “$@”也就是在脚本的最后运行了所有传参的命令;exec “/usr/bin/nginx –g daemon off”
四、docker仓库hub.docker.com;cr.console.aliyun.com;私有仓库(http;https;harbor);
1.上传镜像,先在仓库创建目录
2.修改镜像的名字为对应的创建名+目录+名称+版本号;docker tag … ….
3.登录docker ; docker login
4.上传镜像:docker push
5.harbor私有仓库搭建
github上通过offline install获取下载地址wget下载到本机
(1).解压到/usr/local目录
(2).配置harbor.yml
hostname “私有仓库域名”
port: “端口”
harbor_admin_password: “私有仓库admin密码”
database
password: “数据库密码”
data_volume: “指定存放目录”
(3).运行install.sh
运行完http访问
五、docker命令介绍(docker run;docker exec;docker build;docker images;docker ps;docker ps –a;docker logs;docker …)
常用docker命令
1.docker run --name xxx(自定义名称) -it --rm xxxx(image镜像名称) –v /data/test:/data -p 80:80 /bin/bash (-it 进入终端交互模式;--rm退出就删除容器; –v 目录挂载到容器 –p 端口映射出来)
2.docker exec –it xxxx /bin/bash (在已经开启的容器运行指令)
3.docker build –t xxxx . (根据Dockerfile文件生成新镜像命名为xxx;一定要在Dockerfile所在的目录下运行)
4.docker images/docker image ls(查看所有本地容器镜像)
5.docker ps/docker container ls 查看正在运行的up状态容器
6.docker ps –a /docker container ls –a 查看所有关态的运行的容器
7.docker logs –f xxxx(容器名) 时时刷新看容器logs用于排错
8.docker stop xxx 停止状态为up的容器
9.docker rm xxx 删除已经停止的容器
10.docker rmi xxx 删除本地镜像
11.docker commit –p 容器镜像名 新保存镜像名 “把正在运行的容器,保存为新的镜像”
六、docker-compose(epel.repo安装;安装docker-compse;docker-compose.yml编辑)
1.下载epel.repo yum源到/etc/yum.repose.d/目录修改为
2.yum clean all
3.yum install docker-compose –y
4.mkdir /usr/local/test
5.cd /usr/local/test
6.创建 docker-compose.yml
如下:
7.在/usr/local/test目录下docker-compose up –d 就自动后台运行docker-compose.yml的参数,如果yml文件名不为docker-compose.yml;运行 docker-compose –f xxxx.yml up –d;
注意:**docker-compose.yml下如果通过shell脚本来启动服务,如果没有在脚本最后加上tail –f /dev/null;脚本在运行完后,容器就会existed;如果配置了restart: always那就会看到容器不断的restarting和up;因为容器每次默认只运行一个进程;如果第一个进程退出;容器就会退出**