容器自动化专题(二):docker基础(下)

云计算领域专题式教学

--私人课件,不公开,不出版,禁止传播

想做好运维工作,人先要学会勤快; 
居安而思危,勤记而补拙,方可不断提高; 
别人资料不论你用着再如何爽那也是别人的; 
自己总结东西是你自身特有的一种思想与理念的展现; 
精髓不是看出来的,精髓是记出来的; 
请同学们在学习的过程中养成好的学习习惯; 
勤于实践,抛弃教案,勤于动手,整理文档。

 

五,网络管理

 

5.1 容器网络模式

  • Docker支持5种网络模式 
    • bridge 
      • 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中
    • host 
      • 容器不会获得一个独立的network namespace,而是与宿主机共用一个
    • none 
      • 获取独立的network namespace,但不为容器进行任何网络配置
    • container 
      • 与指定的容器使用同一个network namespace,网卡配置也都是相同的
    • 自定义 
      • 自定义网桥,默认与bridge网络一样
 

5.1.1 bridge网络类型

 
  1. #安装bridge管理工具
  2. [root@docker ~]# yum -y install bridge-utils
  3. #查看网桥状态
  4. [root@docker ~]# brctl show
  5. bridge name bridge id STP enabled interfaces
  6. br-b02d86520223 8000.02427fd4e96d no veth3c0da5f #网桥br-br0绑定了两个虚拟网卡
  7. vethcd34854
  8. docker0 8000.02424cab4d14 no veth0d15221 #网桥docker0绑定了一个虚拟网卡
  9. #查看网络类型
  10. [root@docker ~]# docker network ls
  11. NETWORK ID NAME DRIVER SCOPE
  12. 29e8c90dbd80 bridge bridge local #两个网桥类型的网络
  13. f11e598312bd host host local
  14. b02d86520223 lnmp bridge local #两个网桥类型的网络
  15. 3978eff69b11 none null local
  16. #查看容器进程
  17. [root@docker ~]# docker ps
  18. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  19. 274cd088c4ad centos "/bin/bash" 14 minutes ago Up 14 minutes test
  20. 1ab26792a73c richarvey/nginx-php-fpm "docker-php-entrypoi…" 2 days ago Up 2 days 443/tcp, 9000/tcp, 0.0.0.0:88->80/tcp lnmp_web
  21. 07bd252ec637 mysql:5.6 "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:3306->3306/tcp lnmp_mysql
  22. #查看容器lnmp_mysql的网络信息
  23. [root@docker ~]# docker inspect lnmp_mysql | grep -A 15 "Networks"
  24. "Networks": {
  25. "lnmp": { #网络类型lnmp
  26. "IPAMConfig": null,
  27. "Links": null,
  28. "Aliases": [
  29. "07bd252ec637"
  30. ],
  31. "NetworkID": "b02d8652022382f21780ee4935f472689883b64389ae120174268de57ec03e4e",
  32. "EndpointID": "6059606168f72d1561e4ce1d345fdc8dafed7b3956f9b2a392f29635c4001b7c",
  33. "Gateway": "172.18.0.1", #网关172.18.0.1,这就是网桥br-b02d86520223
  34. "IPAddress": "172.18.0.2", #容器IP172.18.0.2
  35. "IPPrefixLen": 16,
  36. "IPv6Gateway": "",
  37. "GlobalIPv6Address": "",
  38. "GlobalIPv6PrefixLen": 0,
  39. "MacAddress": "02:42:ac:12:00:02",
  40. #查看容器lnmp_web的网络信息
  41. [root@docker ~]# docker inspect lnmp_web | grep -A 15 "Networks"
  42. "Networks": {
  43. "lnmp": { #网络类型lnmp
  44. "IPAMConfig": null,
  45. "Links": null,
  46. "Aliases": [
  47. "1ab26792a73c"
  48. ],
  49. "NetworkID": "b02d8652022382f21780ee4935f472689883b64389ae120174268de57ec03e4e",
  50. "EndpointID": "778d44313652bce9af6f09c3f67d56946eca2c6b7cf7dc8b9c79046e7874842a",
  51. "Gateway": "172.18.0.1", #网关172.18.0.1,这就是网桥br-b02d86520223
  52. "IPAddress": "172.18.0.3", #容器IP172.18.0.3
  53. "IPPrefixLen": 16,
  54. "IPv6Gateway": "",
  55. "GlobalIPv6Address": "",
  56. "GlobalIPv6PrefixLen": 0,
  57. "MacAddress": "02:42:ac:12:00:03",
  58. #查看容器test的网络信息
  59. [root@docker ~]# docker inspect test | grep -A 15 "Networks"
  60. "Networks": {
  61. "bridge": {
  62. "IPAMConfig": null,
  63. "Links": null,
  64. "Aliases": null,
  65. "NetworkID": "29e8c90dbd80c38e964c4a6055456fb1718f499f03a1ff81af0a3c2643231de5",
  66. "EndpointID": "cacf4aea37a8d12bae2358fa682da1e3c3b6bb85947a88d8242fbf1bff3d3d86",
  67. "Gateway": "172.17.0.1", #网关172.17.0.1,这就是网桥docker0
  68. "IPAddress": "172.17.0.2", #容器IP172.17.0.2
  69. "IPPrefixLen": 16,
  70. "IPv6Gateway": "",
  71. "GlobalIPv6Address": "",
  72. "GlobalIPv6PrefixLen": 0,
  73. "MacAddress": "02:42:ac:11:00:02",
  74. "DriverOpts": null
  75. }
 

5.1.2 host网络类型

 
  1. #启动一个网络类型为host的容器
  2. [root@docker ~]# docker run -dit --name test2 --network host centos:latest /bin/bash
  3. 156dbada7627542fd0ab7134cec270466bcef5180feeec44343821d71cc6ebaf
  4. [root@docker ~]# docker ps -a
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 156dbada7627 centos:latest "/bin/bash" 3 seconds ago Up 3 seconds test2
  7. 274cd088c4ad centos "/bin/bash" 2 hours ago Up 2 hours test
  8. 1ab26792a73c richarvey/nginx-php-fpm "docker-php-entrypoi…" 3 days ago Up 3 days 443/tcp, 9000/tcp, 0.0.0.0:88->80/tcp lnmp_web
  9. 07bd252ec637 mysql:5.6 "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:3306->3306/tcp lnmp_mysql
  10. #查看容器的ip
  11. [root@docker ~]# docker exec test2 hostname -I #这就是网络类型为host的容器,ip地址和docker宿主机完全一样
  12. 192.168.200.142 172.17.0.1 172.18.0.1
  13. [root@docker ~]# docker exec test hostname -I #网桥类型容器
  14. 172.17.0.2
  15. [root@docker ~]# docker exec lnmp_mysql hostname -i #网桥类型容器
  16. 172.18.0.2
  17. [root@docker ~]# docker exec lnmp_web hostname -i #网桥类型容器
  18. 172.18.0.3
 

5.1.3 none网络类型(用于建立与宿主机的桥接模式)

 
  1. #启动一个网络类型为none的容器
  2. [root@docker ~]# docker run -dit --name test3 --net none centos:latest
  3. cddf4c8888d71df9224b6455ae426fe33470e219c5c755252875da7a20c4527f
  4. #查看容器IP地址
  5. [root@docker ~]# docker exec test3 hostname -I

查询后发现,什么IP地址都没有,是的,none类型就是暂时不给容器指定网卡。

 

5.1.4 container网络类型

指定新容器使用指定容器的网卡

 
  1. #启动一个容器,网络类型container,使用test容器的网卡
  2. [root@docker ~]# docker run -dit --name test4 --net container:test centos:latest /bin/bash
  3. d0100ebdadde9733d5c2d0fd8f1a8017d1c74c4323408cd11ac593c0f7d7f42f
  4. [root@docker ~]# docker inspect test | grep -A 15 "Networks"
  5. \ "Networks": {
  6. "bridge": {
  7. "IPAMConfig": null,
  8. "Links": null,
  9. "Aliases": null,
  10. "NetworkID": "29e8c90dbd80c38e964c4a6055456fb1718f499f03a1ff81af0a3c2643231de5",
  11. "EndpointID": "cacf4aea37a8d12bae2358fa682da1e3c3b6bb85947a88d8242fbf1bff3d3d86",
  12. "Gateway": "172.17.0.1", #test容器的网关
  13. "IPAddress": "172.17.0.2", #test容器模式网桥
  14. "IPPrefixLen": 16,
  15. "IPv6Gateway": "",
  16. "GlobalIPv6Address": "",
  17. "GlobalIPv6PrefixLen": 0,
  18. "MacAddress": "02:42:ac:11:00:02",
  19. "DriverOpts": null
  20. }
  21. [root@docker ~]# docker inspect test4 | grep -A 15 "Networks"
  22. "Networks": {} #test4容器并没有自己的网络设置
  23. }
  24. }
  25. ]
  26. [root@docker ~]# docker exec test4 hostname -I #test4没有网络设置却有IP地址和test容器完全一样
  27. 172.17.0.2
 

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

 

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

QQ截图20180711004924.png-158kB

 
  1. #构建一个永久生效的网桥br0
  2. [root@docker network-scripts]# cat ifcfg-ens32
  3. TYPE=Ethernet
  4. BOOTPROTO=dhcp
  5. NAME=ens32
  6. DEVICE=ens32
  7. ONBOOT=yes
  8. BRIDGE=br0
  9. [root@docker network-scripts]# cat ifcfg-br0
  10. TYPE=Bridge
  11. BOOTPROTO=static
  12. DEVICE=br0
  13. ONBOOT=yes
  14. IPADDR=192.168.200.142
  15. NETMASK=255.255.255.0
  16. GATEWAY=192.168.200.2
  17. DNS1=192.168.200.2
  18. [root@docker network-scripts]# service network restart
  19. #查看网卡IP
  20. [root@docker network-scripts]# ifconfig ens32
  21. ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  22. ether 00:0c:29:93:37:0b txqueuelen 1000 (Ethernet) #ens32网卡已经没有IP地址了
  23. RX packets 626902 bytes 599726150 (571.9 MiB)
  24. RX errors 0 dropped 0 overruns 0 frame 0
  25. TX packets 570556 bytes 1022355519 (974.9 MiB)
  26. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  27. [root@docker network-scripts]# ifconfig br0
  28. br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  29. inet 192.168.200.142 netmask 255.255.255.0 broadcast 192.168.200.255 #网桥br0代替了ens32
  30. inet6 fe80::f82d:6dff:fed3:a9bb prefixlen 64 scopeid 0x20<link>
  31. ether 00:0c:29:93:37:0b txqueuelen 1000 (Ethernet)
  32. RX packets 306 bytes 28092 (27.4 KiB)
  33. RX errors 0 dropped 0 overruns 0 frame 0
  34. TX packets 141 bytes 19806 (19.3 KiB)
  35. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  36. [root@docker network-scripts]# brctl show
  37. bridge name bridge id STP enabled interfaces
  38. br-b02d86520223 8000.02427fd4e96d no veth3c0da5f
  39. vethcd34854
  40. br0 8000.000c2993370b no ens32 #网桥br0,桥接在了真实的物理网卡ens32上
  41. docker0 8000.02424cab4d14 no veth0d15221
 

5.2.2 通过pipework工具配置容器固定IP

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

 
  1. #解压安装pipework工具
  2. [root@docker ~]# yum -y install unzip
  3. [root@docker ~]# unzip pipework-master.zip
  4. Archive: pipework-master.zip
  5. ae42f1b5fef82b3bc23fe93c95c345e7af65fef3
  6. creating: pipework-master/
  7. extracting: pipework-master/.gitignore
  8. inflating: pipework-master/LICENSE
  9. inflating: pipework-master/README.md
  10. inflating: pipework-master/docker-compose.yml
  11. creating: pipework-master/doctoc/
  12. inflating: pipework-master/doctoc/Dockerfile
  13. inflating: pipework-master/pipework
  14. inflating: pipework-master/pipework.spec
  15. [root@docker ~]# mv pipework-master /usr/local/
  16. [root@docker ~]# ln -s /usr/local/pipework-master/pipework /usr/local/bin/
  17. [root@docker ~]# which pipework
  18. /usr/local/bin/pipework
  19. #建立网络类型为none的容器,并通过pipework配置固定ip地址
  20. [root@docker ~]# docker run -dit --name test5 --net none centos:latest /bin/bash
  21. 5b06b180ce8477eb21959facde5c48f1d3670396baa5696ad319d3052b610a4b
  22. [root@docker ~]# pipework br0 test5 192.168.200.199/24@192.168.200.2 #设置容器固定IP为192.168.200.199网关192.168.200.2
  23. [root@docker ~]# docker exec test5 hostname -I #有IP了
  24. 192.168.200.199
  25. [root@docker ~]# ping 192.168.200.199 #宿主机ping能通
  26. PING 192.168.200.199 (192.168.200.199) 56(84) bytes of data.
  27. 64 bytes from 192.168.200.199: icmp_seq=1 ttl=64 time=0.076 ms
  28. ^C
  29. --- 192.168.200.199 ping statistics ---
  30. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  31. rtt min/avg/max/mdev = 0.076/0.076/0.076/0.000 ms
  32. [root@docker ~]# docker exec -it test5 /bin/bash #进入容器
  33. [root@5b06b180ce84 /]# ping www.baidu.com #能连接外网
  34. PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
  35. 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=128 time=5.73 ms
  36. ^C
  37. --- www.a.shifen.com ping statistics ---
  38. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  39. rtt min/avg/max/mdev = 5.733/5.733/5.733/0.000 ms

通过windows宿主机ping虚拟机中的容器进程IP进行测试

QQ截图20180711012735.png-15.5kB

综上,外部机器访问虚拟机中的容器进程也可以联通了

 

六,Docker的镜像制作

 

6.1 Dockerfile常用指令介绍

指令描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
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镜像

 
  1. #首先我们开启ipv4转发
  2. [root@docker ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
  3. [root@docker ~]# sysctl -p
  4. net.ipv4.ip_forward = 1
  5. #创建nginx的镜像目录
  6. [root@docker ~]# mkdir -p dockerfile/lib/centos/nginx
  7. [root@docker ~]# cd dockerfile/lib/centos/nginx
  8. #准备Dockerfile文件
  9. [root@docker nginx]# cat Dockerfile
  10. FROM centos:7
  11. MAINTAINER www.yunjisuan.com
  12. RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
  13. ADD nginx-1.12.1.tar.gz /tmp
  14. RUN cd /tmp/nginx-1.12.1 && \
  15. ./configure --prefix=/usr/local/nginx && \
  16. make -j 2 && \
  17. make install
  18. RUN rm -rf /tmp/nginx-1.12.1* && yum clean all
  19. COPY nginx.conf /usr/local/nginx/conf
  20. WORKDIR /usr/local/nginx
  21. EXPOSE 80
  22. CMD ["./sbin/nginx", "-g", "daemon off;"]
  23. #将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
  24. [root@docker nginx]# ls
  25. Dockerfile nginx-1.12.1.tar.gz nginx.conf
  26. #build基于nginx的docker镜像
  27. [root@docker nginx]# docker build -t nginx:1 .
 

6.3 构建PHP网站平台镜像实战

现在我们创建一个PHP的docker镜像

 
  1. #创建php的镜像目录
  2. [root@docker php]# mkdir -p /root/dockerfile/lib/centos/php
  3. [root@docker php]# cd /root/dockerfile/lib/centos/php
  4. #准备Dockerfile文件
  5. [root@docker ~]# cat Dockerfile
  6. FROM centos:7
  7. MAINTAINER www.yunjisuan.com
  8. RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
  9. ADD php-5.6.31.tar.gz /tmp
  10. RUN cd /tmp/php-5.6.31 && \
  11. ./configure --prefix=/usr/local/php \
  12. --with-config-file-path=/usr/local/php/etc \
  13. --with-mysql --with-mysqli \
  14. --with-openssl --with-zlib --with-curl --with-gd \
  15. --with-jpeg-dir --with-png-dir --with-iconv \
  16. --enable-fpm --enable-zip --enable-mbstring && \
  17. make -j 4 && \
  18. make install && \
  19. cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
  20. sed -i "s#127.0.0.1#0.0.0.0#" /usr/local/php/etc/php-fpm.conf && \
  21. sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
  22. COPY php.ini /usr/local/php/etc
  23. RUN rm -rf /tmp/php-5.6.31* && yum -y clean all
  24. WORKDIR /usr/local/php
  25. EXPOSE 9000
  26. CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
  27. #将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
  28. [root@docker php]# ls
  29. Dockerfile php-5.6.31.tar.gz php.ini
  30. #build基于php的docker镜像
  31. [root@docker php]# docker build -t php:1 .
  32. [root@docker php]# docker images
  33. REPOSITORY TAG IMAGE ID CREATED SIZE
  34. php 1 b32db03ee974 9 minutes ago 965MB
  35. richarvey/nginx-php-fpm latest 26c0e6f09c52 6 days ago 300MB
  36. nginx latest 649dcb69b782 7 days ago 109MB
  37. mysql 5.6 97fdbdd65c6a 2 weeks ago 256MB
  38. centos 7 49f7960eb7e4 5 weeks ago 200MB
  39. centos latest 49f7960eb7e4 5 weeks ago 200MB
 

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

 
  1. #创建一个叫做lnmp的网络
  2. [root@docker nginx]# docker network create lnmp
  3. [root@docker nginx]# docker network ls
  4. NETWORK ID NAME DRIVER SCOPE
  5. 29e8c90dbd80 bridge bridge local
  6. f11e598312bd host host local
  7. b02d86520223 lnmp bridge local
  8. 3978eff69b11 none null local
  9. #创建nginx-php网页挂载目录
  10. [root@docker ~]# mkdir -p /app/wwwroot
  11. #启动php容器
  12. [root@docker nginx]# docker run -dit --name lnmp_php --network lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html php:1
  13. a58142f8e7a219f4cfdbb5d919fdd66a9a5b25b938b7b37db5af3bb4ccb47030
  14. [root@docker nginx]# docker ps
  15. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  16. a58142f8e7a2 php:1 "./sbin/php-fpm -c /…" 4 seconds ago Up 4 seconds 9000/tcp lnmp_php
  17. [root@docker nginx]# docker exec lnmp_php hostname -I
  18. 172.18.0.2
  19. #启动nginx容器
  20. [root@docker ~]# docker run -dit --name lnmp_nginx -p 888:80 --network lnmp --mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html nginx:1
  21. c9cc03248aee776185ca6c9f2d094e4958f1dbd1e5e6485c51204acdcb6611cf
  22. [root@docker ~]# docker ps -a
  23. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  24. c9cc03248aee nginx:1 "./sbin/nginx -g 'da…" 3 seconds ago Up 2 seconds 80/tcp lnmp_nginx
  25. 078d85b7b76c php:1 "./sbin/php-fpm -c /…" 9 minutes ago Up 9 minutes 9000/tcp lnmp_php
  26. [root@docker ~]# docker exec lnmp_nginx hostname -I
  27. 172.18.0.3
  28. #创建测试页面php.info
  29. [root@docker wwwroot]# echo "<?php phpinfo();?>" > /app/wwwroot/index.php

最后通过浏览器进行访问测试

QQ截图20180711224307.png-55.2kB

 

6.5 docke基础阶段作业

  • :在nginx-php镜像的基础上构建mysql:1的镜像,并启动lnmp_mysql容器进程
  • :实现wordpress博客的部署
 

6.6 构建JAVA网站环境镜像实战

 
  1. #创建java镜像构建存储目录
  2. [root@docker ~]# mkdir -p dockerfile/lib/centos/tomcat
  3. [root@docker ~]# cd dockerfile/lib/centos/tomcat
  4. #将所需软件包拷贝到当前目录下
  5. [root@docker tomcat]# ls
  6. apache-tomcat-8.0.46.tar.gz Dockerfile jdk-8u45-linux-x64.tar.gz server.xml
  7. #筹备Dockerfile
  8. [root@docker tomcat]# cat Dockerfile
  9. FROM centos:7
  10. MAINTAINER www.yunjisuan.com
  11. ADD jdk-8u45-linux-x64.tar.gz /usr/local
  12. ENV JAVA_HOME /usr/local/jdk1.8.0_45
  13. ADD apache-tomcat-8.0.46.tar.gz /usr/local
  14. COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
  15. RUN rm -f /usr/local/apache*.tar.gz
  16. WORKDIR /usr/local/apache-tomcat-8.0.46
  17. EXPOSE 8080
  18. ENTRYPOINT ["./bin/catalina.sh", "run"]
  19. #build基于tomcat的镜像
  20. [root@docker tomcat]# docker build -t tomcat:1 .
  21. #创建网页挂载目录
  22. [root@docker tomcat]# mkdir -p /app/webapps
  23. #启动tomcat的容器进程
  24. [root@docker 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
  25. 5ca13d17a24bd390f1eaaf5e7e4ab33e299eeb55b3719d84e15702d7dbee9557
  26. #查看容器进程
  27. [root@docker tomcat]# docker ps
  28. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  29. 5ca13d17a24b tomcat:1 "./bin/catalina.sh r…" 34 seconds ago Up 34 seconds 0.0.0.0:8080->8080/tcp tomcat
  30. afb646218459 nginx:1 "./sbin/nginx -g 'da…" 36 minutes ago Up 36 minutes 0.0.0.0:888->80/tcp lnmp_nginx
  31. 078d85b7b76c php:1 "./sbin/php-fpm -c /…" About an hour ago Up About an hour 9000/tcp lnmp_php
  32. #创建网站测试页
  33. [root@docker tomcat]# mkdir -p /app/webapps/ROOT
  34. [root@docker tomcat]# echo "welcome to yunjisuan" >> /app/webapps/ROOT/index.html

然后我们用浏览器访问8080端口

QQ截图20180711233044.png-12.7kB

特别提示:

  • 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 安装

下载docker-compose-linux-x86_64.zip

 
  1. [root@docker ~]# ll docker-compose-linux-x86_64.zip
  2. -rw-r--r-- 1 root root 8733389 7 13 22:54 docker-compose-linux-x86_64.zip
  3. [root@docker ~]# which unzip
  4. /usr/bin/unzip
  5. [root@docker ~]# unzip docker-compose-linux-x86_64.zip
  6. Archive: docker-compose-linux-x86_64.zip
  7. inflating: docker-compose
  8. [root@docker ~]# ll docker-compose
  9. -rw-r--r-- 1 root root 8858496 8 31 2017 docker-compose
  10. [root@docker ~]# chmod +x docker-compose
  11. [root@docker ~]# mv docker-compose /usr/bin/
  12. [root@docker ~]# which docker-compose
  13. /usr/bin/docker-compose
 

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 容器主机名
  • 常用命令
字段描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器,网络,数据卷和镜像
stop/start/restart 停止/启动/重启服务
  • 例如:
 
  1. [root@docker ~]# cat docker-compose.yml
  2. version: '3'
  3. services:
  4. nginx:
  5. hostname: nginx
  6. build:
  7. context: ./nginx
  8. dockerfile: Dockerfile
  9. ports:
  10. - 81:80
  11. networks:
  12. - lnmp
  13. volumes:
  14. - ./wwwroot:/usr/local/nginx/html
  15. php:
  16. hostname: php
  17. build:
  18. context: ./php
  19. dockerfile: Dockerfile
  20. networks:
  21. - lnmp
  22. volumes:
  23. - ./wwwroot:/usr/local/nginx/html
  24. mysql:
  25. hostname: mysql
  26. image: mysql:5.6
  27. ports:
  28. - 3306:3306
  29. networks:
  30. - lnmp
  31. volumes:
  32. - ./mysql/conf:/etc/mysql/conf.d
  33. - ./mysql/data:/var/lib/mysql
  34. command: --character-set-server=utf8
  35. environment:
  36. MYSQL_ROOT_PASSWORD: 123456
  37. MYSQL_DATABASE: wordpress
  38. MYSQL_USER: user
  39. MYSQL_PASSWORD: user123
  40. networks:
  41. lnmp:
 

7.2 一键部署LNMP网站平台实战

 
  1. #查看compose_lnmp包
  2. [root@docker ~]# tree compose_lnmp/
  3. compose_lnmp/
  4. ├── docker-compose.yml #docker-compose启动接口文件
  5. ├── mysql
  6.    ├── conf
  7.       └── my.cnf #mysql配置文件
  8.    └── data #待挂载mysql数据目录
  9. ├── nginx
  10.    ├── Dockerfile #自定义nginx的Docker镜像配置文件
  11.    ├── nginx-1.12.1.tar.gz #源码包
  12.    └── nginx.conf #nginx配置文件
  13. ├── php
  14.    ├── Dockerfile #自定义php的Docker镜像配置文件
  15.    ├── php-5.6.31.tar.gz #源码包
  16.    └── php.ini #php解析器配置文件
  17. └── wwwroot #nginx容器和php容器待挂载的网页目录
  18. └── index.php #网页测试文件
  19. 6 directories, 9 files
  20. #一键部署LNMP
  21. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml up

浏览器访问:

QQ截图20180714004700.png-45.3kB

 
  1. #一键查看所有部署的容器进程
  2. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml ps
  3. Name Command State Ports
  4. -------------------------------------------------------------------------------------
  5. composelnmp_mysql_1 docker-entrypoint.sh --cha ... Up 0.0.0.0:3306->3306/tcp
  6. composelnmp_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:81->80/tcp
  7. composelnmp_php_1 ./sbin/php-fpm -c /usr/loc ... Up 9000/tcp
  8. #一键终止所有部署的容器进程
  9. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml stop
  10. Stopping composelnmp_nginx_1 ... done
  11. Stopping composelnmp_php_1 ... done
  12. Stopping composelnmp_mysql_1 ... done
  13. #一键查看所有部署的容器进程
  14. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml ps
  15. Name Command State Ports
  16. ---------------------------------------------------------------------
  17. composelnmp_mysql_1 docker-entrypoint.sh --cha ... Exit 0
  18. composelnmp_nginx_1 ./sbin/nginx -g daemon off; Exit 0
  19. composelnmp_php_1 ./sbin/php-fpm -c /usr/loc ... Exit 0
  20. #一键清理所有部署的容器进程
  21. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml down
  22. Removing composelnmp_nginx_1 ... done
  23. Removing composelnmp_php_1 ... done
  24. Removing composelnmp_mysql_1 ... done
  25. Removing network composelnmp_lnmp
  26. [root@docker compose_lnmp]# docker-compose -f docker-compose.yml ps
  27. Name Command State Ports
  28. ------------------------------
 

7.3 一键部署Nginx反向代理Tomcat集群实战

 
  1. #查看compose_nginx_tomcat包
  2. [root@docker ~]# tree compose_nginx_tomcat/
  3. compose_nginx_tomcat/
  4. ├── docker-compose.yml
  5. ├── mysql
  6.    ├── conf
  7.       └── my.cnf #mysql的配置文件
  8.    └── data #待挂载mysql数据目录
  9. ├── nginx
  10.    ├── Dockerfile #自定义镜像配置文件
  11.    ├── nginx-1.12.1.tar.gz #源码包
  12.    └── nginx.conf #nginx配置文件
  13. ├── tomcat
  14.    ├── apache-tomcat-8.0.46.tar.gz #源码包
  15.    ├── Dockerfile #自定义镜像配置文件
  16.    └── server.xml #tomcat配置文件
  17. └── webapps
  18. └── ROOT
  19. └── index.html #网页测试文件
  20. 7 directories, 9 files
  21. #查看docker-compose的启动接口文件
  22. [root@docker ~]# cat compose_nginx_tomcat/docker-compose.yml
  23. version: '3'
  24. services:
  25. nginx:
  26. hostname: nginx
  27. build:
  28. context: ./nginx
  29. dockerfile: Dockerfile
  30. ports:
  31. - 82:80
  32. networks:
  33. - lnmt
  34. volumes:
  35. - ./webapps:/opt/webapps
  36. tomcat01:
  37. hostname: tomcat01
  38. build: ./tomcat
  39. networks:
  40. - lnmt
  41. volumes:
  42. - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45
  43. - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
  44. tomcat02:
  45. hostname: tomcat02
  46. build: ./tomcat
  47. networks:
  48. - lnmt
  49. volumes:
  50. - /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45 #docker宿主机的java环境被挂载了!
  51. - ./webapps:/usr/local/apache-tomcat-8.0.46/webapps
  52. mysql:
  53. hostname: mysql
  54. image: mysql:5.6
  55. ports:
  56. - 3307:3306
  57. networks:
  58. - lnmt
  59. volumes:
  60. - ./mysql/conf:/etc/mysql/conf.d
  61. - ./mysql/data:/var/lib/mysql
  62. environment:
  63. MYSQL_ROOT_PASSWORD: 123456
  64. MYSQL_DATABASE: db
  65. MYSQL_USER: user
  66. MYSQL_PASSWORD: user123
  67. networks:
  68. lnmt:
  69. #由于tomcat容器进程需要挂载docker宿主机本地的java环境
  70. #所以在docker宿主机本地安装jdk-8u45-linux-x64.tar.gz
  71. [root@docker ~]# ll jdk-8u45-linux-x64.tar.gz
  72. -rw-r--r-- 1 root root 173271626 7 14 01:38 jdk-8u45-linux-x64.tar.gz
  73. [root@docker ~]# tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local
  74. [root@docker ~]# ll -d /usr/local/jdk1.8.0_45
  75. drwxr-xr-x 8 10 143 255 4 11 2015 /usr/local/jdk1.8.0_45
  76. #一键部署ngxin+tomcat反向代理集群
  77. [root@docker compose_nginx_tomcat]# pwd
  78. /root/compose_nginx_tomcat
  79. [root@docker compose_nginx_tomcat]# docker-compose -f docker-compose.yml up

浏览器访问:

QQ截图20180714013650.png-11.3kB

 
  1. [root@docker ~]# docker-compose -f compose_nginx_tomcat/docker-compose.yml ps
  2. Name Command State Ports
  3. --------------------------------------------------------------------------------------------
  4. composenginxtomcat_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp
  5. composenginxtomcat_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:82->80/tcp
  6. composenginxtomcat_tomcat01_1 ./bin/catalina.sh run Up 8080/tcp
  7. composenginxtomcat_tomcat02_1 ./bin/catalina.sh run Up 8080/tcp
  8. [root@docker ~]# docker-compose -f compose_nginx_tomcat/docker-compose.yml stop
  9. Stopping composenginxtomcat_nginx_1 ... done
  10. Stopping composenginxtomcat_mysql_1 ... done
  11. Stopping composenginxtomcat_tomcat02_1 ... done
  12. Stopping composenginxtomcat_tomcat01_1 ... done
  13. [root@docker ~]# docker-compose -f compose_nginx_tomcat/docker-compose.yml ps
  14. Name Command State Ports
  15. ------------------------------------------------------------------------------
  16. composenginxtomcat_mysql_1 docker-entrypoint.sh mysqld Exit 0
  17. composenginxtomcat_nginx_1 ./sbin/nginx -g daemon off; Exit 0
  18. composenginxtomcat_tomcat01_1 ./bin/catalina.sh run Exit 143
  19. composenginxtomcat_tomcat02_1 ./bin/catalina.sh run Exit 143
  20. [root@docker ~]# docker-compose -f compose_nginx_tomcat/docker-compose.yml down
  21. Removing composenginxtomcat_nginx_1 ... done
  22. Removing composenginxtomcat_mysql_1 ... done
  23. Removing composenginxtomcat_tomcat02_1 ... done
  24. Removing composenginxtomcat_tomcat01_1 ... done
  25. Removing network composenginxtomcat_lnmt
  26. [root@docker ~]# docker-compose -f compose_nginx_tomcat/docker-compose.yml ps
  27. Name Command State Ports
  28. ------------------------------
+
 
 
 
 
posted on 2018-07-26 19:04  热巴热吧  阅读(419)  评论(0编辑  收藏  举报