看完这一篇,你还不会Doker吗
目录思维导图:
前言:
docker大家不要觉得很难,不好学,就拿当初我们一个老师说数据库,那个东西呀,不就是个软件,一学就会,当然了docker也不过就是一个软件,安装在Linux上然后使用,那当然了,学习docker我们需要有Linux基础,如果你还不会Linux,一篇带你入门Linux,这里:https://blog.csdn.net/hello_list/article/details/123977208,因为都是博主本人写的,前后都是有联系的哦,废话不多说,开始docker之旅;
官网:https://www.docker.com/
简单大家英语,看是否知道这两句话什么意思,百度翻译一下看是否正确!
Developers Love Docker. Businesses Trust It.
Build safer, share wider, run faster: New updates to our product subscriptions.
官网教程:https://www.docker.com/,接下来我们跟着官网一起学习
介绍
来自白度百科:
我们拆开来理解:docker是一个虚拟化技术,也就相当于我们用的VMware,没有钱购买云服务器,只能通过在本地安装一个软件,然后配置一套Linux环境,而docker就相当于,Linux这样一款软件,什么是沙箱呢,就是安全机制,好几多个虚拟机,但是之间的数据并不会互相传递;
下载安装
博主没有钱,博主用vm,博主自己装虚拟机,那就是vm虚拟机centos7安装docker;
安装过程需要root权限,直接却换到root用户进行了,所以sudo都省去了
1.查看当前的内核版本
uname -r
我这里是3.10 ,满足条件。
2、使用 root 权限更新 yum 包(生产环境中此步操作需慎重,看自己情况,学习的话随便搞)
yum -y update
这个命令不是必须执行的,看个人情况,后面出现不兼容的情况的话就必须update了
注意
yum -y update:升级所有包同时也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内
3、看下自己的虚拟机上是否有docker,我这里没有,如果有的话,卸载了
[root@localhost ~]# docker version
bash: docker: 未找到命令...
[root@localhost ~]#
#卸载旧版本(如果之前安装过的话)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4.安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置 yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
docker有两种版本,一种是企业版ee需要付费使用,另一种是社区版ce,免费使用,博主选择免费版
6、安装docker-ce
yum install -y docker-ce
7、验证是否安装成功
docker version
安装完成之后我们看到这里有报错,是因为我们的docker服务还没有启动,启动docker服务:
systemctl start docker
systemctl enable docker.service #设置开机自动启动docker服务
我们再看,就好了:
Hello World
万事开头hello world,我们可以拉取hello world镜像
docker run hello-world
ok,安装并且测试成功!
快速上手
查看镜像
先前我们安装了一个hello world镜像,那怎么查看呢:docker images
查看拉取的镜像;
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
[root@localhost /]#
/var/lib/docker为docker的工作目录
卸载镜像
docker rmi -f [镜像id] [镜像名称] 、docker rmi -f $(docker images -aq):全部删除,shell语法
#删除hello world
[root@localhost lib]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
[root@localhost lib]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
[root@localhost lib]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost lib]#
快速上手安装一个tomcat
1、拉取镜像
这里的镜像呢,大家就可以认为是软件包嘛,下载软件你才能使用
docker pull tomcat:9.0 #安装9.0版本
2、运行tomcat容器
docker run -it -d -p 1234:8080 --name tomcat01 tomcat:9.0
我们通过电脑去访问Linux上的tomcat,虚拟机内网地址是:192.168.244.151,在浏览器中访问192.168.244.151:1234
成功访问,但是有小伙伴有疑问了,这是成功访问吗,是404,但是你没有看到这已经是tomcat启动才报出的404页面吗,哈哈,这是因为,这些镜像并不是完整的,是经过压缩的,所有该省的都省去了,到这里就算是访问此时成功了,那我们还是要使用以下tomcat容器的;
3、自制页面
进入容器:docker exec -it 容器id /bin/bash
,这是进入容器,那我们怎么退出容器呢,两次Ctrl+q+p
就可以全身而退,容器也还在运行;
如果我们通过拉取一个文件到这里我们发现,不成功因为它是压缩版,好多命令都省去了,我们可以这样;
root@6cf6c699fb65:/usr/local/tomcat/webapps# cd hello
root@6cf6c699fb65:/usr/local/tomcat/webapps/hello# echo '<html><body>我是docker的tomcat01<body></html>' >> index.html
这时候我们再访问http://192.168.244.151:1234/hello/,ok访问成功,这时候有乱码问题,先不管了,后面再处理吧;
当然了,这时候有小伙伴说,天天拿着不是hello就是world,整个页面吧,就这些,这次那我们就不这样了,这里我给小伙伴从网上找了一个好看的网页模板;一个文件夹,那我们把这个简单的网页发布到tomcat容器上,这时候不能直接拖进去;
这里呢可以实现的方法很多:
1、将容器停止进行卷挂载,这里后面细说
2、将文件移动到虚拟机,再通过虚拟机移动到容器
3、//尝试了,不行,大家有想法可以去试试最后就是,不是缺少命令嘛,我们直接添加上这个命令,哪个最简单现在,第三个,我们试下
我们选择第2个:
命令:docker cp 本地路径 容器长ID:容器路径
xftp下载安装
之前我们安装过xshell,但是只能一拽文件到虚拟机传输,目录则不行,这里我们使用需要下载一个xftp工具,这样可以很好的进行文件传输,还是破解版,很简单;
地址:https://www.jb51.net/softs/732920.html#downintro2
大家不要点错下载地方,点这里,然后根据图文教程即可完成安装:
点击这里我们就可以实现文件的传输:
把文件移动到docket容器中:
[root@localhost dockerwork]# ls
xuexiriji
[root@localhost dockerwork]# docker cp /home/dockerwork/* 6cf6c699fb65:/usr/local/tomcat/webapp
传输成功,测试访问成功:
网页模板留给你们,不要再说博主每次不是hello就是world,咱们功能到位就行,好看的页面那不多了:
链接:https://pan.baidu.com/s/1gjQAc9_JeIozcn2e7AP39A?pwd=rirg
提取码:rirg
Docker Hub仓库
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
这里的仓库,就相当于我们的依赖,所有的镜像都在仓库中,我们所使用的镜像子在本地不存在,就回去仓库拉取;
我们可以搜一下centos镜像,看下都有什么:
当然我们不只是在官网可以搜索,在Linux虚拟机上同样也可以搜索:
命令:docket search 镜像名
是不是和官网上差不多呢,我们还可以直接拉取镜像,pull,当然还可以推送自己的镜像;
#拉取镜像
$ docker pull ubuntu
#推送镜像,username替换成Docker 账号用户名。
$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED ...
ubuntu 18.04 275d79972a86 6 days ago ...
username/ubuntu 18.04 275d79972a86 6 days ago ...
$ docker push username/ubuntu:18.04
$ docker search username/ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu
镜像
镜像可以这么理解,你手机要安装软件,是不是就是需要一个安装包,就相当于镜像,安装后的软件就相当于容器;
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
- 1、管理和使用本地 Docker 主机镜像
- 2、创建镜像
无非是几条命令:
列出自己的镜像
[root@localhost dockerwork]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 402713d372bf 13 days ago 680MB
tomcat latest b00440a36b99 13 days ago 680MB
获取镜像
docker pull 镜像名:版本号
查找镜像
docker search 镜像名
拉取镜像
docker pull 镜像名:版本号
推送镜像
docker push 镜像名:版本号
删除镜像
docker rmi 镜像名
设置镜像标签
docker tag 镜像id 标签内容
构建镜像
后面我们细说dockerfile
使用镜像
例如:
这也是创建并进入容器
docker exec -it 容器id /bin/bash #我们之前就是这样进入镜像的
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
还记得我在之前说第三种方法,更新镜像命令嘛,但是没有成功,现在你知道了吗?
我们可以更新命令:
先通过 apt-get update
更新软件包,然后apt install 命令
,比方想使用vim,我们可以,apt install vim
就可以,这样我们就可以自己制作自己的centos容器;
容器
查看容器
docker ps #查看当前正在运行的容器
docker ps -a #查看全部容器
#更多命令查看 docker ps --help
运行容器
docker exec -it 容器id /bin/bash #我们之前就是这样进入镜像的,这是直接创建并进去荣去
docker start 容器id #我们构建好容器可以这样启动容器
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
- name:指定容器名字。
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
- v:映射卷挂载。
删除容器
docker kill 容器id
docker rm -f 容器id
docker rm -f $(docker ps -aq) #删除全部容器
停止容器
docker stop # 停止容器
docker restart # 重启容器
退出容器
exit #关闭并退出容器,容器也就不运行了、
ctrl+q+p #全身而退,容器还在运行
进入容器
#两种方法,区别
docker exec #我们之前使用过,直接进去容器,进入容器开启一个新的终端
docket attach #进入容器不会开启新的终端,而是正在运行的终端
连接容器
基础篇不说
拷贝容器
还记得我们在方法2中的时候已经使用了:
命令:docker cp 本地路径 容器长ID:容器路径
反过来,容器内文件也可以到虚拟机;
卷挂载
什么是卷挂载
我们知道容器一旦关闭里面的数据也会丢失,如果我们使用mysql容器,容器关闭,数据没了,那不完蛋了,所以我们得把容器内的数据保存在本地,将数据写在本机卷里,实现数据的持久化,什么是挂在呢,就是让容器与我们得本机使用同一个目录工作,这就是挂载,下面我们实现下就可以理解了,这张图我们也可以用来理解:
1、指定本地卷挂载
我们在启动容器的时候就可以挂载我们的虚拟机的卷,可以使用-v参数启动容器挂载:
dokcer run -it -v 主机内目录:容器内目录 镜像名/id
这里我们在创建一个tomcat,将webapp目录挂载到我们虚拟机的/home/tomcatTest/tomcat02/webapp,发现是不是我们的命令越来越长了:
docker run -d -it -v /home/tomcatTest/tomcat02/webapp:/usr/local/tomcat/webapp --name tomcat02 tomcat:9.0
# 开始 我这里并没有tomcatTest目录
[root@localhost home]# ls
admin dockerwork hello hello.c hello.sh test Testlable.class
# 执行完命令,我们发现我们就有了tomcatTest/tomcat02/webapp
[root@localhost home]# ls
admin dockerwork hello hello.c hello.sh test Testlable.class tomcatTest
[root@localhost home]# cd tomcatTest/
[root@localhost tomcatTest]# ls
tomcat02
[root@localhost tomcatTest]# cd tomcat02/
[root@localhost tomcat02]# ls
webapp
# 我们看查看下容器内,webapp目录下什么也没有
[root@localhost tomcat02]# docker exec -it f988c8f1fe6d /bin/bash
root@f988c8f1fe6d:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp webapps.dist
CONTRIBUTING.md README.md bin logs webapp work
LICENSE RELEASE-NOTES conf native-jni-lib webapps
root@f988c8f1fe6d:/usr/local/tomcat# cd webapp
root@f988c8f1fe6d:/usr/local/tomcat/webapp# ls
root@f988c8f1fe6d:/usr/local/tomcat/webapp#
# 我们在容器外添加一个hello/index.html
[root@localhost tomcat02]# cd webapp/
[root@localhost webapp]# ls
[root@localhost webapp]# mkdir hello
[root@localhost webapp]# cd hello
[root@localhost webapp]# vim index.html
[root@localhost webapp]# cat index.html
hello 我是外部虚拟机创建的文件
# 我们查看容器内,容器内同时也有我们创建的目录和文件,外部访问下
[root@localhost webapp]# docker exec -it f988c8f1fe6d /bin/bash
root@f988c8f1fe6d:/usr/local/tomcat# cd webapp
root@f988c8f1fe6d:/usr/local/tomcat/webapp# ls
hello
root@f988c8f1fe6d:/usr/local/tomcat/webapp# cd hello/
root@f988c8f1fe6d:/usr/local/tomcat/webapp/hello# ls
index.html
root@f988c8f1fe6d:/usr/local/tomcat/webapp/hello# cat index.html
hello 我是外部虚拟机创建的文件
# 我们同样的道理在容器内添加的一个test目录,回到虚拟机我们同时也可以看到,这时候就实现了卷挂载
root@f988c8f1fe6d:/usr/local/tomcat/webapp/hello# mkdir test
root@f988c8f1fe6d:/usr/local/tomcat/webapp/hello# read escape sequence
[root@localhost webapp]# ls
hello
[root@localhost webapp]# cd hello
[root@localhost hello]# ls
index.html test
2、匿名挂载
与我们之前的都一样,-v的时候不指定主机挂载目录,我们再创建一个容器:
docker run -d -it -v /usr/local/tomcat/webapp --name tomcat03 tomcat:9.0
[root@localhost hello]# docker run -d -it -v /usr/local/tomcat/webapp --name tomcat03 tomcat:9.0
5d811a8d101807ab3e73e20f66cb5b77e61afe58c2756a704c29ff46ff9dae10
[root@localhost hello]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d811a8d1018 tomcat:9.0 "catalina.sh run" 45 seconds ago Up 43 seconds 8080/tcp tomcat03
f988c8f1fe6d tomcat:9.0 "catalina.sh run" 22 minutes ago Up 22 minutes 8080/tcp tomcat02
[root@localhost hello]# docker volume ls
DRIVER VOLUME NAME
local f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989
这里我们再了解一个命令参数 inspect ,这里我们可以直接查看容器元数据:
[root@localhost hello]# docker inspect tomcat03
# 我们可以查看一大堆该容器的数据,这时候我们看到Mounts挂载这里,可以看到我们容器内/usr/local/tomcat/webapp,已经挂载出去了,并且挂载在本机/var/lib/docker/volumes/f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989/_data
#这里就是我们不指定本机路径的默认挂载路径:/var/lib/docker/volumes/容器id/_data
#挂载id 因为我们没有起名字,随机得id:f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989
"Mounts": [
{
"Type": "volume",
"Name": "f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989",
"Source": "/var/lib/docker/volumes/f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989/_data",
"Destination": "/usr/local/tomcat/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 我们查看下 docker的卷
[root@localhost hello]# docker volume ls
DRIVER VOLUME NAME
local f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989
#可以看到挂载成功
3、具名挂载
其实就是很简单,起来个名字,我们再创建一个容器:
docker run -d -it -v helloname:/usr/local/tomcat/webapp --name tomcat04 tomcat:9.0`
[root@localhost hello]# docker run -d -it -v helloname:/usr/local/tomcat/webapp --name tomcat04 tomcat:9.0
72a1c417e74a793f37fd4b72fa1be0b81385817ac69da125e9960cf301d16836
# 我们首先查看下容器元数据,我们看到了name已经换成了我起的名字helloname
# "Source": "/var/lib/docker/volumes/helloname/_data"
# "Destination": "/usr/local/tomcat/webapp"
"Mounts": [
{
"Type": "volume",
"Name": "helloname",
"Source": "/var/lib/docker/volumes/helloname/_data",
"Destination": "/usr/local/tomcat/webapp",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
# 查看下docker的卷
[root@localhost hello]# docker volume ls
[root@localhost hello]# docker volume ls
DRIVER VOLUME NAME
local f280b19499b3f9cefcb66e474285af29c0088c06ef7fb771fa7ec47527fdb989
local helloname
相信到这里你已经理解了
总结
-v 容器内部路径 # 匿名挂载
-v 名称:容器内部路径 #具名挂载
-v /宿主机路径:容器内部路径
扩展:
# docker run -d -it -v helloname:/usr/local/tomcat/webapp:ro --name tomcat04 tomcat:9.0`
# docker run -d -it -v helloname:/usr/local/tomcat/webapp:rw --name tomcat04 tomcat:9.0`
ro 只读 设置为这种,我们在容器内是不可以修改挂载数据的,只能在宿主机挂载路径下进行修改
rw 可读可写(数据挂载默认)
快去尝试下;
Dockerfile
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,其实就是构建容器的一个脚本文件;
我们学习一下里面的命令即可:
想了想,后面更新,单独一个细讲;
Docker网络
总结
最后没写完,因为感觉这样太多了,不过相信你到这里已经对docker理解很多了,不要想象的太困难,毕竟只是一个相当于软件的东西,希望这个文章对你有帮助;
相信到这里你已经学会用docker了,即使我没有写这一部分,相信你会比我更快地去学会,那看到这里了,点个赞吧,留个关注也行啊!😀