docker的安装和dockfile指令,docker网络介绍
- 1、安装docker并配置镜像加速。
- 2、dockerfile常用指令总结。
- 3、基于alpine制作tomcat镜像
- 4、利用桥接实现不同宿主机间容器互联。
1、安装docker并配置镜像加速。
官网安装教程: 官网安装docker 阿里云安装docker教程 阿里云安装docker
yum安装方式(用阿里云的镜像安装)
mv /etc/yum.repos.d/* /root/ 删除老的yum源
下载阿里云源和docker的源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
下载docker源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all 删除缓存
yum makecache 更新yum源
yum list docker-ce --showduplicates 查看全部可安装的docker版本
安装docker19.03
yum install docker-ce-19.03.12-3.el7 docker-ce-cli-19.03.12-3.el7 -y
systemctl start docker 启动docker
systemctl enable docker 设置开机启动docker
docker run hello-world 运行hello容器查看docker是否正常运行
docker镜像加速配置
官网注册阿里云地址 阿里云 注册账户,然后点击账户中心,左侧就可以看到搜索栏
搜索容器镜像服务
左侧选择镜像加速器,右侧就是阿里云免费提供的镜像加速服务,按照提示输入即可
vi /etc/docker/daemon.json
添加内容,设置加速,可自行去阿里云网站注册账户加速镜像下载。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
systemctl restart docker 重启docker
2、dockerfile常用指令总结。
dockerfile常用指令:
官网介绍:dockfile介绍
- FROM:指定基础镜像来源,利用这个基础镜像生成新的镜像
示例:FROM centos:7.6.1810
- LABEL:镜像备注或镜像简介
示例:LABEL version=centos:7.6.1810
- RUN:相当于shell中的/bin/sh -c,在配置时执行命令
示例:RUN yum install -y httpd (需要原本的镜像支持yum)
- ENV:设置环境变量,示例:变量名=变量值
示例:ENV VERSION=1.2.0
- COPY:把真机的文件复制到镜像中,保留格式。
注意:
对于文件,真机的文件需要放在和dockfile文件平级目录下,比如dockfile在/docker目录下,那么真机的文件如index.html也必须要在这个/docker目录下。
对于目录,如果在/dockerfile目录下有/dockerfile/aa目录,/dockerfile/aa目录下还有/dockerfile/aa/bb目录,实际只会复制源目录下的子目录/dockerfile/aa/bb和/dockerfile/aa/里面的其他文件和目录,不会复制aa目录本身。
目标路径后面必须指定到/,如要复制到容器的/home目录,实际必须为/home/
示例:COPY index.html /home/
COPY aa /home/
- ADD:COPY的增强版,支持自动解压压缩包。可解压tar.gz包
示例:ADD nginx-1.18.0.tar.gz /data/nginx/
- CMD:启动容器内的程序,一个镜像有且只有一个CMD,多个CMD只会运行最后一个CMD指令
示例:CMD ["nginx","-g","daemon off;"]
- VOLUME:数据卷,将容器内的某个目录映射到真机的某个真实目录下,默认为容器内的目录如/data/映射到真机目录下的随机名字,删除容器后不会删除这个目录。可以配合docker -v真机目录:容器目录绑定目录使用。
示例:VOLUME [ "/data1" ]
- EXPOSE:将容器内的端口映射到真机的随机端口或指定端口上,需要配合docker -P或docker -p 真机端口:容器端口绑定使用
示例:EXPOSE 80
- WORKDIR:指定工作目录,设置初始化进入容器后的目录。如果想做镜像时把东西都放在同一个目录下,这里指定即可。
示例:WORKDIR /usr/local/
- USER:指定使用容器的账户,默认镜像都是root账户,需要指定为其他账户时,这里指定。
示例:USER mysql
- HEALTHCHECK:容器健康状态检查,每几秒检查下服务状态。
示例:HEALTHCHECK --interval=5s --timeout=3s
- SHELL:默认shell版本为/bin/sh,可以在配置中指定运行版本shell的版本,可以多次重定向shell的版本
示例: SHELL [ "/bin/bash","-c" ]
创建镜像方式:
vi Dockfile 编辑文件,添加需要的命令
.代表当前目录,需要把COPY和ADD的文件都放在和dockfile文件同个目录下
docker build -t 镜像名:版本号 -f ./dockfile .
3、基于alpine制作tomcat镜像
mkdir /docker 新建目录,存放dockfile需要的文件
cd /docker/ 进入目录
#alpine不支持Java的环境,需要安装glibc,要不然会出现找不到路径的问题/bin/sh: java: not found,下载下面的环境和安装包到/docker目录下
#详细介绍网站 https://github.com/sgerrand/alpine-pkg-glibc/
wget https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
编辑repositories文件
#这个文件相当于centos的repo文件或Ubuntu的sources.list,改为国内源加速下载
vi repositories
添加
https://mirrors.aliyun.com/alpine/v3.6/main
https://mirrors.aliyun.com/alpine/v3.6/community
编辑tomcat的conf文件
vi tomcat.conf
添加Java路径
JAVA_HOME=/usr/local/jdk
编辑tomcat网页文件,可以不写,不写默认就是tomcat本身网页
echo "tomcat-web">/docker/index.html
ls 总共7个文件在/docker目录下
apache-tomcat-8.5.70.tar.gz glibc-2.34-r0.apk index.html jdk-8u301-linux-x64.tar.gz repositories sgerrand.rsa.pub tomcat.conf
- 编辑dockfile文件
cd /docker
vi dockfile
添加
FROM alpine:3.13
LABEL version=alpine3.13-tomcat8.5
#初始环境配置
COPY sgerrand.rsa.pub /etc/apk/keys/
COPY glibc-2.34-r0.apk /usr/local/
COPY repositories /etc/apk/
RUN cd /usr/local/ && apk add glibc-2.34-r0.apk
#安装Java
ADD jdk-8u301-linux-x64.tar.gz /usr/local/
RUN ln -s /usr/local/jdk1.8.0_301 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV PATH=$PATH:$JAVA_HOME/bin
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib
#安装tomcat
ADD apache-tomcat-8.5.70.tar.gz /usr/local/
RUN ln -s /usr/local/apache-tomcat-8.5.70/ /usr/local/tomcat
ENV PATH=$PATH:/usr/local/tomcat/bin
COPY tomcat.conf /usr/local/tomcat/conf/
COPY index.html /usr/local/tomcat/webapps/ROOT/
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run" ]
- 利用dockfile生成镜像
docker build -t alpine-tomcat:v0.1 -f ./dockfile . 生成镜像
docker image ls
- 利用生成的镜像alpine-tomcat:v0.1
docker run -P -it --rm alpine-tomcat:v0.1 前台启动容器
docker run -P -it -d alpine-tomcat:v0.1 想要后台启动容器,用这个命令
docker ps -a 查看容器启动,真机端口为32768
- 访问网站,测试网页访问
curl http://192.168.116.145:32768
4、利用桥接实现不同宿主机间容器互联。
拓扑图:
初始环境配置:
2台真机都安装docker服务,按上面做法安装docker
需要利用到iptables的nat策略:iptables介绍
系统 | IP |
centos 7.8/ 真机1 | 真机P:192.168.116.145,容器网段:10.0.0.0/24 |
centos 7.8/ 真机2 | 真机P:192.168.116.146,容器网段:20.0.0.0/24 |
真机1配置:
systemctl start docker 启动容器,初始化配置
vi /etc/docker/daemon.json 添加文件,设置网卡网段
添加
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"bip": "10.0.0.1/24"
}
systemctl restart docker 重启网卡
ip a 确认网段被修改了
真机2配置:
systemctl start docker 启动容器,初始化配置
vi /etc/docker/daemon.json 添加文件,设置网卡网段
添加
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"bip": "20.0.0.1/24"
}
systemctl restart docker 重启网卡
ip a 确认网段被修改了
容器创建
真机1创建容器
docker run -it --name docker1-a1 busybox
可以看到容器IP为10.0.0.2
真机2创建容器
docker run -it --name docker2-b1 busybox
可以看到容器ip为20.0.0.2
没加nat策略前
真机1测试:
ping 192.168.116.146 真机1和真机2的真机IP能互通
ping 10.0.0.2 真机1和自己的容器IP能互通
ping 20.0.0.2 真机1和真机2的容器IP不能互通
真机1的容器测试
ping 192.168.116.145 真机1的容器和真机1能通
ping 192.168.116.146 真机1的容器和真机2的真机IP能通
ping 20.0.0.2 真机1的容器和真机2的容器不能互通
真机2测试:
ping 192.168.116.145 真机2和真机1的真机IP能互通
ping 20.0.0.2 真机2和自己的容器IP能互通
ping 10.0.0.2 真机2和真机1的容器IP不能互通
真机2的容器测试
ping 192.168.116.145 真机2的容器和真机2能通
ping 192.168.116.146 真机2的容器和真机1的真机IP能通
ping 20.0.0.2 真机2的容器和真机1的容器不能互通
添加nat策略后
真机1添加nat策略
ip route add 20.0.0.0/24 via 192.168.116.146
iptables -A FORWARD -s 192.168.116.0/24 -j ACCEPT
真机2添加nat策略
ip route add 10.0.0.0/24 via 192.168.116.145
iptables -A FORWARD -s 192.168.116.0/24 -j ACCEPT
最终测试
真机1容器测试
ping 20.0.0.2 真机1的容器和真机2的容器能互通
真机2容器测试
ping 20.0.0.2 真机2的容器和真机1的容器能互通