docker简单学习笔记

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} #递归删除全部的镜像
  • 容器命令
  1. 运行容器,每次docker run都会创建一个新的容器,如果想重启一个容器,可以用docker start ID
docker run [可选参数] image 
    --name 容器名
    -d 			后台方式运行
    -it			使用交互方式运行,进入容器查看内容
    -p			指定容器的端口
        -p ip:主机端口:容器端口
        -p 主机端口:容器端口(常用)
        -p 容器端口
    -P			随机指定端口
  1. 启动并进入容器
docker run -it centos /bin/bash
  1. 退出容器
#停止并退出容器
exit
#不停止并退出容器
ctrl p q
  1. 查看正在运行中的容器
docker ps  
    -a			查看正在运行中的+历史运行过的容器
    -n=1		查看最近创建过的1个容器
    -q			只显示ID
  1. 删除容器
docker rm ID
  1. 一些基操
docker start ID		#启动
docker restart ID	#重启
docker stop ID		#停止
docker kill ID		#强制停止
  1. 后台运行容器
docker run -d centos
#此时docker ps会发现centos没有在后台进行,因为docker看你运行它又没干嘛,自己帮你把它kill了
  1. 查看容器日志
#后台进行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
  1. 查看容器元数据
docker inspect ID
  1. 进入正在运行的容器
docker exec -it ID /bin/bash     #这个会开启一个新的终端
docker attach ID				 #进入容器正在执行的终端,不开启新的进程
  1. 将容器中文件拷贝到本机
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目录下的内容关联起来

具名挂载与匿名挂载

  1. 先说一下docker volume
  • 查看数据卷:docker volume ls
  • 创建数据卷:docker volume create 容器卷名
  • 查看容器卷详细信息:docker volume inspect 容器卷名
  • 删除容器卷:docker volume rm 容器卷名

容器卷在/var/lib/docker/volumes目录下

  1. 具名挂载

具名挂载就是指有指定容器卷,容器卷不存在自动创建

#具名挂载,指定容器卷名为tomcat-vol
docker run -d -P -v tomcat-vol:/usr/local/tomcat tomcat:9.0
#此时用docker volume ls | grep tomcat-vol,可以看到有这个容器卷
  1. 匿名挂载

匿名挂载就是没有指定容器卷,此时会自动创建名字跟脸滚键盘一样的容器卷

#匿名挂载,-v后面只带需要挂载的容器内的路径而已
docker run -d -P -v /usr/local/tomcat tomcat:9.0
#可以通过docker inspect 容器id来查看它的具体挂载的容器卷名
#"Mounts": [
#           {
#                "Type": "volume",
#                "Name": "27dfc5bb3c17e823748887fd83d6034c430d9a70a127fe25ae30cada1bea9f42",
  1. 容器卷读写权限

可在-v后的指定完容器内路径后再加上:rorw

  • ro即read only,在容器内无法搞写操作,只能在容器卷上搞
  • rw即read write,这个就是默认的
docker run -d -P -v tomcat-vol:/usr/local/tomcat:ro tomcat:9.0

DockerFile

  1. 指令

在这里插入图片描述

  1. 整个活,搞个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指令
  1. 查看构建过程(构建历史)
docker history IMAGE_ID

Docker网络

先使用ip addr查看,可以看到这里面有一个docker0的网卡

在这里插入图片描述

先启动一个tomcat

docker run -d -P --name=tomcat01 tomcat

再看一下ip addr,会再多出来一对网卡,一个是在宿主机,一个是在容器内

ip addrdocker 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网段中,从而实现了容器和自定义网段的互联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值