一 Docker概述
一 Docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或 Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制(沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是 独立的,而且不会对现有的系统产生影响 ),相互之间不会有任何接口。二 Docker和虚拟机技术的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
三 Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开, 从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。二 Docker安装
一 Docker的基本组成
1 镜像(image): docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。 2 容器(container): Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的. 启动,停止,删除,基本命令 目前就可以把这个容器理解为就是一个简易的 Linux系统。 3 仓库(repository): 仓库就是存放镜像的地方! 仓库分为公有仓库和私有仓库。(很类似git) Docker Hub是国外的。 阿里云...都有容器服务器(配置镜像加速!)
二 安装Docker
1 环境准备(Linux要求内核3.0以上 )
~ uname -r 4.15.0-96-generic # 要求3.0以上
2 安装
#1.卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #2.需要的安装包 yum install -y yum-utils #3.设置镜像的仓库 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo#默认是从国外的,不推荐 #推荐使用国内的 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4. 更新yum软件包索引 yum makecache fast #5.安装docker相关的 docker-ce 社区版 而ee是企业版 yum install docker-ce docker-ce-cli containerd.io #6. 使用docker version查看是否按照成功 docker version
#7. 测试 ➜ ~ docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. ... #8.查看一下下载的镜像 ➜ ~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fblae65 4months ago 13.3kB
了解:卸载docker
#1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io #2. 删除资源 rm -rf /var/lib/docker # /var/lib/docker 是docker的默认工作路径!
3 配置镜像加速器
三 Docker的常用命令
1 帮助命令
docker version #显示docker的版本信息。 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令
2 镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替 docker search 搜索镜像 docker pull 下载镜像 docker image pull docker rmi 删除镜像 docker image rm
3 容器命令
3.1 新建容器并启动
docker run 镜像id --name="Name" # 容器名字 tomcat01 tomcat02 用来区分容器 -d # 后台方式运行 -it # 使用交互方式运行,进入容器查看内容 -p # 指定容器的端口 -p 8080(宿主机):8080(容器) -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 -P(大写) 随机指定端口
3.2 列出所有运行的容器
docker ps # 默认列出正在运行的容器 -a, --all # 显示所有容器 -n, --last int # 显示最后一个创建的容器 -q, --quiet # 仅显示容器ID
3.3 启动和停止容器的操作
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
3.4 删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf docker rm -f $(docker ps -aq) #删除指定的容器 docker ps -a -q|xargs docker rm #删除所有的容器
3.5 退出容器
exit #容器直接退出 ctrl +P +Q #容器不停止退出
3.6 查看日志
docker logs -tf # 显示日志信息(一直更新) --tail number #需要显示日志条数 docker logs -t --tail n 容器ID # 查看n行日志 docker logs -ft 容器ID # 跟着日志 --details #Show extra details provided to logs -f, --follow # Follow log output --since string # Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) --tail string # Number of lines to show from the end of the logs(default "all") -t, --timestamps # Show timestamp --until string # Show logs before a timestamp
3.7 查看容器中进程信息
docker top 容器ID
3.8 查看容器详细信息
docker inspect 容器ID
3.9 进入正在运行的容器
docker exec -it 容器ID /bin/bash
3.10 容器与宿主机间传输文件
docker cp 容器ID:容器内路径/default.conf 宿主机路径 docker cp 宿主机文件 容器ID:容器内路径/index.html
3.11 commit镜像:保存当前的容器状态获得一个镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
四 容器数据卷
将docker容器中产生的数据,同步到本地。通过目录的挂载,将容器内的目录,挂载到Linux上面。实现容器的持久化和同步操作,实现容器间的数据共享。
一 使用数据卷
docker run -it --name 容器名 -p 主机端口:容器内端口 -v 主机目录:容器内目录 centos /bin/bash # 通过 docker inspect 容器ID 查看
测试:
docker run -it -v /home/ceshi:/home centos /bin/bash # docker inspect 32b88c0f8db3 # 查看数据卷挂载
我们以后只需要在本地修改即可,容器内会自动同步
二 具名和匿名挂载
1 匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有的volume的情况 docker volume ls DRIVER VOLUME NAME local 33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d local # 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路劲!
2 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx docker volume ls DRIVER VOLUME NAME local juming-nginx # 通过 -v 卷名:容器内路径 # 查看一下这个卷
# 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data 下。如果指定了目录,docker volume ls 是查看不到的。
3 扩展
# 通过 -v 容器内路径: ro rw 改变读写权限 ro #readonly 只读 rw #readwrite 可读可写 docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
五 Dockerfile
一 介绍
dockerfile是用来构建docker镜像的文件。命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build -f 文件路径 -t 镜像名:[tag] . 构建镜像
- docker run 运行镜像
- docker push 发布镜像
二 构建过程
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单! Docker镜像逐渐成企业交付的标准,必须要掌握!
Dockerfile常用指令
FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指 令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
CMD和ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替 代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
# 编写dockerfile文件 $ vim dockerfile-test-cmd FROM centos CMD ["ls","-a"] # 构建镜像 $ docker build -f dockerfile-test-cmd -t cmd-test:0.1 . # 运行镜像 # 想追加一个命令 -l 成为ls -al $ docker run cmd-test:0.1 -l # 报错 $ vim dockerfile-test-entrypoint FROM centos ENTRYPOINT ["ls","-a"] $ docker run entrypoint-test:0.1 -l total 56 ...例子
三 实战:Tomcat镜像
1 准备镜像文件
准备tomcat 和 jdk到当前目录,编写好README 。
2 编写dockerfile
FROM centos MAINTAINER xx COPY README /usr/local/README #复制文件 ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压 ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压 RUN yum -y install vim ENV MYPATH /usr/local #设置环境变量 WORKDIR $MYPATH #设置工作目录 ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是: EXPOSE 8080 #设置暴露的端口 CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache- tomcat-9.0.35/logs/catalina.out # 设置默认命令
3 构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
docker build -t mytomcat:0.1 .
4 run镜像
docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test - v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
5 访问测试
6 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
四 发布自己的镜像
- 地址 https://hub.docker.com/
- 确定这个账号可以登录
- 登录
- 提交push镜像
!# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library # 解决方法 # 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了 $ docker build -t chengcoder/mytomcat:0.1 . # 第二种 使用docker tag #然后再次push $ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push
六 Docker网络
一 理解docker0
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker, 就会有一个docker0桥接模式,使用的技术是veth-pair技术! 所有的容器在不指定网络的情况下,都是docker0路由的,即各容器IP和宿主机之间可以相互ping通(但不支持容器名连接访问)。但只要容器删除,对应的网桥就没了,重启以后数据IP 换了,可以引入--link通过名字来访问容器(本质就是在hosts配置中添加映射,现不建议使用)。# 运行一个tomcat03 --link tomcat02 $ docker run -d -P --name tomcat03 --link tomcat02 tomcat 5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef # 用tomcat03 ping tomcat02 可以ping通 $ docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms # 用tomcat02 ping tomcat03 ping不通
二 自定义网络
1 查看所有的docker网络
网络模式:
bridge :桥接 docker(默认,自己创建也是用bridge模式) none :不配置网络,一般不用 host :和所主机共享网络 container :容器网络连通(用得少!局限很大)
2 自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
启动两个tomcat,再次查看网络情况
在自定义的网络下,服务可以互相ping通,不用使用–link
好处:
redis -不同的集群使用不同的网络,保证集群是安全和健康的
mysql-不同的集群使用不同的网络,保证集群是安全和健康的
3 网络连通
要将tomcat01 连通 tomcat—net-01 ,连通就是将 tomcat01加到 mynet网络 一个容器两个ip(tomcat01)
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
三 实战(部署Redis集群)
docker搭建redis集群完成!
# 创建网卡 docker network create redis --subnet 172.38.0.0/16 # 通过脚本创建六个redis配置 for port in $(seq 1 6);\ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done # 通过脚本运行六个redis for port in $(seq 1 6);\ docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \ -v /mydata/redis/node-${port}/data:/data \ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf docker exec -it redis-1 /bin/sh #redis默认没有bash redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1例子
标签:容器,--,redis,镜像,Docker,docker From: https://www.cnblogs.com/daminghuahua/p/16886576.html