一、Dockerfile
1.1 构建过程解析
基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
1.2 Dockerfile的保留字介绍
- FROM:基础镜像,当前镜像是基于哪个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建需要运行的命令
- shell格式:RUN <命令行命令>:等同于终端操作的shell命令
- exec格式:RUN ["可执行文件",“参数1”,“参数2”]
- EXPOSE:当前容器对外暴露端口
- WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
- USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
- ENV:用来在构建镜像过程中设置环境变量,这个环境变量在后续任何的RUN指令中可以使用,ENV MY_PATH /usr/mytest,WORKDIR $MY_PATH
- VOLUME:容器卷,用于数据保存和持久化工作
- ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY:将宿主机目录下的文件和目录拷贝到镜像,COPY SRC DEST
- CMD:指定容器启动后干的事情
- shell格式:CMD <命令行命令>:等同于终端操作的shell命令
- exec格式:CMD ["可执行文件",“参数1”,“参数2”]
- dockerfile可以有多个cmd参数,但只有最后一个指令生效,cmd会被docker run之后的参数替换
- 和run的区别:cmd是在docker run时运行,run是在docker build时运行
- ENTRYPOINT:一个容器启动时要运行的命令,类似cmd,但该指令不会被docker run之后的指令覆盖
- ENTRYPOINT ["执行的命令",“参数1”,“参数2”],可以和CMD一起使用,一般是变参才会使用CMD,这里CMD等同于在给ENTRYPOINT传参数。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成 <ENTRYPOINT> "CMD"
1.3 Dockerfile构建centos
(1)构建Dockerfile
FROM centos:7
MAINTAINER yyds
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
ADD jdk-8u201-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success-------ok"
CMD /bin/bash
(2)执行构建命令
docker build -t 镜像名:版本号 .
docker build -t mycentos:1.0 .
(3)运行镜像
docker run -it 新镜像名字:TAG
二、docker network
docker默认创建三大网络模式
bridge模式:--network bridge指定,默认使用docker0
host模式:--network host指定
none模式:--network none指定
container模式:--network container:NAME或容器ID指定
docker网络的作用:
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
2.1 docker network之host模式
docker run -d --network host --name tomcat83 tomcat
注意:在host模式通过-p设置端口映射不会起到任何作用,端口号以主机端口号为主
2.2 docker network之bridge
Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。
2.3 docker network之none
在none模式下,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo需要我们自己为Docker容器添加网卡、配置IP等。
2.4 docker network之container
2.5 docker network之自定义网络
- docker network ls 列出当前的网络
- docker network create name:创建一个自定义网络
- 自定义网络本身维护了主机名和IP的对应关系
三、docker compose 容器编排
3.1 docker compose的作用
docker compose负责容器集群的快速编排,定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动或关闭这些容器。
3.2 docker compose的安装
sudo yum update
sudo yum install docker-compose-plugin
docker compose versionchmod +x /usr/local/bin/docker-compose
3.3 docker compose的使用
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务
- 最后,使用 docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
注意:插件形式的安装 命令不带-