Docker镜像相当于是一个root文件系统
Docker镜像的本质:
Linux文件系统有bootfs和rootfs两部分组成
bootfs:包含bootloader(引导加载程序)和kernel(内核)
rootfs:root文件系统 /dev /bin /etc
镜像原理:
由特殊的文件系统叠加而成
最低端是bootfs,并使用宿主机的bootfs
第二层是root文件系统rootfs(基础镜像)
然后再网上可以叠加其他的镜像文件(组成只读镜像,对于里面的镜像不能修改)
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
Docker中一个centos镜像只有200M,而centos操作系统得iso文件有几个G:
Docker中的centos镜像父用了linux的bootfs部分,提供rootfs部分
制作容器:
1.容器转镜像:镜像不能直接传输,只能压缩成压缩文件
打包镜像 docker commit 容器id 镜像名称:版本号
压缩 docker save -o 压缩文件 镜像名称:版本号
还原成镜像 docker load -i 压缩文件名称
2.dockerfile
概念:包含一条条指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
FORM指定父镜像
EXPOST 80 暴露端口
STOPSINGNAL SIDTERM
CMD ["nginx","-g","daemon off;"] 启动nginx的命令
dockerfile实现:
1.定义父镜像 FORM centos:7
2.定义作者信息 MAINTAINER ithe<ithe@163.com>
3.执行安装vim命令 RUN yum install -y vim
4.定义默认的工作目录: WORKDIR/usr
5.定义容器启动执行的命令:CMD/bin/bash
执行文件:
docker build -f ./dockerfile -t(命名)it_centos:1 .(代表寻址路径)
案例:定义dockerfile 发布springboot项目
1.编辑dockerfile
FROM java:8
MAINTAINER author <author@163.com>
ADD demo-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
2.构建镜像
docker build -f ./springboot_dockerfile -t app .
3.启动容器
docker run -id -p 1688:1688 app
服务编排:
概念:按照一定的业务规则批量管理容器
编排工具:Docker Compose 多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动,停止,
使用步骤:
1.利用Dockerfile定义运行环境镜像
2.使用docker-compose.yml定义组成应用的各服务
3.运行docker-compose up启动应用
1.安装docker-compose
2.编写docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "1688"
3.创建nginx配置文件目录
mkdir -p ./nginx/conf.d
4.创建nginx配置文件
vim it.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:1688;
}
}
5.回到docker-compose文件夹并启动
cd ../../
docker-compose up -d(表示后台运行)
Docker私有仓库
一:私有仓库搭建
1.拉取仓库镜像
docker pull registry
2.创建容器
docker run -id --name=registry -p 5000:5000 registry
测试访问:http://ip地址:5000/v2/_catalog,成功访问就代表创建成功
3.修改daemon.json
vim /etc/docker/daemon.json
4.添加仓库地址
"insecure-registries":["139.196.162.249:5000"]
5.重启docker
systemctl restart docker
启动私有库容器:docker start registry
6.标记镜像为私有仓库的镜像
docker tag centos:7 ip地址:5000/centos:7
7.上传标记的镜像
docker push ip地址:5000/centos:7
成功后:
从仓库拉取镜像
docker pull ip地址:5000/centos:7
Docker容器虚拟化与传统虚拟机的区别
容器就是将软件打包成独立软件包,用于开发、交付和部署
相同点:
容器和虚拟机具有相似的资源隔离和分配优势
不同:
容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
容器只能运行同一类型系统,虚拟机可以运行不同的操作系统
服务操作:
启动 systemctl start docker
查看状态 systemctl status docker
停止 systemctl stop docker
重启 systemctl restart docker
开机启动 systemctl enable docker
镜像操作:
查看镜像:docker images
搜索镜像:docker search redis(hub.docker.com查看版本)
拉取镜像:docker pull redis:5.0(默认官方新版本)
删除镜像:docker rmi f0453552d7f2(image id)
删除所有镜像:docker rmi 'docker images -q
容器操作:
查看运行的容器:docker ps 查看正在运行的容器 docker ps -a(所有历史的)
创建容器:docker run -it(退出立马关闭容器) --name=c1(容器名字) ubuntu:18.04(镜像和版本) /bin/bash
docker run -id(退出后不会关闭容器) --name=c2(容器名字)
-i保持容器运行
进入容器:docker exec 参数
启动容器:docker start c2
停止容器:docker stop c2
删除容器:docker rm c2
删除所有容器:docker rm 'docker pa -aq'(查看所有容器的命令) 不能删除正在运行的
查看容器信息:docker inspect c2
'
数据卷:
容器删除后容器产生的数据还在吗?
不在 ,docker产生的数据在docker容器里 数据卷数据还在
docker容器和外部机器可以直接交换文件吗?
不能,容器和外部机器网络不互通 数据卷里的数据可以交换
容器之间想要进行数据交互?
定义:数据卷是宿主机中的一个目录或文件,
当容器目录和数据卷目录绑定后,对方修改的数据会立即同步
一个容器可以挂载多个数据卷
一个数据卷可以被多个容器挂载
数据卷作用:
容器数据持久化
外部机器和容器间接通信
容器之间的数据交互
配置数据卷:
启动容器时使用-v参数设置数据卷:
docker run -it --name=c1 -v /root/data(被挂载的目录):/root/data_container(容器里的目录) ubuntu /bin/bash
挂载多个目录:
docker run -it --name=c2 \
-v /root/data(被挂载的目录):/root/data_container1(容器里的目录) \
-v /root/data(被挂载的目录):/root/data_container2(容器里的目录)\
ubuntu /bin/bash
docker部署tomcat
搜索镜像 docker search tomcat
拉取镜像 docker pull tomcat
启动容器并启动项目 docker run -id --name=x_tomcat \
> -p 8080:8080 \ //将容器的8080端口映射到主机的8080端口
> -v $PWD:/user/local/tomcat/webapps\ //将主机中当前目录挂载到容器的/user/local/tomcat/webapps中
> tomcat
docker部署nginx
搜索镜像 docker search nginx
拉取镜像 docker pull nginx
启动容器docker run -id --name=c_nginx\
> -p 80:80 \ //映射端口
> -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf\ //映射配置文件目录
> -v $PWD/logs:/var/log/nginx\ //映射日志目录
> -v $PWD/html:/usr/share/nginx/html\ //映射访问资源目录
> nginx
docker部署redis
搜索镜像 docker search redis
拉取镜像 docker pull redis
启动容器docker run -id --name=c_redis -p 6379:6379 redis:5.0