词汇
docker主机(host): 安装了Docker程序的机器(Docker直接安装在操作系统上);
安装了docker的电脑docker客户端(Client): 链接docker主机进行操作
docker仓库(registy) : 用来保存各种打包好的软件镜像
所有镜像的存放地址docker镜像(Images): 软件打包好的镜像, 放在docker仓库中
一个软件打包生成的镜像 , 比如linux打包的docker镜像 就是linux docker镜像docker 容器(Container): 镜像启动后的实例称为一个docker容器,容器是独立运行的一个或一组应用
镜像启动起来就是,一个容器作用:解决了运行环境和配置问题软件容器, 方便做持续继承并有助于整体发布的容器虚拟化技术。交镜像, 别人就不需要再搭建一套环境, 直接使用镜像运行就好了
镜像(Image): 就是一个只读的模版, 镜像可以用来创建docker容器, 一个镜像可以创建多个容器
Docker容器 相当于 Java的对象
Docker镜像 相当于 Java类
镜像 ==> 模版, ==> Java类容器(container): 独立运行的一个或一组应用; 容器是用镜像创建的运行实例;
它可以被启动, 开始, 停止, 删除, 每个容器都是相互隔离的, 保证安全的平台
可以把容器看做是一个简易版的Linux环境(包括root用户权限, 进程空间, 用户空间和网络空间) 和运行在其中的应用程序;
容器的定义和镜像几乎是一模一样, 也是一堆层的统一视角, 唯一区别在于容器的最上面那一层是可读可写的;容器 ==> Linux小镜像小实例 ==> Java对象
仓库(Repository): 是集中存放镜像文件的场所;
仓库(Repository)和仓库注册服务器(Registry)是有区别的; 仓库注册服务器上往往存放着多个仓库, 每个仓库中又包含了多个镜像, 每个镜像有不同的标签(tag)
仓库分为公开仓库(public) 和私有仓库(private)两种形式
最大的公开仓库是Docker Hub(https://hub.docker.com/)
使用docker的步骤:
1, 安装docker
2, 去docker仓库找这个软件对应的镜像
3, 使用docker运行这个镜像,这个镜像就会生成一个docker容器
4,对容器的启动停止就是对软件的启动停止
Docker命令
yum install docker
安装docker
cat /etc/sysconfig/docker #查看配置文件
启动docker
systemctl start docker 启动docker
systemctl stopdocker 停止docker
docker -v 查看docker版本
systemctl enable docker 开机启动docker
docker search mysql 搜索需要的docker 镜像
docker search mysql:5.5 下载指定版本的镜像
(就是从dockerhub里搜索镜像)
docker pull mysql 拉取/下载镜像 (最新的)
docker images 查看下载好的镜像
docker rmi IMAGE_ID 删除指定镜像
注意IMAGE_ID 是通过docker images 里查看到的IMAGE_ID
卸载docker
yum list installed|grep dock
yum -y remove docker.x86_64
yum -y remove docker-client.x86_64
yum -y remove docker-common.x86_64
启动容器(镜像)
docker run –-name 容器名字 -d tomcat: latest
容器名字: 自定义自己启动的容器名字
-d 后台启动
tomcat: latest 启动tomca并指定版本
注意启动tomcat之后,使用ip加端口是访问不了tomcat的,因为是通过docker启动的
因此需要映射端口,如下启动
docker run --name 容器名字 -d -p 8888:8080 tomcat: latest
把主机的8888端口映射到容器内部tomcat的8080上
把主机的端口映射到容器的一个端口上
docker run --name mysql01 -d mysql
这样运行是错误的,mysql会因启动时没有配置密码….等而启动错误
docker run --name mysql01 -e MYSQL-ROOT_PASSWORD=jia -d mysql
启动时候映射端口
docker run -p 3306:3306 --name mysql02 -e MYSQL-ROOT_PASSWORD=jia -d mysql:5.7.30
启动成功
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=jia mysql:5.7.30
docker 特殊操作:
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
启动指定编码为utf-8
docker run -p 3306:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=jia -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
service firewalld status 查看防火墙状态
service firewalld stop 关闭防火墙
docker ps 查看运行的docker 容器
docker ps -a 查看全部的docker 容器
docker stop 容器运行的id (通过docker ps 找到运行的id)
docker rm 容器运行的id (注意区分删除镜像的rmi)
docker logs 查看容器启动日志
Docker 部署
1、下载一个tomcat镜像到我本地
docker pull tomcat:7
2、在Docker工具里执行指令让镜像跑起来
docker run -d -p 8080:8080 tomcat
3、把文件部署在Tomcat的镜像下
docker cp C:/Users/Distance/Desktop/CO2Monitor.war 05fea6175ff2:/usr/local/tomcat/webapps
3.1、查看Tomcat文件位置
docker exec -it 05fea6175ff2 /bin/bash
root@05fea6175ff2:/usr/local/tomcat# cd webapps
root@05fea6175ff2:/usr/local/tomcat/webapps# ls
4、对容器进行了修改(copy了war包),首先要提交修改
docker commit 05fea6175ff2 kaluli/co2
提交完后,要push上仓库,在这之前,要登录自己的docker账户
docker login
登录后,上传到仓库;前面是自己的docker账号名,后面是给容器取的名字
docker push kaluli/co2:latest
5、其他人只要docker pull ivyusing/demo,都可以下载这个容器
修改阿里云镜像加速器
登录阿里云开放平台, 找到自己的加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
复制自己的加速器, 修改配置
vim /etc/docker/daemon.json
#把下图的json串加进去,然后重启
systemctl daemon-reload
systemctl restart docker
学习 - docker 命令
docker version
dokcer info
docker help
镜像相关知识
docker images #列出本地主机上的镜像
docker images -a #列出全部镜像
docker images -q #列出镜像id
docker images -qa #列出所有的镜像id, 方便批量删除
docker images --digests #查看该镜像的摘要信息
docker iamges --no-trunc # 显示完整的镜像信息
docker search 某个XXX镜像名字
#注意虽然修改了镜像加速器地址为阿里云, 但是docker search命令还是从dockerhub中查找镜像, 只是说拉取的时候从阿里云里拉取了
docker search mysql
docker search -s 30 tomcat #STAR超过30的才列出来, 作为筛选
docker search tomcat --automated #只列出自动构建的镜像, 筛选
docker pull 某个XXX镜像名字
docker rmi 某个XXX镜像名字ID
docker rmi -f 某个XXX镜像名字ID 强制删除
docker rmi -f 镜像1名字, 镜像2名字 删除多个
docker rmi -f ${docker images -qa} 删除所有的镜像
docker images 选项说明
容器相关知识
docker run [OPTIONS] IMAGE [COMMAND] [ARGS] 本地有就启动本地,没有就去dockerhub拉取
docker run -it 镜像ID #开启容器, 运行镜像ID,
#-it 并且开启与容器交互, 登录进容器里边去, 退出使用exit(容器停止退出)或者 Ctrl+P+Q(容器不停止退出)
docer run -it --name my-centos-name centos 指定容器名字,根据镜像启动容器
docker ps #查询所有运行着的docker镜像
docker ps -l #上一次运行的容器
docker ps -n 3 #上三次运行的容器
docker stop 容器id #停止容器
docker kill 容器id #停止容器
docker rm 容器id #删除容器
docker rm -f 容器id #强制删除容器
docker rm -f ${docker ps -a -q} #全部删除
docker ps -a -q | xagrs docker rm #全部删除
=================================================================================
docker run -d centos #后台运行容器, 守护进程启动容器
docker logs -f -t --tail 容器ID #查看容器日志 -t是加入时间戳 -f 跟随最新的日志打印 --tail 数字显示最后多少条
docker top 容器ID #查看容器内运行的进程
docker inspect 容器ID # 查看容器内部细节
docker attach 容器ID # 进入宿主机,
dokcer exec -t 8a7193d3ae96 ls -l /tmp # 不进入宿主机, 执行命令, 输出结果
attach 和 exec的区别:
attach: 直接进入容器启动命令的终端, 不会启动新的进程
exec: 是在容器中打开新的终端, 并且可以启动新的进程
docker cp 容器ID:容器内路径 目的主机路径
docker cp 8a7193d3ae96:/tmp/ks-script-xm1o5azb /hong/docker-file #将宿主机centos里的/tmp下拷贝ks-script-xm1o5azb到主机的 /hong/docker-file/
镜像提交
docker commmit 提交容器副本使之成为一个新的镜像
docker commit -m "描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker run -it -p 8888:8080 tomcat #主机端口8888映射到宿主机8080端口,这样192.168.71.133:8888就能访问容器内tomcat的8080端口了
docker run -it -P tomcat #自动映射, 通过docker ps可以看到映射的端口信息 32768--> 8080
后台启动, 守护进程启动
docker run -d centos #后台运行容器, 守护进程启动容器
#注意, 这样可能启动后, 一会该容器就消失了, 这是docker的机制, 如果没人和他交互, 他就自杀了
测试记录:
docker run -d centos /bin/sh -c "while true; do echo hello zzyyl;sleep 2; done"
#后台形式启动centos, 并打印日志
docker ps #因为有日志打印交互, 所以这个容器不会自杀,一直存活
#查看日志
docker logs 00d9133c2dd2
docker logs -t 00d9133c2dd2
docker logs -tail 00d9133c2dd2
docker logs -t -f 00d9133c2dd2
docker logs -t -f --tail 3 00d9133c2dd2 #查看最后3行,和实时日志
自定义镜像(commit 重建镜像) commit 持久化
docker exec -it caed58ded956 /bin/bash #进去tomcat路径
mkdir docs 添加一个docs文件夹
docker commit -a="Hong" -m="My-Tomcat" caed58ded956 hong/mytomcat:1.2
docker images #查看到commit的镜像
docker run -it -p 7777:8080 hong/mytomcat:1.2 #启动自定义镜像
Docker容器数据卷(就是持久化, U盘)
就是学生下课查到笔记本上,拷贝的活动硬盘, 主要用来持久化,
Docker的理念:
将运用与运行的环境打包形成容器运行, 运行可以伴随着容器, 但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker容器产生的数据, 如果不通过docker commit生产新的镜像,使得数据做成镜像的一部分保存下来, 那么当容器删除后, 数据自然就没有了,为了能保存数据, 在docker中使用卷的概念
作用:
1, 容器的持久化
2, 容器间继承 + 共享数据
docker run -it 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 # rw权限, 宿主机和容器完全同步, 包括删除
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 # ro: read only
测试记录:
读写模式
这个模式, 宿主机和容器都可以进行修改, 而且完全同步
docker run -it -v /hong/myDataVolume:/hong/myDataVolume centos #rw权限
#注意此时, 宿主机和容器 / 下都没有hong/myDataVolume文件夹, 相当于宿主机的/hong/myDataVolume 和容器的/hong/myDataVolume挂载在一起了
docker inspect 容器id
#可以看到HostConfig已经有显示RW: true, 宿主机和容器进行了卷的挂载,而且运行随意修改
测试结论
#1, 如果宿主机新建文件,容器也会跟着建立, 宿主机修改, 容器也跟着修改了, 就像是U盘已经同步了
#2, 如果容器关机了, 这时, 宿主机修改了文件, 容器再次启动上来, 宿主机改的文件也会同步过来
只读模式
这个模式, 只允许宿主机进行修改,同步宿主机的修改, 容器不能进行任何修改
(相当于容器只能从宿主机中拷,但是自己能新建)
docker run -it -v /hong/myDataVolume:/hong/myDataVolume:ro centos #只读
备注(我就出现了,容器不能写)
Docker挂载主机目录Docker 访问出现cannot open directory. : Permission denied
解决办法: 在挂载目录后多加一个 --privileged=true 参数即可
Dockerfile形式添加数据卷
1, 编写dockerfile
vim /hong/dockerFile/Dockerfile
#volume test
FROM centos
VOLUME ["/hong/dataVolumeContainer1","/hong/dataVolumeContainer2"]
CMD echo "finished , -------- success"
CMD /bin/bash
2, 根据编写的dockerfile构建镜像
docker build -f /hong/dockerFile/Dockerfile -t hong-dockerfile/centos .
3, 启动dockerfile建立的镜像
docker run -it hong-dockerfile/centos
查看容器内是否建立了, dockerfile指定的两个文件夹
4, 那么如何看容器和宿主机的哪个卷进行了绑定呢?
docker inspect ea56fccd987d
5, 验证一下, 在容器内建立1.txt文件
6, 查看宿主机
数据卷容器(volumes-from)
容器间传递共享
容器挂载在宿主机, 其他的容器又挂载在这个挂载在宿主机上的容器, 进行数据间的共享
老师(宿主机)和班长(容器)进行绑定, 各个组长(其他容器)又和班长进行挂载, 都挂在了一条线上
测试:
1, 开启容器doc1
2, 启动doc2,doc3 继承自doc1
docker run -it --name doc2 --volumes-from dc01 hong-dockerfile/centos
3, 在doc3中新建文件
4, 查看结果
发现doc3新建文件, doc1和doc2也能看到了
5, doc2删除文件
6,查看结果
发现doc1 和doc3中的文件也被删除了
7, 注意关键点
如果把doc1删了, 虽然都继承自doc1, 但是即使删了doc1, doc2和doc3 仍然可以进行数据的共享,因为
**容器之间配置信息的传递, 数据卷的生命周期一直会持续到没有容器使用它为止**
也就是说, 只要关联了, 就会一直数据共享, 直到剩下最后一个没有容器为止
scratch 相当于java中的Object类, 是所有构建镜像的父类
bin/bash 启动, 这样在每次docker run -it centos就相当于默认后边加了一句/bin/bash得以让容器启动, 如果非手动的添加了 docker run -it centos /bin/bash 就相当于在这个文件中又多加了一行 CMD ["/bin/bash"] 让镜像运行
Dockerfile章节
注意点: dockerfile 中每条指令都会创建一个新的镜像层, 并对镜像进行提交
dockerfile的大致执行流程:
1, docker 从基础镜像运行一个容器
2, 执行一条指令并对容器作出修改
3, 执行类似docker commit 的操作提交一个新的镜像层
4, docker再基于刚提交的镜像运行一个新容器
5, 执行dockerfile中的下一条指令直到所有指令都执行完成
Docker体系关键字
1,FROM
基础镜像, 当前新镜像是基于哪个镜像的
Hong: 指定镜像构建的源头, 最大的源头就是挠痒痒 >>> scratch
2, MAINTAINER
镜像维护者的姓名和邮箱地址
Hong: 就是镜像的作者信息啥啥的
3, RUN
容器构建时需要运行的命令
Hong: 启动命令
4, EXPOSE
当前容器对外暴露的端口
5, WORKDIR
指定在创建容器后, 终端默认登陆的进来工作目录, 一个落脚点
Hong: 就是启动镜像后, 你默认当前处于在哪个文件夹下, 相当于登录镜像默认文件夹
6, ENV
用来构建镜像构成中设置环境变量
Hong: 镜像需要运行的环境变量
7, ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会**自动处理URL和解压tar压缩包**
Hong: 镜像需要的其他文件, 用ADD添加过来并解压, 区别于COPY, ADD就是多了个解压
8, COPY
类似ADD, 拷贝文件和目录到镜像中; 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径> 位置
Hong: 和ADD类似, 都是拷贝过来, 但是COPY不进行后续处理
9, VOLUME
容器数据卷, 用来数据保存和持久化工作
Hong: 就是前边的卷概念, 用来连接宿主机和容器的U盘
10, CMD
指定一个容器启动时要运行的命令, **Dockerfile中可以有多个CMD命令, 但只有最后一个生效, CMD会被docker run 之后的参数替代**
Hong: 容器启动的命令, 注意这比会被最后一个CMD覆盖, 相当于只有最后一个CMD生效, 而且还会被docker run 后边跟的命令覆盖
11, ENTRYPOINT
指定一个容器启动时要运行的命令, ENTRYPOINT的目的和CMD一样, 都是在指定容器启动程序及参数
Hong: 类似于CMD, 但是这货不会被覆盖, 而是追加在后边, 联合docker run 可以实现更贴切的命令
12, ONBUILD
当构建一个被继承的Dockerfile时运行命令, 父镜像在被子继承后父镜像的onbuild被触发
Hong: 相当于一个触发器, 有子镜像继承时候, 父镜像设置了ONBUILD, 这时候, **子镜像被构建的时候, 父镜像的ONBUILD就会执行**
测试CMD
#volume test
FROM centos
MAINTAINER Hong9752@qq.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools #安装ifconifg 指令
CMD echo $MYPATH
CMD echo "finished , -------- success"
CMD /bin/bash
docker build -f Dockerfilecmd2 -t mycentoscmd/1.0 . #使用dockfile构建镜像
docker run -it mycentoscmd/1.0 #启动容器
#测试vim 和ifconfig能不能用
ifconfig
vim 1.txt
docker history 6f45277af51b #使用history查看镜像构建历史, 第一步是最下边,最后一行
测试ENTRYPOINT
#volume test
FROM centos
RUN yum install -y curl
CMD echo "finished , -------- success"
ENTRYPOINT ["curl","-s","https://ip.cn"]
#省略构建镜像, 启动容器步骤
docker run -it mycentosentrypoint/2.0 -i
#此时这个-i 就相当于追加到 ENTRYPOINT ["curl","-s -i","https://ip.cn"]
测试ONBUILD
#volume test
FROM centos
ONBUILD RUN echo "father go go go!"
docker build -f Dockerfileonbuild4 -t mycentosonbuild/3.0 .
视频自定义tomcat的dockerfile
测试之前前提需要在 /usr/local/ 有tomcat9 和jdk8的压缩包, 而且名字得和下边文件配置的对应起来
还有当前目录下有c.txt
#启动自定义tomcat容器命令
docker run -d -p 9080:8080 --name mytomcat -v /hong/tomcat-test/:/usr/local/apache-tomcat-9.0.8/webapps/test -v /hong/tomcat-log/:/usr/local/tomcat-9.0.8/logs --privileged=true mytomcat9
#命令解释
-d 后台启动
--name 自定义名字
-v /hong/tomcat-test/:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /hong/tomcat-log/:/usr/local/tomcat-9.0.8/logs
挂载卷, 方便在宿主机上能看到容器中的东西, 也方便传数据
mytomcat9 镜像名
docker 安装mysql
拉取mysql镜像省略
mysql启动
docker exec 容器id sh -c ' exec mysqldbump --all-database -uroot -p "123456" ' > /hong/all-database.sql
#执行mysqldump命令, 将所有的数据库(all-database) 导出( > ) 到宿主机的 all-database.sql文件中
docker 安装redis
#启动redis
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
#链接redis
docker exec -it 运行着redis服务器的容器id redis-cli
注意配置redis.conf的时候不要使用 bind 0.0.0.0 绑定主机, 直接注释掉就行了
docker 推送到阿里云
docker run -it mycentoscmd/1.0 #运行带有vim和ifconfig的镜像容器
docker commit -a Hong -m "new mycentosvim from local" 5f25863290a6 commitcentos:4.0
#提交创建新的镜像
登录阿里云,创建镜像仓库
docker login --username=天卿不负 registry.cn-hangzhou.aliyuncs.com
如果需要输入密码输入: Hong545.
使用上边代码推送镜像到阿里云仓库
docker tag 6bd081759b0e registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1
docker push registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1
docker images
可以看到镜像已经推送上去了
从阿里云上搜索
看到也可以搜出来, 删除本地镜像, 从阿里云上拉下来, 测试vim和ifconfig能不能用
docker rmi -f 6bd081759b0e #删除构建的镜像
#拉取阿里云的镜像
docker pull 阿里云地址
docker pull registry.cn-hangzhou.aliyuncs.com/hong_sky/studycentos:4.0.1
使用边地址pull的时候, 主要后边要加对应的版本(4.0.1),不然他也不知道要拉哪一个镜像
安装docker CE版
cat /etc/redhat-release p # centos版本要高于7
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
#卸载安装过的docker的老版本
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#这句话链接的是外网, 经常报ERROR14 ERROR12 , 所以需要换成阿里云的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat /etc/yum.repos.d/docker-ce.repo #执行完可以查看,镜像源已经被修改
yum makecache fast #更新yum
yum -y install docker-ce
systemctl start docker
docker version
配置镜像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
卸载docker
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
{
"registry-mirrors": ["https://mppmrld1.mirror.aliyuncs.com"]
}