什么是 Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
镜像和容器的关系
1:镜像就如手机的安卓系统,容器就相当安卓系统上的应用.所以,先有镜像才能有容器.我们打包的都是镜像,并非容器。
2:是否可以弄一个通用的镜像,安装所有服务再用容器启动。
这个我试过了,是可以的.可以安装一个 LAMP或LNMP之类环境,还可以安装其他想要的服务,端口不冲突都可以.但是这样的镜像启动出来的容器就违背了docker初衷,docker轻量级虚拟化,就是用来做单任务启动。
安装docker及docker-compose
(在任何一台能上网的centos7上都能安装)
安装服务依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存
yum makecache fast
安装docker服务
yum -y install docker-ce
启动服务
systemctl start docker
添加网易仓库
vi /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com"]}
上传docker-compose到/usr/bin目录下
添加运行权限
chmod +x /usr/bin/docker-compose
docker-compose是什么?
一种容器编排工具,读取yml文件创建或更新容器
查:docker logs appname # (查看名为appname的容器日志)
docker ps # (查看当前运行的容器状态)
改:docker-compose -f docker-compose.appname.yml up -d # (更新或创建容器提供服务)
建:docker-compose -f docker-compose.appname.yml up -d # (更新或创建容器提供服务)
删:docker rm -i appname # (删除名为appname的容器)
重启容器:docker restart appname # (重启名为appname的容器)
镜像打包:docker save imgname -o /root/imgname.dock # (把名为imgname镜像打包成文件)
镜像导入:docler load -i /root/imgname.dock # (导入名为imgname的镜像)
docker ps 详解
NAMES:容器名称(appname)
IMAGE:镜像名称
CREATED:创建时间
STATUS:运行状态及时长
PORTS:映射的端口
docker-compose文件详解
version: '3'
services:
jar1:
image: ascdc/jdk8
container_name: appoint
restart: always
ports:
- "5011:5011"
volumes:
- /etc/localtime:/etc/localtime
- /data/jar/oa-appoint-web.jar:/data/oa-appoint-web.jar
entrypoint: java -jar -Duser.timezone=GMT+08 /data/oa-appoint-web.jar
jar2:
image: ascdc/jdk8
container_name: app
restart: always
ports:
- "5017:5017"
volumes:
- /etc/localtime:/etc/localtime
- /data/jar/oa-app-web.jar:/data/oa-app-web.jar
entrypoint: java -jar -Duser.timezone=GMT+08 /data/oa-app-web.jar
version:”3” 适用于1.2x版本以上的docker-compose命令
services:服务名称 #忽略
jar1: 服务名称,要区别于其他容器
image:来源镜像,可以是同一个
container_name:容器名称(就是所谓的appname了)
restart:跟随docker服务启动
ports:容器应用映射的端口
volumes:挂在的宿主机目录
entrypoint:启动的应用
java -jar -Duser.timezone=GMT+08 /data/oa-app-web.jar
从命令看出来 这是一个启动jar工程包的容器. 并且调整了时区为上海时区.
docker-compose文件详解2
version: '3'
services:
mysqldb:
image: 'mysql/mysql-server:5.7'
restart: always
container_name: mysql
volumes:
- /data/mysql/data:/var/lib/mysql
- /etc/localtime:/etc/localtime
ports:
- '3306:3306'
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "root17317319864"
command:
--max_allowed_packet=128M
从image看出来这是一个启动mysql应用的容器
volumes可以看出挂在了数据的目录(除了数据还可以挂载配置文件)
environment可以看出调整了时区和数据库用户root的密码
command特有的参数可以通过最大的包为128M(业务需要)
从两个例子我们可以看出来,要创建一个容器需要镜像名称,填写自己容易记忆的appname
调整参数,映射端口,挂在宿主机目录等等,根据业务需要添加或减少参数.
启动容器:在docker-compose-appname.yml目录下执行
docker-compose -f docker-compose-appname.yml up -d
数据持久化是防止容器出故障后,删除重建会导致数据丢失的问题.数据在宿主机的存储内.
无论怎么删除容器再次新建容器,数据仍然在.所以我们要把业务数据和容器分开放.
什么是DevOps?
docker在DevOps的角色?
应该如何做?
1:测试环境要使用docker
2:用docker测试能确定了业务所依赖的服务版本,系统版本很多信息
3:线上迁移后除了网络环境是不一样的,系统和服务版本几乎是一样的.
4:统一业务的测试方式,尽早部署和线上一样的环境及业务调用方法.