Docker网络管理及镜像制作

文章目录

  • 1 网络管理
    • 1.1 docker的5种网络模式
    • 1.2 bridge网络类型
    • 1.3 host网络类型
    • 1.4 none网络类型
    • 1.5 container网络类型
  • 2 配置桥接宿主机网络与配置固定IP地址
    • 2.1 建立网桥桥接到宿主机网络
    • 2.2 通过pipwork工作配置容器固定IP
  • 3 Docker的镜像制作
    • 3.1 Dockerfile常用指令介绍
    • 3.2 利用Dockerfile编写的nginxWeb镜像
    • 3.3 构建PHP镜像
    • 3.4 创建nginx-php网络环境,并启动容器
    • 3.5 制作mysql镜像
    • 3.6 构建java环境镜像tomcat
  • 4 Docker Compose
    • 4.1 安装docker-compose
    • 4.2 YAML文件格式及编写注意事项
    • 4.3 利用docker-compose一键部署LNMP

1 网络管理

1.1 docker的5种网络模式

  • bridge:
    默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中
  • host
    容器不会获得一个独立的network namespace,而是与宿主机共用一个,和宿主IP一致
  • none
    获取独立的network namespace,但不为容器进行任何网络配置,类似桥接模式,与宿主机桥接
  • container
    启动容器的时候,指定一个已有的容器使用同一个network namespace,网卡配置也都是相同的
  • 自定义
    自定义名字的bridge网络模式

1.2 bridge网络类型

启动容器时,若不指定网络类型,默认是bridge模式,且绑定在默认创建的网桥docker0上

#安装bridge管理工具
yum -y install bridge-utils

#查看网桥状态
brctl show
#显示详解:
#bridge name 网桥名
#bridge id  网桥ID
#STP enabled 是否开启STP协议
#interfaces 网络接口,显几个就代表该网桥绑定了几个虚拟网卡

#查看网络类型
docker network ls
#从driver引擎一列可识别网络模式

#查看容器网络信息
docker inspect 容器名/ID | grep -A 15 "Networks"
#可以显示网络类型,网关(绑定的网桥的IP),容器IP

1.3 host网络类型

#启动一个网络类型为host的容器
docker run -dit --name centos-host --network host centos:7 /bin/bash
#查看容器IP
docker exec centos-host hostname -I
#与本地hostname -I对比,应该完全一致

1.4 none网络类型

#正常情况下,none模式启动的容器不会有网卡
docker run -dit --name centos-none centos:7 /bin/bash
docker exec centos-none hostname -I

1.5 container网络类型

#启动一个容器,网络类型container,使用test容器的网卡
docker run -dit --name centos-cont --net container:test centos:7 /bin/bash
#test是默认网络模式启动的容器,如果查询,可以发现centos-cont的IP和test一致,但没有网络设置
docker inspect centos-cont | grep -A 15 "Networks"
#网络设置为空
docker exec centos-cont hostname -I
#没有网络设置却有IP地址,并且和test容器一样

2 配置桥接宿主机网络与配置固定IP地址

2.1 建立网桥桥接到宿主机网络

#构建一个永久生效的网桥br0

#将网卡配置改为桥接到网桥br0
cat ifcfg-ens32 
#内容为
TYPE=Ethernet
BOOTPROTO=dhcp  #是否为静态无关紧要
NAME=ens32
DEVICE=ens32
ONBOOT=yes
BRIDGE=br0

#配置一个虚拟网桥网卡
cat ifcfg-br0 
TYPE=Bridge     #类型为网桥
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.200.142
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
DNS1=192.168.200.2

#配置完成后重启网卡
service network restart
#查看网卡IP
ifconfig
#ens32网卡已经没有IP地址了
#网桥br0代替了ens32
brctl show
#查看网桥状态,br0,桥接在了真实的物理网卡ens32上

2.2 通过pipwork工作配置容器固定IP

pipwork工具下载地址:https://github.com/jpetazzo/pipework.git

#解压安装pipwork工具
yum -y install unzip
unzip pipework-master.zip
mv pipework-master /usr/local/
ln -s /usr/local/pipework-master/pipework /usr/local/bin/

#建立网络类型为none的容器test-none,并通过pipework配置固定ip地址
pipework br0 test-none 192.168.200.120/[email protected]    #设置容器固定的IP为192.168.200.244网关192.168.200.2
docker exec -it test5 /bin/bash    #进入容器
hostname -I  #查看IP
ping www.baidu.com  #测试外网连接
#在本地测试连接

3 Docker的镜像制作

3.1 Dockerfile常用指令介绍

指令 描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER jcjc
RUN 构建镜像时运行的Shell命令。例如:RUN [“yum”,“install”,“httpd”]
或者:RUN yum install httpd
CMD 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"]
或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务端口。例如:EXPOSE 80 443
ENV 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD 拷贝文件或目录到镜像(可以自动解压缩或者下载)
例如:ADD [“src”,“dest”]或者ADD https://xxx.com/html.tar.gz /var/www/html
或者:ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]
或者ENTRYPOINT /bin/bash -c “/start.sh”
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
例如:VOLUME ["/var/lib/mysql"]
USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户
例如:USER Mr_chen
WORKDIR 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
例如:WORKDIR /data
HEALTHCHECK 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
CMD curl -f http://localhost/ || exit 1
ARG 在构建镜像时指定一些参数。例如:ARG user

3.2 利用Dockerfile编写的nginxWeb镜像

#首先我们开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
sysctl -p

#创建nginx的镜像目录
cd ~
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx

#准备Dockerfile文件
cat Dockerfile
#内容为
FROM centos:7
MAINTAINER jcjc

RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp

RUN cd /tmp/nginx-1.12.1 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install

RUN rm -rf /tmp/nginx-1.12.1* && yum clean all
COPY nginx.conf /usr/local/nginx/conf

WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]


#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
ls
#此目录下要有如下几个文件
Dockerfile  nginx-1.12.1.tar.gz  nginx.conf
#需要注意的是,Dockerfile文件中的命令,并没有创建nginx的程序用户,这是因为在配置文件中,已经写了启动nginx的用户

#build基于nginx的docker镜像
docker build -t nginx:1 .

3.3 构建PHP镜像

cd ~
mkdir -p dockerfile/lib/centos/php
cd dockerfile/lib/centos/php

#准备Dockerfile文件
cat Dockerfile 
#内容
FROM centos:7
MAINTAINER jcjc

RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel

ADD php-5.6.31.tar.gz /tmp
RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s#127.0.0.1#0.0.0.0#" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf

COPY php.ini /usr/local/php/etc
RUN rm -rf /tmp/php-5.6.31* && yum -y clean all

WORKDIR /usr/local/php
EXPOSE 9000
CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]

#-c指定配置文件启动
#将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
ls
#此目录下要有以下几个文件
Dockerfile  php-5.6.31.tar.gz  php.ini
#build基于php的docker镜像
docker build -t php:1 .

3.4 创建nginx-php网络环境,并启动容器

#创建一个叫做lnmp的网络
docker network create lnmp
#创建nginx-php网页挂载目录
mkdir -p /app/wwwroot

#启动php容器
docker run -dit --name lnmp_php --network lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html php:1
#启动nginx容器
docker run -dit --name lnmp_nginx -p 888:80 --network lnmp --mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html nginx:1
#创建测试页面
echo "" > /app/wwwroot/index.php

#在浏览器输入IP:888访问PHP信息页面测试是否部署成功

3.5 制作mysql镜像

3.6 构建java环境镜像tomcat

#创建java镜像构建存储目录
cd ~
mkdir -p dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat
#将所需软件包拷贝到当前目录下
ls
apache-tomcat-8.0.46.tar.gz  Dockerfile  jdk-8u45-linux-x64.tar.gz  server.xml

#准备Dockerfile
cat Dockerfile 
#内容为
FROM centos:7
MAINTAINER jcjc

ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45

ADD apache-tomcat-8.0.46.tar.gz /usr/local

COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
RUN rm -f /usr/local/apache*.tar.gz

WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]

#build基于tomcat的镜像
docker build -t tomcat:1 .
#创建网页挂载目录
mkdir -p /app/webapps
#启动tomcat的容器进程
docker run -dit --name=tomcat -p 8080:8080 --mount type=bind,src=/app/webapps/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1

#创建网站测试页
mkdir -p /app/webapps/ROOT
echo "welcome to yunjisuan" >> /app/webapps/ROOT/index.html
#浏览器输入IP:8080测试访问
  1. tomcat有三种启动方式:
  • 直接启动./startup.sh
  • 作为服务启动 nohup ./startup.sh &
  • 控制台动态输出方式启动./catalina.sh run动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务
  1. 构建镜像的Dockerfile里的最后一步启动的进程不能是后台模式,否则容器直接退出。因此,nginxWeb镜像构建时,用CMD ["./sbin/nginx", “-g”, “daemon off;”]方式进行启动

4 Docker Compose

Compose是一个定义和管理多容器的工具,使用Python语言编写。使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像,数据卷,网络,映射端口等;然后一条命令管理所有服务,比如启动,停止,重启等

4.1 安装docker-compose

下载docker-compose-linux-x86_64.zip

unzip docker-compose-linux-x86_64.zip
chmod +x docker-compose
mv docker-compose /usr/bin/
which docker-compose

4.2 YAML文件格式及编写注意事项

  • 注意事项:
  • 不支持制表符tab键缩进,需要使用空格缩进
  • 通常开头缩进2个空格
  • 字符后缩进1个空格,如冒号,逗号,横杆
  • 用#号注释
  • 如果包含特殊字符用单引号引起来
  • 布尔值(true,false,yes,no,on,off)必须用引号括起来,这样分析器会将他们解释为字符串。
  • 配置文件常用字段
    字段|描述
    -|-|
    build|下级字段dockerfile:指定Dockerfile文件名
    ||下级字段context;构建镜像上下文路径
    image|指定镜像
    command|执行命令,覆盖默认命令
    container_name|指定容器名称
    deploy|指定部署和运行服务相关配置,只能在Swarm模式使用
    environment|添加环境变量
    networks|加入网络,引用顶级networks下条目
    ports|暴露端口,与-p相同,但端口不能低于60
    volumes|挂载宿主机路径或命名卷。如果是命名卷在顶级volumes定义卷名称
    restart|重启策略,默认no,always | on-failure | unless-stopped
    hostname|容器主机名

  • 常用命令
    字段|描述
    -|-
    build|重新构建服务
    ps|列出容器
    up|创建和启动容器
    exec|在容器里执行命令
    scale|指定一个服务容器启动数量
    top|显示容器进程
    logs|查看容器输出
    down|删除容器,网络,数据卷和镜像
    stop/start/restart|停止/启动/重启服务

4.3 利用docker-compose一键部署LNMP

  • 准备compose.yml文件
cat docker-compose.yml
#内容为
version: '3'
services:       #固定格式
  nginx:
    hostname: nginx
    build:
      context: ./nginx  #指定构建镜像所需的那些文件的目录,相对于compose文件路径
      dockerfile: Dockerfile
    ports:      #启动时的端口映射
      - 81:80
    networks:   #启用的docker网络
      - lnmp
    volumes:    #挂载卷
      - ./wwwroot:/usr/local/nginx/html
  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:    #保持php和nginx网页挂载目录一致
      - ./wwwroot:/usr/local/nginx/html
  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:    #启动时设置的变量
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
networks:   #顶格写会优先执行,创建网络
  lnmp: 
  • 文件准备
tree compose_lnmp/
compose_lnmp/
├── docker-compose.yml  #docker-compose启动接口文件
├── mysql
│   ├── conf
│   │   └── my.cnf  #mysql配置文件
│   └── data        #待挂载mysql数据目录
├── nginx
│   ├── Dockerfile  #自定义nginx的Docker镜像配置文件
│   ├── nginx-1.12.1.tar.gz #源码包
│   └── nginx.conf  #nginx配置文件
├── php
│   ├── Dockerfile  #自定义php的Docker镜像配置文件
│   ├── php-5.6.31.tar.gz   #源码包
│   └── php.ini     #php解析器配置文件  
└── wwwroot         #nginx容器和php容器待挂载的网页目录
    └── index.php   #网页测试文件
6 directories, 9 files

#一键部署LNMP
docker-compose -f docker-compose.yml up

然后浏览器访问IP:81出现php测试页面则完成

  • 一键管理所有部署的容器进程
  • 必须要在docker-compose文件相对目录
#一键查看所有部署的容器进程
docker-compose -f docker-compose.yml ps
#Name代表容器的名字,默认会加前缀compose,并且可以看到端口情况

#一键终止所有部署的容器进程
docker-compose -f docker-compose.yml stop

#一键清理所有部署的容器进程
docker-compose -f docker-compose.yml down

##一键部署nginx反向代理tomcat集群

#查看compose_nginx_tomcat包
tree compose_nginx_tomcat
#目录结构为
compose_nginx_tomcat/
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf  #mysql的配置文件
│   └── data        #待挂载mysql数据目录
├── nginx
│   ├── Dockerfile      #自定义镜像配置文件
│   ├── nginx-1.12.1.tar.gz #源码包
│   └── nginx.conf          #nginx配置文件
├── tomcat
│   ├── apache-tomcat-8.0.46.tar.gz #源码包
│   ├── Dockerfile      #自定义镜像配置文件
│   └── server.xml      #tomcat配置文件
└── webapps         
    └── ROOT
        └── index.html  #网页测试文件
7 directories, 9 files


#查看docker-compose的启动接口文件
[root@docker ~]# cat compose_nginx_tomcat/docker-compose.yml 
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 82:80
    networks:
      - lnmt
    volumes:
      - ./webapps:/opt/webapps
  tomcat01:
    hostname: tomcat01
    build: ./tomcat
    networks:
      - lnmt
    volumes:
      - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45
      - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
  tomcat02:
    hostname: tomcat02
    build: ./tomcat
    networks:
      - lnmt
    volumes:
      - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45   #docker宿主机的java环境被挂载了!
      - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3307:3306
    networks:
      - lnmt
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: user123
networks:
  lnmt:

#由于tomcat容器进程需要挂载docker宿主机本地的java环境
#所以在docker宿主机本地安装jdk-8u45-linux-x64.tar.gz
tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local

#然后在docker-compose.yml文件目录下,构建
docker-compose -f docker-compose.yml up

#浏览器访问IP:82出现自定义页面就算成功

你可能感兴趣的:(Docker,linux服务,LNMP,docker,lnmp,linux,tomcat)