docker学习
docker基本组成
镜像(image):
docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像–>run–>tomcat容器,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container):
docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
仓库(repository):
存放镜像的地方
基本指令
- 帮助指令
docker version #docker 版本基本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 指令 --help #帮助指令
- 镜像指令
docker images #查看本机所有镜像指令(-a显示全部,-q只显示ID)
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像仓库源 镜像标签 镜像ID 镜像创建时间 大小(kb)
docker search mysql #查找mysql镜像
docker search mysql --filter=stars=3000(stars数大于等于3000)
docker pull mysql #下载mysql镜像,默认下载最新
docker pull mysql:5.7 #指定版本下载
docker rmi 镜像ID #删除镜像,rmi(remove image)
docker rmi -f ${docker images -aq} #递归删除全部的镜像
- 容器命令
- 运行容器,每次docker run都会创建一个新的容器,如果想重启一个容器,可以用docker start ID
docker run [可选参数] image
--name 容器名
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
- 启动并进入容器
docker run -it centos /bin/bash
- 退出容器
#停止并退出容器
exit
#不停止并退出容器
ctrl p q
- 查看正在运行中的容器
docker ps
-a 查看正在运行中的+历史运行过的容器
-n=1 查看最近创建过的1个容器
-q 只显示ID
- 删除容器
docker rm ID
- 一些基操
docker start ID #启动
docker restart ID #重启
docker stop ID #停止
docker kill ID #强制停止
- 后台运行容器
docker run -d centos
#此时docker ps会发现centos没有在后台进行,因为docker看你运行它又没干嘛,自己帮你把它kill了
- 查看容器日志
#后台进行centos镜像,并每隔5秒打印一条日志
docker run -d centos /bin/sh -c "while true;do echo docker study;sleep 5;done"
#查看容器最近10条日志
docker logs -tf --tail 10 ID
- 查看容器元数据
docker inspect ID
- 进入正在运行的容器
docker exec -it ID /bin/bash #这个会开启一个新的终端
docker attach ID #进入容器正在执行的终端,不开启新的进程
- 将容器中文件拷贝到本机
docker cp 容器ID:路径 本机路径 #容器运行不运行都正所谓
docker cp 9796c9ff1b50:/home/test.java /home/
部署尝试
docker search nginx
docker pull nginx
docker run --name nginx01 -d -p:8081:80 nginx #启动容器,容器名为nginx01,后台运行,从容器的80端口映射到本机的8081端口
docker exec -it nginx01 /bin/bash #进入nginx
whereis nginx #查看ngingx相关的东西的路径
#部署好了可以curl localhost:8081,看一下内容
可视化工具
portainer
docker run -d -p 3389:9000 \--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
执行完上面的指令,下载好镜像启动容器后,上浏览器看一下
http://ip:3389/
初始化账号密码后就可以进去点一点了
这个好像不太会有用
镜像commit
docker commit -m="add webpack" -a="RR" c8bb596d9bbc mytomcat:1.0
docker commit -m="提交的信息" -a="作者" 容器ID 自定义镜像名:版本
数据卷
其实就是目录映射,将容器内的文件映射到linux中,可以用此避免删除容器而导致容器中的数据全丢了的情况(比如mysql)
指令
docker run -it -v /home/test:/home centos /bin/bash
启动centos容器,并将linux本机的/home/test目录与容器中的/home目录下的内容关联起来
具名挂载与匿名挂载
- 先说一下docker volume
- 查看数据卷:docker volume ls
- 创建数据卷:docker volume create 容器卷名
- 查看容器卷详细信息:docker volume inspect 容器卷名
- 删除容器卷:docker volume rm 容器卷名
容器卷在/var/lib/docker/volumes
目录下
- 具名挂载
具名挂载就是指有指定容器卷,容器卷不存在自动创建
#具名挂载,指定容器卷名为tomcat-vol
docker run -d -P -v tomcat-vol:/usr/local/tomcat tomcat:9.0
#此时用docker volume ls | grep tomcat-vol,可以看到有这个容器卷
- 匿名挂载
匿名挂载就是没有指定容器卷,此时会自动创建名字跟脸滚键盘一样的容器卷
#匿名挂载,-v后面只带需要挂载的容器内的路径而已
docker run -d -P -v /usr/local/tomcat tomcat:9.0
#可以通过docker inspect 容器id来查看它的具体挂载的容器卷名
#"Mounts": [
# {
# "Type": "volume",
# "Name": "27dfc5bb3c17e823748887fd83d6034c430d9a70a127fe25ae30cada1bea9f42",
- 容器卷读写权限
可在-v后的指定完容器内路径后再加上:ro
或rw
- ro即read only,在容器内无法搞写操作,只能在容器卷上搞
- rw即read write,这个就是默认的
docker run -d -P -v tomcat-vol:/usr/local/tomcat:ro tomcat:9.0
DockerFile
- 指令
- 整个活,搞个centos,带上vim指令
一般docker pull下来的centos都是被阉割过的,少了很多指令,比如vim就没有,我们可以在centos的基础上,自己构建一个centos,然后加上vim指令,可以按下面步骤进行构建
- 先写个Dockerfile
FROM centos
MAINTAINER RR
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum install -y vim
EXPOSE 80
- 写完后构建镜像(如果文件名就为Dockerfile,-f可以省略)
docker build -f Dockerfile -t mycentos:0.1 .
- 构建成功后进入镜像
docker run -it mycentos:0.1
- 进入容器内后,能看到能使用vim指令
- 查看构建过程(构建历史)
docker history IMAGE_ID
Docker网络
先使用ip addr查看,可以看到这里面有一个docker0的网卡
先启动一个tomcat
docker run -d -P --name=tomcat01 tomcat
再看一下ip addr,会再多出来一对网卡,一个是在宿主机,一个是在容器内
用ip addr
和docker exec -it tomcat01 ap addr
这里面使用了一个veth-pair技术,它们之间就可以进行网络通信
容器互联
容器互联可以使用–link操作
docker run -d -P --name=tomcat03 --link tomcat02 tomcat
这样link起来后,tomcat03就能ping通tomcat02了,但是反过来ping不通,因为没有配置哩,其实就是在tomcat03的/etc/hosts
文件里,加了一下tomcat02的ip信息
docker exec -it tomcat03 ping tomcat02
使用docker network查看网络
#先找出bridge的network id
docker network ls
#再看一下
docker network inspect c49f37fec148
#可以看到有个container
"Containers": {
"688d945b799b7e062349e4d15363b97b0d411dd07016ed412afb18fbf0514919": {
"Name": "tomcat02",
"EndpointID": "45cb86b83dd59c6d9b7cd05d33633fdd69a17267dc26a5a8494a3265107515d5",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"973311b58a680d6ef178eed4f5bbde3fdaa34418e513a446fb58e707d8b2583b": {
"Name": "tomcat03",
"EndpointID": "64b167cdb6490110d77989b25dd19cb89fffa839fd0c3872df0d0081fcb40bf6",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"d4c48403b13af21ab5ea04c5e0503c6dc78d42ceea230676183cc467a2369e3d": {
"Name": "tomcat01",
"EndpointID": "07e7264cbdcedfb97c5d9d631a24b7453a47cb8376f3e8467100302062d00f94",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
没啥用
docker0和–link这种方式来实现容器互联比较笨重,还是自定义网络好,这个也做为铺垫,了解一下,没啥不好
自定义网络
其实平时的docker run,它会有一个默认的–net参数,它会指向docker0的那个网络
docker run -d -P --name=tomcat01 tomcat
docker run -d -P --name=tomcat01 --net bridge tomcat
我们也可以自己创建网络,创建一个mynte网络,以192.168…0.0做为网段,192.168.0.1做为网关
docker network create --subnet=192.168.0.0/16 --gateway=192.168.0.1 mynet
自定义的好处,容器之间可以相互ping通了,也可以直接使用域名ping通,而不需要去–link操作一下,也方便部署集群做网络规划
#创建两个tomcat,使用我们自定义的网络
docker run -d -P --name=tomcat-mynet-01 --net mynet tomcat
docker run -d -P --name=tomcat-mynet-02 --net mynet tomcat
#可直接ping通,不用--link
docker exec -it tomcat-mynet-02 ping tomcat-mynet-01
自定义网络后带来的问题(docker network connect解决)
我们可以通过自定义网络来规划不同的网段出来,那不同的网络之间要如何进行联通呢
先尝试一下,两个不同网段的tomcat能不能ping通
#这两种都是ping不通的
docker exec -it tomcat01 ping tomcat-mynet-01
docker exec -it tomcat01 ping 192.168.0.2(这个ip是tomcat-mynet-01的ip)
这个时候就需要用docker network connect
,它可以用来将容器与自定义网络进行联通,联通后以上两种ping的方式就都可以ping通
#将mynet与tomcat01容器联通
docker network connect mynet tomcat01
使用connect操作后,它会把这个容器再加一个ip到mynet网段中,从而实现了容器和自定义网段的互联