DockerFile
Docker是一个开源的应用容器引擎,基于GO语言开发,以及遵从Apache2.0协议开源
Docker可以让开发这打包他们的应用到一个轻量级,可移植的容器,然后发布到Linux环境中,可以实现虚拟化;容器完全使用沙箱机制,相互之间不会有任何到接口,容器的性能开销极低。
Docker是Linux中的Namespace和Cgroup来实现资源的隔离和限制;容器共享宿主机内核;所以本身的Mac是没发运行Docker容器,所以Docker for Mac 是在本地跑来一个虚拟机来运行docker容器
Docker架构
docker包括三个基本概念:
image镜像:相当于root文件系统,例如官方的镜像ubuntu:16.04,是一套完整的最小root文件系统;一般可以从docker hub上获取,速度较慢,可以配置阿里镜像加速器,提高镜像的下载速度;
container容器:image与container之间的关系相当于,类文件与类对象之间的关系;通过同一个image可以创建多个container容器;容器可以被创建,启动,删除,暂停;
repository仓库:相当于代码仓库,用来保存镜像文件;常用的docker仓库包括:docker官方的仓库(因为是外网,速度较慢)和阿里的镜像仓库(可以自己创建);通常一个仓库可以包含同一个软件的不同的版本,标签就对应的版本;可以使用 仓库:标签 来指定需要下载的镜像的版本,不添加标签默认是下载最新版本:latest;
Docker 下载安装
直接到官网下载docker:Docker Desktop for Mac and Windows | Docker
直接按照提示进行安装即可,方便,简单;
Docker镜像加速器:
国内有很多的云服务商都提供来镜像加速,我使用的是阿里云的镜像加速服务器;阿里云镜像加速地址获取:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,首先得有一个阿里云的账号,注册过程不再叙述;
配置过程方式阿里云上面已经写得很详细了,直接按照所给的步骤来完成配置即可;
Docker的常用命令:
1、docker : 可以查看到关于docker客户端提供的所有关于docker常用操作项;
2、docker pull tomcat : 获取镜像;可以在docker Hub上查找需要下载的镜像及其对应的版本:Docker Hub
3、docker images : 查看已经下载的镜像文件有哪些;
4、docker ps: 查看正在运行的容器;
5、docker run -d --name mytomcat -p 9090:8080 tomcat : 运行容器,-p指定本机运行的映射端口为9090,8080为tomcat默认的运行端口;-P 为系统随机指定映射端口;--name指定容器的名称为:mytomcat;-d为后台启动; 有不了解的参数可以使用docker run --help来查看运行容器的命令;
6、docker ps -a:查看所有的容器;
7、docker exec -it mytomcat /bin/bash : 进入后台命令;exec进入后台,退出不会停止容器的运行; -it 进入后台交互模式;
退出后台直接使用exit;
8、本机访问tomcat客户端:localhost:9090
首次访问会出现:
进入容器后台查看:docker exec -it mytomcat /bin/bash
可以看到webapps中没有任何的文件,需要将webapps.dist中的文件拷贝到webapps文件夹下:
cp -r webapps.dist/* webapps/
重新访问:
9、 docker restart mytomcat 【重启容器】
10、docker stop mytomcat 【暂停容器】
11、docker start mytomcat 【启动容器】
12、docker rm mytomcat 【删除容器】
13、docker rmi tomcat 【删除镜像】
14、docker inspect mytomcat 【查看容器详情】
15、docker network ls 【查看docker网络配置】
16、docker network inspect bridge 【查看bridge网络配置详情】
17、docker cp 容器ID:文件路径 目的主机路径 【使用docker命令将容器内的文件拷贝到主机中:】
18、docker stats tomcat01 【查看容器占用资源信息】
19、docker logs tomcat01 【查看容器运行日志】
20、docker top tomcat01 【查看容器运行信息,运行的命令】
docker中默认的centOS系统中没有vim, yum , ping等命令,需要重新安装这些组建:
apt-get update
apt-get install vim -y
apt-get install yum -y
Docker数据卷挂载
-v 主机目录:容器目录 可以挂载多个
docker run -d -p 3310:3306 -v /Users/tealala/myspace/mysql/conf:/etc/mysql/conf.d -v /Users/tealala/myspace/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
挂载完成之后就可以直接操作主机中的挂载的文件夹,主机中的文件发生改变,容器中的文件相应发生改变;相对应的,容器中的文件发生改变,主机中挂载的文件也会发生相应的变化;
命令:-v 主机目录:容器路径:ro/rw 【设置权限 readonly/readwrite 只能在容器的内部进行更改】
docker run -d -p 3311:3306 --name mysql02 -v /Users/tealala/myspace/mysql/conf:/etc/mysql/conf.d:ro -v /Users/tealala/myspace/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
此时在容器中直接操作conf.d文件下的数据会抛出:
touch: cannot touch 'test11.txt': Read-only file system
在主机中进行链接操作,出现:
需要进入mysql后台进行修改账户密码加密规则并更新用户密码操作:
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; #更新一下用户的密码
FLUSH PRIVILEGES; #刷新权限
再使用navicat进行链接测试:
Docker容器之间实现数据共享
关键命令:--volumes-from
docker run -d --name mysql03 --volumes-from mysql01 mysql
Docker上创建elasticserch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
注意 -e ES_JAVA_OPTS 是配置应用的内存大小,可以在Docker Hub上查看相关详细的配置要求;
Docker上创建portainer.io,可以查看docker上的镜像,容器,网络,数据卷等信息:
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
如图:
还有一种docker的管理界面,可以在GitHub上搜索【weaveworks/scope】根据提供的安装运行指南并下载安装;
Docker将容器应用构建成为镜像文件
使用命令:commit来操作
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:【tag】
docker commit -m "提交测试" -a "tealala" d1f15043b995 mytomcat:1.0
查看提交结果:
创建Dockerfile文件来构建镜像
基础知识:
1、每一个关键字都需要大写
2、指令从上到下顺序执行
3、#为注释
4、每个指令都会创建一个新都镜像层
dockerfile 就是用来构建docker镜像文件,命令构建脚本,通过这个脚本可以生成镜像,镜像是一层一层的,命令就是一个一个;
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-------"
CMD /bin/bash
构建命令,注意命令行后面的" . " ,一定要加上;
docker build -f /Users/tealala/myspace/docker-test/docker-test-volumn/dockerfile -t tealala/centos:1.0 .
Dockerfile指令:
FROM #基础镜像,都是从这里开始构建
MAINTAINER #镜像是由谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容,例如:tomcat镜像
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴露的端口配置
CMD #指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可以被替代
ENTRYPOINT #指定这个容器启动的时候需要运行的命令,可以追加的命令
ONBUILD #当构建一个被继承的DockerFile 这个时候就会运行onbuild 的指令,触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
CMD 命令与 ENTRYPOINT之间的区别
CMD命令要在运行时添加命令,需要将dockerfile中输入的命令全部写出来之后再添加需要加上的命令;
ENTRYPOINT是可以自动将增加的命令添加到已有的命令之后。
自己创建一个tomcat镜像文件,需要tomcat和JDK包,请到相应的官网下载:
FROM centos
MAINTAINER tealala<[email protected]>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u111-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.5.tar.gz /usr/local/
RUN yum -y install vim
RUN yum -y install net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_111
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.5
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.5
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.5/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.5/bin/logs/catalina.out
构建dockerfile文件tomcat镜像文件,如果文件名为Dockerfile系统会自动寻找该文件,就不用加 -f 文件路径
docker build -t mytomcat .
运行自建的tomcat
镜像仓库
可以是gitHub官方的仓库,也可以是阿里云的仓库:
Docker Hub
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
首次访问凭证需要自己创建凭证密码,注意进行阿里云镜像服务登录的时候,首次登录,加入来sudo命令,需要输入两次密码,第一次是本机用户登录密码,第二次输入的是自己创建的凭证密码;
登录成功之后就可以上传自己的镜像文件到阿里云镜像服务器了;具体的上传操作在阿里云镜像服务上有相关的详细操作指南;
我们也可以创建自己的仓库服务,需要在GitHub上搜索 【goharbor/harbor】并根据提供的安装运行指南进行操作就可以了,还可以查看下提供的线上demo进行查看:
点击进行就可以看到:
Docker网络
Linux环境下,docker是使用网络桥接的技术来连通的;宿主机中是一个Docker容器的网桥docker0
使用evth-pair技术,容器带来的网卡都是一对一对的
evth-pair就是一对一对的虚拟设备接口,他们成对出现, 一端连着协议,一端彼此相连
evth-pair 充当一个桥梁,连接各种虚拟网络设备的
Linux环境下,容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用的IP
Docker中的所有网络接口都是虚拟的,虚拟的转发效率高,只要容器删除,对应一对网桥就没有了
由前文可以知道,Mac中Docker for Mac 是运行在虚拟机中的;官方网站已经给出了说明:
Redirecting…
使用命令:docker network ls;可以查询出docker中的网络配置
docker network inspect 网络名; 可以查询出具体某个网络的配置链接信息
网络模式:
bridge:桥接 docker(默认)
null: 静态网络
host:和宿主机共享网络
container:容器网络联通(基本没有使用)
使用默认的bridge网络来运行容器,bridge中的网络只能通过IP进行相互访问,例如:
docker run -d --name tomcat01 tomcat
docker run -d --name tomcat02 tomcat
如果想要通过容器名称来访问,可以通过 --link就可以链接
docker run -d --name tomcat01 --link tomcat02 tomcat
此时,可以在容器tomcat01中直接通过容器tomcat02名称来访问,但是在容器tomcat02 中无法使用容器tomcat01名称来访问:
原理探究:--link操作就是在容器tomcat01里面的hosts 配置文件中增加了tomcat02 的网络配置:
所以如果想要在容器tomcat02中直接使用tomcat01名称来链接,就需要在tomcat02 的hosts文件中进行配置;
而官方已经不再推荐使用--link的方式来配置了;
自定义网络(容器互联)
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
可以自定义网络(处于统一网段的容器可以相互链接)
--driver bridge 桥接
--subnet 192.168.0.0/16 子网地址
--gateway 192.168.0.1 网官地址
这种方式可以解决link上的缺陷;
查看mynet网络的配置信息,tomcat01,tomcat02都存在该网段中:
Docker compose
Docker Swarm
CI/CD之Jenkins