docker所有包下载
链接:https://pan.baidu.com/s/13QiQ_dj5aXQqr-nmiYLuYQ
提取码:g5j3
五,网络管理
5.1 容器网络模式
Docker支持5种网络模式
(1)bridge(nat模式)
默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中(2)host(仅主机模式)
容器不会获得一个独立的network namespace,而是与宿主机共用一个(3)none(不给容器配置任何网络环境,专门用来配桥接模式)
获取独立的network namespace,但不为容器进行任何网络配置(4)container(让两个容器用一个网卡)
与指定的容器使用同一个network namespace,网卡配置也都是相同的(5)自定义(能给默认的网络模式起名)
自定义网桥,默认与bridge网络一样
5.1.1 bridge网络类型
安装bridge管理工具
yum -y install bridge-utils
which brctl
查看网桥状态
brctl show
查看网络类型
docker network ls
查看容器进程
docker ps
查看容器lnmp_mysql的网络信息
docker inspect lnmp_mysql | grep -A 15 "Networks"
查看容器lnmp_web的网络信息
docker inspect lnmp_web | grep -A 15 "Networks"
5.1.2 host网络类型
启动一个网络类型为host的容器
docker run -dit --name xin --net host centos:latest /bin/bash
docker ps -a
查看容器的ip
docker exec xin hostname -I #这就是网络类型为host的容器,ip地址和docker宿主机完全一样
5.1.3 none网络类型(用于建立与宿主机的桥接模式)
启动一个网络类型为none的容器
docker run -dit --name xin1 --net none centos:latest /bin/bash
docker ps -a
查看容器IP地址
docker exec xin1 hostname -I
查询后发现,什么IP地址都没有,none类型就是暂时不给容器指定网卡。
5.1.4 container网络类型
指定新容器使用指定容器的网卡
启动一个容器,网络类型container,使用test容器的网卡
docker run -dit --name xin2 --net container:xin centos:latest /bin/bash
docker inspect xin | grep -A 15 "Networks"
docker inspect xin2 | grep -A 15 "Networks"
"Networks": {} #xin2容器并没有自己的网络设置
docker exec xin2 hostname -I #xin2没有网络设置却有IP地址和xin容器完全一样
5.2 桥接宿主机网络与配置固定IP地址
5.2.1 建立网桥桥接到宿主机网络
构建一个永久生效的网桥br0
cd /etc/sysconfig/network-scripts/
ls
cp ifcfg-ens32 ifcfg-br0
vim ifcfg-ens32
vim ifcfg-br0
cat ifcfg-ens32
TYPE=Ethernet
BOOTPROTO=none
NAME=ens32
DEVICE=ens32
ONBOOT=yes
BRIDGE=br0
cat ifcfg-br0
TYPE=Bridge
DEVICE=br0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.200.70
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
DNS1=192.168.200.2
查看网卡IP
systemctl restart network
ifconfig ens32 --->ens32网卡已经没有IP地址了
ifconfig br0 --->网桥br0代替了ens32
brctl show --->网桥br0,桥接在了真实的物理网卡ens32上
5.2.2 通过pipework工具配置容器固定IP
pipework工具下载地址(上边有下载链接)
https://github.com/jpetazzo/pipework.git
解压安装pipework工具
yum -y install unzip
which unzip
ls
unzip pipework-master.zip
mv pipework-master /usr/local/
ln -s /usr/local/pipework-master/pipework /usr/local/bin/
which pipework
建立网络类型为none的容器,并通过pipework配置固定ip地址
docker exec xin1 hostname -I
pipework br0 xin1 192.168.200.166/[email protected]
docker exec xin1 hostname -I #有IP了
ping 192.168.200.166 #宿主机ping能通
docker exec -it xin1 /bin/bash #进入容器
ping www.baidu.com #能连接外网
通过windows宿主机ping虚拟机中的容器进程IP进行测试
综上,外部机器访问虚拟机中的容器进程也可以连通了
六,Docker的镜像制作
6.1 Dockerfile常用指令介绍
指令 描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.sl
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
6.2 利用Dockerfile编写简单的nginxWeb镜像
首先我们开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
创建nginx的镜像目录
ls
mkdir dockerfile/lib/nginx
cd dockerfile/lib/nginx
准备Dockerfile文件
vim Dockerfile
cat Dockerfile
FROM centos:7
MAINTAINER www.yunjisuan.com
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;"]
ls --->#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
build基于nginx的docker镜像
docker build -t nginx:1 .
docker images
6.3 构建PHP网站平台镜像实战
创建php的镜像目录
ls
mkdir dockerfile/lib/php
cd dockerfile/lib/php
准备Dockerfile文件
vim Dockerfile
cat Dockerfile
FROM centos:7
MAINTAINER www.yunjisuan.com
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"]
ls --->#将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
build基于php的docker镜像
docker build -t php:1 .
docker images
6.4 创建nginx-php网络环境,并启动容器
创建一个叫做lnmp的网络(没有则需要创建,否则会报错)
docker network create lnmp
docker network ls
创建nginx-php网页挂载目录
mkdir -p /app/wwwroot
启动php容器
docker run -dit --name lnmp_php --net lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html php:1
docker ps -a
docker exec lnmp_php hostname -I
启动nginx容器
docker run -dit --name lnmp_nginx -p 888:80 --net lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html nginx:1
docker ps -a
docker exec lnmp_nginx hostname -I
创建测试页面php.info
echo "" > /app/wwwroot/index.php
cat /app/wwwroot/index.php
最后通过浏览器进行访问测试
http://192.168.200.70:888
构建MySQL网站平台镜像实战
创建Mysql的镜像目录
ls
mkdir dockerfile/lib/mysql
cd dockerfile/lib/mysql
准备Dockerfile文件
vim dockerfile.sh
vim Dockerfile
cat dockerfile.sh
#!/bin/bash
while true
do
echo "welcome"
sleep 5
done
cat Dockerfile
FROM centos:7
MAINTAINER www.yunjisuan.com
RUN yum -y install ncurses-devel cmake gcc gcc-c++ make autoconf automake
ADD cmake-2.8.6.tar.gz /usr/src/
RUN cd /usr/src/cmake-2.8.6 && \
./configure && \
gmake && \
gmake install
COPY docker.sh /home/test/
RUN chmod +x /home/test/docker.sh
ADD mysql-5.5.22.tar.gz /usr/src/
RUN useradd -s /sbin/nologin -M mysql && \
cd /usr/src/mysql-5.5.22 && \
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && \
make -j 2 && \
make install && \
chown -R mysql.mysql /usr/local/mysql && \
/bin/cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf && \
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld && \
chmod +x /etc/init.d/mysqld && \
ln -s /usr/local/mysql/bin/* /usr/local/bin && \
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data && \
/etc/init.d/mysqld restart && \
mysql -e "grant all on *.* to 'root'@'%' identified by '123123';" && \
mysql -e "grant all on *.* to 'root'@'localhost' identified by '123123';" && \
mysql -uroot -p123123 -e "grant all on wordpress.* to 'wordpress'@'%' identified by '123123';" && \
mysql -uroot -p123123 -e "flush privileges;"
RUN rm -rf mysql-5.5.22.tar.gz && \
rm -f cmake-2.8.6.tar.gz && yum -y clean all
WORKDIR /usr/local/mysql
EXPOSE 3306
CMD ["/home/test/docker.sh"]
ls --->#将事先准备好的cmake-2.8.6.tar文件及mysql-5.5.22.tar拷贝到当前目录下
build基于mysql的docker镜像
docker build -t mysql:1 .
docker images
创建一个叫做lnmp的网络(没有则需要创建,否则会报错)
docker network create lnmp --->创建网络
docker network ls --->查看网络
启动mysql容器
docker run -dit --name lnmp_mysql -p 3306:3306 --net lnmp mysql:1
docker ps -a
解压workpress到网页目录
ls
tar xf wordpress-4.9.8.tar -C /app/wwwroot
最后通过浏览器进行workpress注册
http://192.168.200.70:888/wordpress/
6.5 docke基础阶段作业
在nginx-php镜像的基础上构建mysql:1的镜像,并启动lnmp_mysql容器进程
实现wordpress博客的部署
6.6 构建JAVA网站环境镜像实战
创建java镜像构建存储目录
mkdir dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat
筹备Dockerfile
vim Dockerfile
cat Dockerfile
FROM centos:7
MAINTAINER www.yunjisuan.com
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"]
ls --->#将事先准备好的apache-tomcat-8.0.46.tar.gz文件及jdk-8u45-linux-x64.tar.gz及server.xml拷贝到当前目录下
build基于tomcat的镜像
docker build -t tomcat:1 .
docker images
创建网页挂载目录
mkdir /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
docker ps -a
创建网站测试页
mkdir /app/webapps/ROOT
echo "welcome to yunjisuan" >> /app/webapps/ROOT/index.html
然后我们用浏览器访问8080端口
http://192.168.200.70:8080
特别提示
tomcat有三种启动方式:
直接启动./startup.sh
作为服务启动 nohup ./startup.sh &
控制台动态输出方式启动./catalina.sh run动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务
构建镜像的Dockerfile里的最后一步启动的进程不能是后台模式,否则容器直接退出。因此,nginxWeb镜像构建时,用CMD ["./sbin/nginx", "-g", "daemon off;"]方式进行启动
七,Docker企业实战案例一:整套项目一键打包部署
7.1 Docker Compose用法
7.1.1 介绍
Compose是一个定义和管理多容器的工具,使用Python语言编写。使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像,数据卷,网络,映射端口等;然后一条命令管理所有服务,比如启动,停止,重启等。
7.1.2 安装(上文有下载包)
ls
which unzip
unzip docker-compose-linux-x86_64.zip
ll -d docker-compose
chmod +x docker-compose
mv docker-compose /usr/bin/
which docker-compose
docker-compose version --->查看版本
7.1.3 YAML文件格式及编写注意事项
YAML是一种标记语言很直观的数据序列化格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多。
YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来。
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 容器主机名
docker-compose常用命令
字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器,网络,数据卷和镜像
stop/start/restart 停止/启动/重启服务
例如
cat docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 81:80
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
php:
hostname: php
build:
context: ./php
dockerfile: Dockerfile
networks:
- lnmp
volumes:
- ./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:
7.2 一键部署LNMP网站平台实战
查看compose_lnmp包
tree compose_lnmp/
docker-compose.yml #docker-compose启动接口文件
my.cnf #mysql配置文件
data #待挂载mysql数据目录
Dockerfile #自定义nginx的Docker镜像配置文件
nginx-1.12.1.tar.gz #源码包
nginx.conf #nginx配置文件
Dockerfile #自定义php的Docker镜像配置文件
php-5.6.31.tar.gz #源码包
php.ini #php解析器配置文件
wwwroot #nginx容器和php容器待挂载的网页目录
index.php #网页测试文件
一键部署LNMP
docker-compose -f compose_lnmp/docker-compose.yml up
浏览器访问
查看所有部署的容器进程
docker-compose -f compose_lnmp/docker-compose.yml ps
终止所有部署的容器进程
docker-compose -f compose_lnmp/docker-compose.yml stop
docker-compose -f docker-compose.yml ps
清理所有部署的容器进程
docker-compose -f compose_lnmp/docker-compose.yml down
docker-compose -f compose_lnmp/docker-compose.yml ps
7.3 一键部署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的启动接口文件
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
- ./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
ls
tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local
ll -d /usr/local/jdk1.8.0_45
一键部署ngxin+tomcat反向代理集群并启动
pwd
docker-compose -f compose_nginx_tomcat/docker-compose.yml up
浏览器访问
http://192.168.200.70:82
停止一台tomcat并测试
http://192.168.200.70:82