基础的docker基本命令
docker启动命令
查询docker 命令帮助
查看镜像
docker 搜索命令 ( 它会去镜像地址去搜索)
docker pull 下载镜像
docker rmi 删除镜像
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
1、新建容器并启动
测试:
启动容器并给名字 为 it
表明已经进入到容器了
查看启动的容器内部, 可以看出这个容器内容跟普通的容器没啥区别
退出容器
列出所有运行的容器
删除容器
启动和停止容器的操作
常用的其他docker 命令
后台启动容器
注意: 该条命令启动容器后,使用docker ps 查看,会发现该容器停止了
原因: docker 容器使用后台运行,就必须要有一个前台的进程,docker 发现没有应用,就会自动停止
有使用容器就装了一个nginx ,此时容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
查看容器运行进程信息
查看镜像的数据
进入当前正在运行的容器
从容器内拷贝文件到主机上
实际应用
docker 安装 Nginx
1、 下载nginx 镜像
2、 启动nginx
3、测试
docker run -d –name nginx01 -p 3344:80 nginx
- -d # 设置后台运行
- –name nginx01 # 给要启动的nginx一个名字,取名为nginx01
- -p 3344:80 # 3344指的是linux的端口号,80指的是nginx容器的默认端口,将容器的
还可以直接访问linux 的服务器加上上面启动的端口测试nginx是否运行成功
这个192.168.239.128 是我的linux服务器的地址
docker 安装tomcat
这里可以看到,tomcat容器启动完后,容器也被删除了,这就是–rm 命令的作用
利用linux地址:3355访问测试
那为什么使用linux地址:3355 没有访问tomcat成功呢,明明容器已经正常启动了。
原因是因为该tomcat是阉割版本的,对应的webapps文件夹下是空的
但是,可以看到,虽然该阉割版的tomcat的webapps目录是空的,但是对应的webapps.dist 目录却是有内容的,而里面的内容刚好是webapps文件所需要的
使用cp命令,将webapps.dist 目录下的文件拷贝到webapps 目录下,使用本机地址加3355端口号就可以成功访问tomcat了
重新使用liunx地址+3355 (前面启动tomcat容器的时候指定了映射到linux的3355端口)端口号访问:
熟悉的tomcat页面,访问成功!!!
docker图形化安装
安装portainer
portainer:Docker图形化界面管理工具! 提供一个后台面板供我们操作
使用下面的命令安装portainer,并把端口映射到linux的8088端口(这样就可以用linux地址+端口号访问了)
docker run -d -p 8088:9000
–restart=always -v /var/run/docker.sock:/var/run/docker.sock –privileged=true portainer/portainer
安装成功
设置账号:root 密码:rootroot
登陆后,选择连接本地,可以查看已有的镜像(不是重点,一般不用,了解即可):
镜像的分层的含义(待补充)
commit镜像
docker commit
上面说的步骤,有不懂的,可以查看上面的docker 安装tomcat ,由于官方的tomcat是阉割版的,访问不了tomcat页面(原因是webapps目录没有文件),我们这里就把他优化一下,就是把webapps目录的文件补充完整。
测试一下
测试没有问题,现在把这个运行的容器,提交成我们自己的镜像。以后运行就用我们自己的tomcat镜像,就不需要再做一次将webapps.dict 目录的文件拷贝到webapps目录下的操作后,才能查看tomcat页面了。
可以看到我们已经生成了自己的镜像了 chentomcat
容器数据卷
通过添加 -v 参数实现数据卷功能
为了将容器的数据进行持久化保存的操作。防止删掉容器后,容器内的数据也没有。
作用:挂载宿主机的一个目录
这里把容器想成一个单独的系统,或者说电脑,而你的宿主机目录是一个U盘,挂载后,你往宿主机该目录里放文件,那么通过容器里对应目录便可以访问到此文件,不需要重新生成容器就可以在“容器外部”添加和修改某些文件,如我用Mythri工具检测智能合约漏洞,采用docker容器如下命令:docker run -v $(pwd):/tmp mythril/myth analyze /tmp/test.sol,将宿主机当前目录挂载到容器的tmp目录,则在容器中操作时tmp目录就是当前的目录,在当期目录中新建智能合约或者改变旧的合约如test.sol的内容,再通过analyze命令检测合约即可,既不用重新生成容器,也不需要知道容器的绝对路径从而将新合约复制进去,只需要复制到当前目录即可。
1、我们首先在本机的home目录下,新建一个名叫ceshi的目录,随后我们将主机的home/ceshi 目录挂载到容器的home目录下。到时候这两个目录任一一个有改动,另外一个目录也能同步改动
2、进一步查看已经开启数据卷的容器的进程信息,使用inspect命令
3、新开一个会话,进入到linux的home/ceshi目录下,可以看到,ceshi目录是没有任何文件的
4、开始测试,往容器的home目录添加文件,新建test.java文件
5、去linux的home/ceshi目录查看,是否有新建的test.java文件
结果:可以看到,主机目录已经成功挂载到容器的目录里。容器里面的home目录有什么变动,linux下的home/ceshi目录也会跟着同步。
下面我们来变动linux中home/ceshi/test.java文件,那容器home目录下的test.java文件会不会也会跟着变动呢?
1、这里,我往linux的test.java文件,输入了一行字,:wq 保存退出。
2、现在去查看容器的test.java文件,可以看到,也是同步成功的
根据上面我们得出结论。容器数据卷功能,是通过在启动容器时,加上-v 参数,写上要挂载的目录和绑定的目录,使得这两个不在同一个层面的目录有了双向绑定的功能,数据可以实现同步(就算是容器已经停止运行,双向绑定的作用依然有效)。
安装mysql进行数据卷的实战测试
测试连接:
这里我使用Navicat Premium工具连接测试
192.168.239.128 是我的linux地址,可以看到,连接成功
查看linux中的home/mysql文件夹:
然后我们使用Navicat Premium 工具,在该mysql中新建test数据库:
重新查看本机的home/mysql/data目录,可以看到,新增了test文件夹
以上得出结论,我们是在容器的mysql新建了数据库,我们可以在linux上找到容器新建的test数据库,这两个文件夹实现了双向绑定。假如我们把容器删除了,数据也不会丢失,实现了数据的持久化功能。
具名和匿名挂载
使用docker volume 查看数据卷的文件夹信息
因为上面的命令匿名挂载,也就是没有指定主机目录,所以它会自己生成一个目录,这里我都进入看过,它会把5935c0c0d5939c6c0567a588feacb171ec5bbe15be327e1952a32aef 目录挂载到容器的/etc/nginx目录中。
下面我们继续使用docker volume 命令,查看数据卷文件夹具体路径:
从上面可以看出来,数据卷的文件夹放在/var/lib/docker/volumes/目录下,我们直接去到该目录下查看是否有nginx的文件
可以看到,nginx文件也是正确同步的。匿名挂载的缺点,就是生成的挂载目录的名字是不确定的,使我们不知道真正挂载的目录是哪一个,只能一个个找。
具名挂载
同样,我们启动一个nginx容器,这一次我们指定主机目录juming (没有放在相对路径上,前面不需要加 “/”) ,此时再用docker volume 命令去查看目录的路径
从上面的匿名挂载和具名挂载得出结论,
不同点: 匿名挂载就是挂载的时候不主动指定要挂载的主机目录,此时会自动生成一个挂载目录,但是具体叫什么名字我们不清楚,只能使用 ”docker inspect 容器id “命令,从进程信息的mounts找出挂载的本机目录名称。 具名挂载就是在挂载的时候手动指定一个要挂载的目录,此时我们 ”docker volume ls “命令就能很轻松找到对应的主机目录。
相同点:具名挂载和匿名挂载的主机目录都是存放在”/var/lib/docker/volumes/”路径上的
拓展:
#ro 只要看到ro 就说明这个路径只能通过宿主机来操作,容器内部无法操作!(测试:看下面两张图片)
往主机添加test.java文件(图1),可以看到容器也有test.java文件(图2),但是往容器添加test2.java文件,却报只有只读权限(图2)。
图1
图2
初识Dockerfile
构建dockerfile命令:docker build
Dockerfile 就是用来构建 docker 镜像的构建文件,命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令。每一个命令都是一层。
构建自己的镜像
可以看到,这里构建镜像分成了四步,并且我们前面写的输出的一句话,也正常输出来了
—–end——
启动自己镜像进行测试
但是上面的挂载有一个问题,那就我们并没有指定本机的目录,只是挂载的容器里的目录 volume01 和volume02 ,这是属于匿名挂载。所以它生成的本机目录是一窜很长的16进制表示的目录名。
使用docker inspect 容器id 命令,查看该容器的进程信息,就可以得到该容器的进程信息,可以从进程信息找到该容器的挂载的本机目录
从进程信息中,找到mounts ,可以看到主机的目录
跟前面的数据卷一样,文件也是双向绑定的。在容器里的volume01目录有变动,本机的/var/lib/docker/volumes/656e215f0d4b1b8df2eb81bba49beebeb03ea2c483d25e902/_data 也会跟着同步。同理,volume02 也一样。
以上这种构建dockerfile的方式未来我们用的十分多。因为偶们通常会构建自己的镜像!
数据卷容器
就是多个容器间进行数据共享,使用–volumes-from 命令
第一步,启动一个docker01容器,就用我们前面自己构建的镜像
第二步,继承docker01镜像,启动一个docker02容器,使用–volumes-from 参数
可以看到,docker01 和docker02 都拥有volume01 和volume02 目录, 这个两个目录是同步数据的,下面我们来测试一下:
此时去到docker02 容器,查看volume01 文件,test.java文化也是存在的,这就实现了数据卷容器的同步功能
那么,如果我要同步容器3、容器4 呢,这里继续测试,我们继承docker02 ,启动docker03
可以看到,同步依然是有效的。
如果docker03 继承docker01 启动,可不可以呢? 答案也是肯定的,也是能实现数据共享的!!
删除了docker 01 后,docker02 和docker03 依然可以实现数据共享。跟容器是否启动是无关的!
所以得出结论,要实现容器间的数据共享,只需要在docker run 增加–volumes-from 参数 父类容器名称 ,就可以实现容器间的数据共享。 只要有共同一个父类就可以。
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦持久化到了本地,这个时候,本地的数据就不会删除,就算容器没有再使用了。
DockerFile
dockerfIle 是用来构建docker镜像的文件!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub 、阿里云镜像仓库等)
很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。
DockerFile 构建过程
基础知识:
- 每个保留关键字(指令) 都是必须大写字母
- 执行从上到下顺序执行
- #表示注释
- 每个指令都会创建提交一个新的镜像层,并提交!
类似我们上面写的,dockerfile ,就是一层一层的
dockerfile 是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile 文件,这个文件十分简单!
Docker 镜像逐渐成为企业交付的标准。
步骤: 开发,部署,运维
Dockerfile: 构建文件,定义了一切的步骤,源代码。
DockerImages: 通过Dockerfile 构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
Dockerfile的指令
以下是各种命令的含义:
实战测试
Docker Hub 中99% 镜像都是从这个基础镜像过来的FROM scratch ,然后配置需要的软件和配置要进行的构建
我们先启动centos ,在容器里面使用 vim 命令和 ifconfig 命令,发现,都是不支持这个命令的,说明官方的centos容器是阉割版的,那我们就自己构建一个centos,是它能够支持vim 和ifconfig命令
构建自己的centos
创建目录,并在该目录新建一个mydockerfilecentos 文件,并且写上要构建的镜像指令
构建成功
注意查看docker容器里面的centos版本是不是8.0,本机的centos是7.9的情况,这种时候构建遇到 yum命令时会报错,需要在dockerfile文件中,指定下载为7版本的centos,即可解决
使用docker history 镜像id 来查看dockerfile变更历史
我们平时拿到一个镜像,可以研究一下它是怎么做的
CMD 和 ENTRYPOINT 区别
测试cmd
测试ENTRYPOINT
实战:Tomcat 镜像
1、准备镜像文件,tomcat压缩包,jdk压缩包
2、新建readme.txt,Dockerfile文件 ,并且填写dockerfile指令(这里我们是要建一个tomcat 和jdk的镜像),随后构建写好的dockerfile文件
第3步、启动该镜像
镜像 启动参数说明:
第4步,开始测试,tomcat是否成功
直接去访问linux地址的9090端口,查看是否有tomcat 页面:
可以看到,tomcat是正常运行的
第五步。继续测试tomcat ,因为我们在启动自己制作的diytomcat镜像时,将本机的/home/tomcat/test 目录与容器里面的/usr/local/apache-tomcat-9.0.63/webapps/test 绑定了,所以,我们直接往本机的/home/tomcat/test 目录,新增index.jsp ,那么容器的apache-tomcat-9.0.63/webapps/test 目录也是会有index.jsp文件的,这时候去访问本机地址:9090/test 地址,是会识别到index.jsp文件的,并把里面的内容解析成网页的。
1)进入到本机的/home/tomcat/test目录,新建index.jsp ,并且填上内容:
2) 直接访问本地地址:9090/test 路径
可以看到,容器里面的tomcat正确的解析了index.jsp文件,生成了网页。并且我们可以去本机查看容器里面的logs日志(这个也是在启动该镜像的时候绑定好的)
结论1:该diytomcat镜像,是我们自己一手打造出来的,实现了tomcat镜像该有的功能。
结论2:通过这种双向绑定的方式,我们的linux本机不需要安装tomcat镜像,只需要将其中的一个目录绑定在有tomcat的docker容器里,我们就可以实现,在本机上传web工程,让docker容器解析的功能。
发布自己的镜像
1、地址 https://hub.docker.com/ 注册自己账号
2、确定这个账号可以登录
3、在我们的服务器上提交自己的镜像
登录成功后,需要修改tag ,也就是给自己的镜像一个版本号,使用docker tag 命令
推送自己的镜像到docker hub ,使用docker push 命令
注意:修改tag的时候,最好修改成自己dockerhub 用户名字/ 镜像名称的形式, 如果前面用户自己的docker hub镜像命名,那后面push就会被拒绝。 这里我的docker hub 用户名就叫morningchan ,
可以看到,push 成功(这里速度太慢了,毕竟国外的网站)
Navicat for Premium 9.0.2激活
今天的文章
Navicat for Premium 9.0.2激活(Docker 入门流程)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/109542.html