都是自己看视频学习资料总结的,欢迎大家浏览指正
勿在浮沙筑高台
仓库
镜像
容器
1.基于Go语言实现的云开源项目
2.解决运行环境和配置问题的软件容器虚拟化技术
3.一次封装构建,到处运行
4.不需要一整套操作系统
5.相互隔离,耦合度低
大海:宿主机
鲸鱼:docker
集装箱:容器 ---> 容器来自镜像
面试造飞机,工作拧螺丝
高手是练出来的,不是教出来的
烧不死的鸟才叫凤凰
Docker简介
仓库
镜像
容器
解决运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
Docker打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
理念:“一次封装,到处运行”
虚拟机和容器的不同:
1. 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
2.而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
3. 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker 常用命令
1.1帮助命令
docker version
docker info
docker --help
1.2镜像命令
1.2.1查看本地镜像
docker images
-a:列出本地所有的镜像 -q:只显示镜像ID
1.2.2搜索镜像
docker search xx镜像名
1.2.3下载镜像
docker pull xx镜像名
例子:docker pull tomcat:latest #后面不指定标签默认latest
1.2.4删除镜像
docker rmi -f 镜像ID
例子:
docker rmi -f 镜像id #删除一个
docker rmi -f 1镜像id 2镜像id #删除多个
docker rmi -f $(docker images -qa) #全部删除
1.3 容器命令
有镜像才能创建容器,先pull一个镜像
1.3.1 新建并启动容器
凡是设置了名字的都可用名字代替id使用
docker run 镜像名
-it:常用 -d:后台运行容器 -P:随机端口映射
-p:指定端口映射
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort #常用
containerPort
例子:
docker run -it centos
docker run -it --name '自定义容器名' 镜像id
#【docker run -it --name '容器name' centos】
docker run -d centos #后台运行的容器要有一个前台进程,不然用ps会显示退出状态
docker run -it -P tomcat #随机分配端口
docker run -it -p 主机端口:容器端口
#【docker run -it -p 9527:8080 tomcat】
1.3.2 列出运行的容器
docker ps
-a:列出所有容器,包括关闭的
-n:指定显示n个容器
-q:只显示容器编号
例子:docker ps -n 3 #显示最近3个容器
1.3.3 退出容器
exit #退出并停止
Ctrl +pq #退出不停止
1.3.4 启动和重启容器
docker start 容器名或容器id
docker restart 容器名或容器id
1.3.5 停止容器
docker stop 容器名或容器id
1.3.6 进入容器
docker attach 容器id
docker exec -it 容器id bash/shell
#exec -it 相当于【隔山打牛】,在容器外面对里面进行相应命令操作
例子:docker exec -it d27c53468bd1 bin/bash
docker exec -it d27c53468bd1 ls -a
1.3.7 容器内容拷贝到主机
docker cp 容器id:容器绝对路径 目的主机路径
1.3.8 彻底删除容器
docker rm -f 容器id #删除一个指定的容器
docker rm -f $(docker ps -qa) #全部删除
1.3.9 查看容器日志
docker logs -f -t --tail 容器id
-t :加入了时间戳 -f : 跟随最新的日志打印 --tail 数字 显示多少条
1.3.10 查看容器内运行的进程
docker top 容器id
1.3.11 查看容器内部细节
docker inspect 容器id
build 通过dockerFile定制镜像
commit 提交当前容器为新的镜像
Docker镜像
什么是docker镜像?
UnionFS(联合文件系统)
洋葱
方便共享资源
镜像是分层的,如同千层饼
镜像是一种轻量级、可执行的独立软件包
,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。
Docker镜像的最底层是bootfs ,对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了 ,所以docker里面的centos才200M
docker commit -m='描述信息' -a='作者' 容器id 创建目标镜像名:[版本号标签名]
例子:docker commit -m= '删除tomcat' -a='liu' d521565easd haha:1.2
Docker容器数据卷
持久化
容器间继承
数据共享
类似redis中的rdb和aof
1.1 直接命令添加
一对一
docker run -it -v 主机绝对路径:容器绝对路径 镜像名
例子:docker run -it -v /haha:/liu centos
#目录有则进入,没有则自动建立,和容器里面的文件夹关联,就是我,我就是你,只是名字不同,操作的是同一个
#【相当于共享同一个文件,一方更改都会给另一半带来影响】
#哪怕容器关闭了,主机修改了,一开机自动同步更改,共享。这才叫持久化
docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名 #修改容器权限只读,主机单项操作
docker inspect 容器id #查看相关信息
1.2 通过dockerFile添加
volume指令添加多个
一对多
镜像的构建文件
一个脚本
- 第一步:在主机先写dockerFile脚本
没有后缀名
- 第二步:将DockerFile文件build成镜像
-f指明文件位置
-t命名
FROM centos #来自于centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] #在容器里新建两个容器卷
CMD echo "finished,--------success1" #执行这个命令
CMD /bin/bash #习惯性带上这个
#######################编写上面的dockerfile文件####################################
翻译:↓
【docker run -it -v /host:/dataVolumeContainer1 -v host:/dataVolumeContainer2 centos /bin/bash】
########################执行下面build的指令########################################
docker build -f /home/dockerfile -t liu .
docker build -f /home/dockerfile -t liucentos:1.1 . #:后版本号,不写默认latest
-f:指明这个Dockerfile文件在哪
-t:命名空间 【最后还有一个.】
.:指当前目录
docker inspect 容器id #查看和主机绑定共享的文件夹
- --volumes-from继承
docker run -it --name '自定义容器名' --volumes-from '继承的容器的名字' 镜像名
例子:docker run -it --name 'b2' --volumes-from 'bc1' liu
1.3 dockerFile文件详解
scratch 祖先镜像
from #来自哪个镜像
maintainer #作者+邮箱
run #构建时需要执行的命令
env #环境变量
expose #暴露的端口号
workdir #登录进来后的默认工作目录
copy #拷贝进去
add #拷贝+解压缩*
volume #保存数据和持久化目录
cmd #启动时要运行的命令,多个命令则覆盖
entrypoint #入口点和cmd含义一样,多个命令则追加*
onbuild #继承则触发
案例 1 :
也可用列表的方式执行命令 CMD ['curl','-s','https://ip.cn']
- 第一步:先在主机新建一个Dockerfile文件,内容如下:
from centos #来自于centos
maintainer [email protected] #作者
env mypath /tmp #环境变量
workdir $mypath #一进来落脚点改成tmp
run yum -y install vim #安装vim
run yun -y install net-tools #安装网络相关工具
expose 80
cmd echo $mypath
cmd echo '成功'
cmd /bin/bash
- 第二步:用build命令将文件打包成镜像
docker build -f /home/dockerfile -t liucentos:1.1 .
# :后为版本号,不写默认latest
# . 代指当前目录
# -f:指明Dockerfile文件目录
# -t:命名镜像名
- 第三步:成功后用
run
运行
案例 2:
FROM centos
RUN yum install -y curl
#CMD [ "curl", "-s", "https://ip.cn" ]
ENTRYPOINT ['curl','-s','https://ip.cn']
常用安装
1.1 安装运行Mysql
docker pull mysql:5.6 #拉取5.6版本
#docker run -it -v 主机绝对路径:容器绝对路径 镜像名
docker run -p 12345:3306 --name mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-v /zzyyuse/mysql/logs:/logs
-v /zzyyuse/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
##################################################################
命令说明:
-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。
-v /zzyyuse/mysql/data:/var/lib/mysql :将主机 xxx 目录下的data目录挂载到容器的 xxx
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.6 : 后台运行
1.2 安装运行redis
docker pull redis:3.2
docker run -p 6379:6379
-v /zzyyuse/myredis/data:/data
-v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf
-d redis:3.2 redis-server /usr/local/etc/redis/redis.conf
--appendonly yes
推送到阿里云
1.运行容器:docker run -it test
2.提交到本地镜像:docker commit -a '作者' -m '提交信息' 运行容器的id 自定义镜像名字
#例子 docker commit -a 'liu' -m 'testip' asdfas234234 myip:1.1
3.登录阿里云账号创建镜像仓库
依次执行下面三行代码:
$ sudo docker login --username=ykcc归 registry.cn-qingdao.aliyuncs.com
$ sudo docker tag 镜像id registry.cn-qingdao.aliyuncs.com/test6679321/myip:镜像版本号
$ sudo docker push registry.cn-qingdao.aliyuncs.com/test6679321/myip:镜像版本号
4.在仓库搜索自己推送的镜像