Docker总结
学习docker首先要学习docker的三大基本概念:仓库,镜像和容器
所谓 仓库就是就类型于maven仓库,git仓库,是专门存放东西的地方,docker中的仓库和maven和git仓库不同,maven仓库主要用来存放依赖架包的,git仓库主要用来存放代码的,而今天讲的docker的仓库主要是用来存放镜像的.
何为镜像?所谓镜像就是一个用来创建容器的工具,一个镜像可以创建多个容器,可以从官网仓库(docker hub)或者其他私服仓库拉取先要的镜像,或者通过dockerfile来构建属于自己的镜像
何为容器?容器是由镜像创建了,他可以被启动,停止,运行,删除,每个容器之间都是互相隔离的,保证安全,也可以把容器当做一个小型虚拟机(或者一个简单的linux环境)
知道了以上的三大概念,那么下面就需要了解如何使用?
首先需要安装Docker
安装比较简单,我们可以基于centos7 (必须3.10以上)进行安装,也可以基于其他版本安装,安装完以后可以使用命令docker version检验docker是否启动成功
其次安装完docker以后就需要创建容器
docker run -i -t --name ="自定义的容器的名字" 镜像的名字 /bin/bash
-i:默认是false ,允许你对容器内的标椎输入进行交互
-t:默认是false,在新容器内指定一个伪终端
/bin/bash 表示启动这个容器
使用exit表示退出守护式容器
查看容器:docker ps -a -l
-a表示查看多有的容器
-l表示查看最近创建的容器
查看容器的详细信息,比如可以看到ip信息 docker inspect 容器的名字
重启已经停止的容器:docker Satart 容器名
删除已停止的容器:docker rm 容器名
什么是守护者容器
大多是容器都是在创建好之后就关闭了.在真实的案例中,我们需要长期运行的容器提供服务.这就是docker的守护式容器.
以守护形式运行容器:docker run -i -t 镜像名 /bin/bash
退出不关闭容器:先ctrl+p,然后ctrl+Q
进入到运行中的容器中:docker attach 容器名
启动守护式容器:docker run --name 容器名字 -d 镜像名 /bin/bash
` -d表示不需要进入文件夹中,就可以启动文件
查看容器日志:docker logs -f -t --tail="all" 容器名
-f 默认为false 一致跟踪日志的变化,并返回结果
-t默认是false 在返回的结果上加上时间戳
--tail="all" 返回最后几行的日志数据
查看容器内的进程 docker top 容器名
在运行的容器中启动新的进程:docker exec -d -i -t 容器名 /bin/bash
停止守护式容器:
docker stop 容器名:发送一个信号给容器,等待容器的关闭
docker kill 容器名 :直接停止容器
如何使用docker进行部署网站
设置容器的端口映射
创建的容器就类似一个虚拟机,需要暴露接口给外面,因此需要进行容器的端口映射
docker run -p 80 -i -t centos /bin/bash
docker run -p 8080:80 -i -t centos /bin/bash
docker run -p 0.0.0.0:80 -i -t centos /bin/bash
docker run -p 0.0.0.0:8080:80 -i -t centos /bin/bash
-p 80 :就表示为容器暴露80的端口,任意路径和端口都可以映射80端口
-p 8080:80:表示为容器暴露80端口,任意的路径的8080端口才可以映射80端口
-p 0.0.0.0:80表示用指定的ip映射80端口,需要用指定的ip才可以访问
如何部署Nginx
1.创建一个容器.并映射容器的80端口
docker run -p 80 --name="容器的名字" -it centos /bin/bash
-it :就相当于-i -t
2.执行安装命令:
yum install -y epel-release
yum install -y nginx
3.运行nginx的命令.启动nginx服务 /usr/sbin/nginx
4.ctrl+p ctrl +q退出容器
5.在浏览器上进行访问http://虚拟机ip:32769/index.html
如果重启容器后会发现用原来的端口映射已经访问不到了,当重新启动容器会重新给我们进行端口的映射.
Docker的镜像和仓库
查看所有镜像 docker images
查看镜像信息docker inspect 镜像名字或id
删除镜像 docker rmi 镜像名 -f
-f 表示强制删除
删除对应仓库中所有镜像 docker rmi $(docker images -q centos)
如何获取和推送镜像
查找镜像有两种方式:1.docker hub 2.docker search 镜像名字 term
拉取镜像:docker pull 镜像名:版本号
拉取速度慢,可以使用镜像加速器进行加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://175i7vum.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
推送镜像: docker push 镜像名(按照阿里云中给出的步骤进行拉取)比如:
1.注册hub的账号.
2.登陆hub的账号.docker login
3.使用push命令推送到hub中
构建镜像
两种方式进行构建
第一种:docker commit 通过容器进行构建(不常用)
第二种:docker build 通过Dockerfile文件构建(比较常用)
第一种方式
使用commit构建镜像
1.创建一个容器并安装nginx服务
2.提交镜像
docker commit -a 'dongdd' -m 'nginx' web01 dong/web01
其中dondd是作者的名字,'nginx'表示提交的信息,web01是基于的容器名字,dong/web01是创建的仓库名或者镜像名字
3.根据刚才创建的镜像创建并启动容器
docker run -d --name nginx_web01 -p 80 dong/web01 /usr/sbin/nginx -g "daemon off;"
其中nginx_web01表示创建的容器的名字,dong/web01表示的自定义的镜像,
将镜像推送到Registry
docker login --username=it_dong registry.cn-hangzhou.aliyuncs.com
docker tag bd4bec9af65d registry.cn-hangzhou.aliyuncs.com/dong_dd/web-nginx:1.0
docker push registry.cn-hangzhou.aliyuncs.com/dong_dd/web-nginx:1.0
拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/dong_dd/web-nginx:[镜像版本号]
第二种方式:
使用dockerFile构建镜像
DockerFile的指令:
使用CMD指令解决默认命令
FROM centos
MAINTAINER dongdd "[email protected]"
RUN yum install -y epel-release
RUN yum install -y nginx
EXPOSE 80
docker build -t="dong/web01" /root/dockerfile/df1
docker run -d -p 80 dong/web02
所谓dockerfile构建镜像,其实就是要必须有一个Dockerfile 的文件,这个文件中写的一行一行的命令,然后通过docker build xxxx进行构建镜像,然后根据构建好的镜像创建容器的过程
使用Dockerfile文件构建镜像必须要写好Dockerfile文件中的指令:
FROM指令:表示是基于哪一个镜像的,必须要写
MAINTAINER:表示作者的信息 后面包含作者名和邮箱
RUN:表示指定当前镜像中运行的命令,每个RUN命令都会在当前镜像的上层创建一个新的镜像来运行指令.
EXPOSE:表示指定运行该镜像的容器使用的端口,
我们使用EXPOSE只是告诉Docker运行该镜像的容器会使用80端口,出于安全的考虑,docker并不会打开该端口.
而是需要我们在使用该镜像运行容器的时候指定端口的映射.
CMD:表示默认的命令指令,后面添加相应的指令,然后在启动容器的时候可以不用写这些指令了,因为已经默认执行了,但是如果在启动容器的时候运行其他指令,这时候哪个默认指令则会被覆盖
ENTRYPOINT:表示默认的命令指令,和CMD类似,但是这个命令不会被覆盖
ADD:将文件和目录复制到使用dockerfile构建的镜像中
COPY:和ADD类似,比如可以使用copy替换默认首页的情况,只需要在COPY后面添加自己定义的文件路径. 后面在跟上其他文件路径,运行的时候就会执行自定义的路径
ONBUILD:镜像触发器:表示当一个镜像被其他镜像作为基础镜像时执行时,会在构建过程中插入指令,ONBUILD后面跟着的指令只会在当前镜像被作为基础镜像时才会被执行,如果没有作为基础镜像时,是不会执行这条命令的,把这个镜像作为基础镜像构建其他镜像时,就会执行这条指令,也就是说,构建的时候执行这个指令,这样做的好处是如果构建多个镜像都需要同样的指令,可以把这个指令放到基础镜像中,然后大家执行的时候都会执行,这样可以减少重复操作
容器之间的互联
1.需要构建基础镜像
Dockerfile文件配置如下:
FROM 基础镜像名
MAINTAINER 作者名 "邮箱"
RUN yum install -y iputils
RUN yum install -y net-tools
CMD /bin/bash
EXPOSE 80
2.使用docker build构建镜像,然后基于这个镜像创建容器,当基于同一个镜像创建多个容器时会发现他们之间是ping通的(就是可以互联),通过ping 其他容器的ip地址就可以看到了
3.但是会发现当重启容器以后,他们的ip会改变,因此如果两个容器使用ip进行连接,一旦重启以后,可能就连不上了,如何解决呢?
4.在创建容器的时候要加上 --link=要互联的容器名:这个要互联容器的别名 例如:
docker run -it --name=web01 --link=web02:zk dong/web 这样创建的容器之间的连接是通过别名进行连接的,而不是通过ip连接.因此当ip改变了以后,别名还是以前的别名,还是可以进行连接