[关闭]
@zhangyy 2021-07-07T15:36:26.000000Z 字数 13947 阅读 194

Docker的介绍与安装

docker的部分


  • 一: docker 的介绍
  • 二: docker 的安装
  • 三: 镜像的管理

一: docker 的介绍

1.1 docker是什么

  1. Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroupnamespaceUnion FS等技术,对应用进程进行封装隔离,并且
  2. 独立于宿主机与其他进程,这种运行时封装的状态称为容器。
  3. Docker早起版本实现是基于LXC,并进一步对其封装,包括文件系统、网络互联、镜像管理等方面,极大简化了容器管理。从0.7版本以后开始去
  4. LXC,转为自行研发的libcontainer,从1.11版本开始,进一步演进为使用runCcontainerd
  5. Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序,程序之间相互隔离。

1.2 docker的体系架构

image_1cb993uo2a131lqv13urcu75s49.png-43.3kB

  1. Containerd:是一个简单的守护进程,使用runC管理容器。向Docker Engine
  2. 供接口。
  3. Shim:只负责管理一个容器。
  4. runC:是一个轻量级的工具,只用来运行容器。

image_1cb99pfef1lci1tsot3v35g1ctdm.png-160.8kB

1.3 docker 的 内部组建

  1. 1. Namespaces
  2. 命名空间,Linux内核提供的一种对进程资源隔离的机制,例如进程、网络、挂载点等资源。
  3. 2. CGroups
  4. 控制组,Linux内核提供的一种限制进程资源的机制;例如CPU、内存等资源。
  5. 3. UnionFS
  6. 联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。

1.4 虚拟机与容器区别

image_1cb9a35f4f8h1qk31rc3pps19013.png-206.5kB

  1. KVM 举例,与 Docker 对比
  2. 启动时间
  3. Docker秒级启动,KVM分钟级启动。
  4. 轻量级
  5. 容器镜像大小通常以M为单位,虚拟机以G为单位。
  6. 容器资源占用小,要比虚拟机部署更快速。
  7. 性能
  8. 容器共享宿主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,容器性能基本接近物理机;
  9. 虚拟机需要Hypervisor层支持,虚拟化一些设备,具有完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好。
  10. 安全性
  11. 由于共享宿主机内核,只是进程级隔离,因此隔离性和稳定性不如虚拟机,容器具有一定权限访问宿主机内核,存在一定安全隐患。
  12. 使用 要求
  13. KVM基于硬件的完全虚拟化,需要硬件CPU虚拟化技术支持;
  14. 容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。

1.5 docker 的应用场景

  1. 场景一:节省项目环境部署时间
  2. 1. 单项目打包
  3. 2. 整套项目打包
  4. 3. 新开源技术试用
  5. 场景二:环境一致性
  6. 场景三:持续集成
  7. 场景四:微服务
  8. 场景五:弹性伸缩
  9. 参看: http://blog.51cto.com/lizhenliang/1978081

二: 在Linux下面安装docker

  1. CentOS7
  2. # 安装依赖包
  3. yum install -y yum-utils device-mapper-persistent-data lvm2
  4. # 添加Docker软件包源
  5. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  6. # 更新yum包索引
  7. yum makecache fast
  8. # 安装Docker CE
  9. yum install docker-ce -y
  10. # 启动
  11. systemctl start docker
  12. # 卸载
  13. yum remove docker-ce
  14. rm -rf /var/lib/docker
  15. 官方安装文档:
  16. https://docs.docker.com/engine/installation/linux/docker-
  17. ce/centos/#docker-ee-customers

image_1cb9c77p1129s1lcctin1nh11np91g.png-460.4kB
image_1cb9ccehn1sg3c2m12s9u19h3f2q.png-240.8kB

image_1cb9c7mb6130et413nvso014am1t.png-343.8kB

  1. linux 修改时区的方法
  2. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  3. date -s "2018-01-27 14:17:00"
  1. Ubuntu14.06/16.04
  2. # 安装证书
  3. sudo apt-get install \
  4. apt-transport-https \
  5. ca-certificates \
  6. curl \
  7. software-properties-common
  8. # 添加Docker源的KEY
  9. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  10. # 添加Docker软件包源
  11. sudo add-apt-repository \
  12. "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  13. $(lsb_release -cs) \
  14. stable"
  15. # 更新apt包索引
  16. sudo apt-get update
  17. # 安装
  18. sudo apt-get install docker-ce
  19. # 卸载
  20. sudo apt-get purge docker-ce
  21. sudo rm -rf /var/lib/docker

三: 镜像的管理

3.1:什么是镜像

  1. 什么是镜像?
  2. 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。
  3. ---
  4. 镜像是什么?
  5. 一个分层存储的文件
  6. 一个软件的环境
  7. 一个镜像可以创建N个容器
  8. 一种标准化的交付
  9. 一个不包含Linux内核而又精简的Linux操作系统
  10. 镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层
  11. 对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\<storage-driver\>中。
  12. 镜像从哪里来?
  13. Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
  14. 地址:https://hub.docker.com/explore
  15. 配置镜像加速器:https://www.daocloud.io/mirror
  16. curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
  17. ---
  18. 镜像从哪里来?
  19. Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
  20. https://hub.docker.com/explore
  21. 默认是国外的源,下载会慢,建议配置国内镜像仓库:
  22. # vi /etc/docker/daemon.json
  23. {
  24. "registry-mirrors": [ "https://registry.docker-cn.com"]
  25. }
  26. ----
  27. 重启一下:
  28. systemctl restart docker

3.2 镜像与容器的关系

image_1cb9d7tl0l46fmr3e1cj7dk437.png-428.1kB

  1. 镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>
  2. 看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在
  3. /var/lib/docker/<storage-driver>中。
  4. 容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写
  5. 到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。
  6. Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

image_1cb9dcjhub994cvnpde1f63144.png-475kB


  1. 如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,
  2. 会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
  3. 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多
  4. 少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作
  5. 的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
  6. 若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。

image_1e5i36t3s176h2dcmod1c1u3gu13.png-571.8kB

3.3 存储驱动

image_1cb9dncvh11fc126c1d3v1d526q44h.png-141kB

3.4 镜像的命令

image_1cb9e0qim1sgjvhb10c13h43op5u.png-289.8kB

  1. docker image pull httpd ## 拉取一个镜像

image_1cb9fstub5rd1qll19557bo19msm.png-268.2kB

  1. 去这里 下载:
  2. https://download.openvz.org/template/precreated/
  3. cat centos-6-x86_64-minimal.tar.gz |docker import - centos:6.0 ## 创建镜像
  4. cat centos-7-x86_64-minimal.tar.gz |docker import - centos:7.0
  5. cat ubuntu-16.04-x86_64.tar.gz |docker import - ubuntu:16.04

image_1cb9fu75u6qj112v96pj1i3713.png-86.8kB

  1. docker image ls ## 列出所有镜像

image_1cb9e31k11s1aek62t71eur1otr6b.png-105.7kB

  1. docker image history httpd 查看镜像的分层历史

image_1cb9frfd04ghvhe1k5rerufcg9.png-847.7kB

  1. docker image inspect nginx 查看 一个镜像的具体信息

image_1cb9g0ee67m6qs0vv51bvo1lhc1g.png-304.3kB

  1. docker image pull nginx:1.11 # 下载一个镜像

image_1cbdosnmu1h7r18bi1sr1ko431tm.png-213.6kB
image_1cbdorvti11erq2412gbrr81eon9.png-202.7kB

  1. 保存一个镜像:
  2. docker image save nginx:1.11 > nginx1.11.tar.gz

image_1cbdouqe5150e1s56ejt14fa18h13.png-214.1kB

  1. 删除一个一个镜像
  2. docker image rm nginx:1.11

image_1cbdp2rd21jmg64rbc014u4q991g.png-262.6kB

  1. 导入一个镜像
  2. docker image load < nginx1.11.tar.gz

image_1cbdp4abg2tdnn71t3n1tdb155q1t.png-424kB

  1. 导出正在容器 的文件系统
  2. docker export f376547bcb01 > http.tar.gz

image_1cbdpnbdb1os910qt7kfnsm7ms2a.png-382kB

  1. 导入容器
  2. docker import http.tar.gz http:v2

image_1cbdprnfc1d1s24nb3o1rfc5gh2n.png-493.5kB

3.5 容器的创建

image_1cbdqmvgf4u91p9po2t5861hom34.png-606.7kB

  1. 创建一个容器
  2. docker container run -ti http:v2 /bin/bash ## 创建一个容器,退出就关闭了
  3. docker container start 9bfd4

image_1cbdr31bm6v516usa1j1a9olsd3h.png-193.2kB
image_1cbdr3inf1p93nuh1lq51fjf1bqo3u.png-313.7kB

  1. 进入一个容器
  2. docker container exec -ti 9bfd4 /bin/bash

image_1cbdr6k4q1mu3g31r14o9ess45l.png-156.9kB

  1. 容器与外面端口的映射
  2. docker container run -tid -p 8080:80 nginx:1.11 /bin/bash
  3. docker container exec -ti c4a659 /bin/bash
  4. service nginx start

image_1cbds4vcc1hkj1vnk1gf61gb5cpc62.png-310.1kB

image_1cbds5qfa1j101si1n446qu13uo6f.png-74.4kB

image_1cbds74331mf31oi1102cralmui7s.png-336kB

image_1cbds8cplcc11628snruhc1r7n99.png-104.8kB


  1. 创建一个一直在运行的服务
  2. docker container run -tid --name nginx01 --restart=always nginx:1.11

image_1cbdt19dj1kv11s5smc01dpq1tfoa6.png-373.1kB

  1. 创建容器,限制容器的cpu
  2. docker container run --help |grep cpu

image_1cbdt94ro14h2ohmpemo7o1n81b0.png-273.4kB

  1. docker container run -tid --memory 512M --cpus 1 --name nginx02 nginx:1.11
  2. 查看使用的量
  3. docker container stats

image_1cbdtih863r01uas161g1i9pv69bd.png-385.2kB
image_1cbdtlagqo11ceg13l0100o1vrbq.png-144.4kB

image_1cbdtvtbo1onmk9mbgj542q49c7.png-266.1kB

  1. 查看有哪些容器
  2. docker container ls

image_1cbdu30sl1bqk16ln1d6t15fkm4qek.png-234.8kB

  1. 查看容器的详细信息
  2. docker container inspect c44023d07aab

image_1cbdu6blu1a2916hh6u81iir8pcf1.png-319.6kB

  1. 附加到容器
  2. docker container attach c44 ### 如果 容器正在运行程序则进不了容器
  3. docker container exec c44 /bin/bash ### 进入的容器必须是已经启动的容器

image_1cbdujmcp6unitj104j11fs1p0lfe.png-264.1kB
image_1cbduk6ns1df2kmqptmqnv1k0pfr.png-130.4kB

  1. 提交一个容器到镜像 仓库
  2. docker container commit c44023d07aab nginx:test1

image_1cbe0ujce18f2r9s112g7mri41h8.png-389.7kB

  1. 向容器中复制东西
  2. docker container cp anaconda-ks.cfg nginx02:/root
  3. docker container exec nginx02 ls /root

image_1cbe1ejlr11qgjmr1qakju9vkehl.png-82.9kB

image_1cbe1f71018pt1lhtbsc1s8ouuhi2.png-84.7kB

  1. docker container logs nginx02 ### 查看容器的日志
  1. docker container port c4a6593972f6 ## 查看容器的映射端口

image_1cbe5l79s1mrf4jf10gh13iv1488if.png-85.7kB

3.6 将Docker主机数据挂载到容器

  1. Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumesbind mountstmpfs
  2. volumesDocker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。
  3. bind mounts:可以存储在宿主机系统的任意位置。
  4. tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统。

image_1cbe5ns29pao1hf81mvuu041phtis.png-63.2kB

3.6.1 使用volumes

  1. cd /var/lib/docker/volumes
  2. docker volume create nginx-vol
  3. docker volume ls
  4. docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx ### 创建容器并使用建好的volume 卷处理
  5. docker volume create nginxz-vol
  6. docker volume ls
  7. docker run -tid --name=nginxz --mount src=nginxz-vol,dst=/usr/local nginxz:1.11
  8. docker volume create httpd-vol
  9. docker volume ls
  10. docker run -tid --name=httpd-test --mount src=httpd-vol,dst=/usr/local httpd
  11. 如果一个数据卷可以挂载在不同的容器当中,就可以实现端口的负载了

image_1cbu160cd1029122k1teg1qqe1uch9.png-126kB
image_1cbe5ucbpm7h167025oe8v1toj9.png-81.6kB

image_1cbe5vvv91n6lp1k1ic617ci7krjm.png-120.3kB

image_1cbe692gf4qb1rep1l7p86relik3.png-140kB

image_1cbe6a9qgts01c5k1355vh1fhvlg.png-90.8kB

image_1cbe6bdqq1h5n1g1245qg6712k9md.png-67.6kB

image_1cbel1rvh1oau1t175pgmebp08p1.png-118.5kB

image_1cbelnv76b0s1blc8ga132p1t08pe.png-315.2kB

  1. 进入这个容器
  2. docker container exec -ti nginx-test bash
  3. cd /usr/share/nginx/html/
  4. touch 1.txt
  5. 退出容器
  6. cd /var/lib/docker/volume/nginx-vol/_data/
  7. ls -ld *

image_1cbe6pqkf1rsn1dql136trekjuon7.png-177.5kB

image_1cbe6t0gfgt16kr1opk9gn1pj3o7.png-118.4kB

  1. 删除所有容器
  2. docker rm -f $(docker ps -q -a)

image_1cbejr5s7ni1cr711ru8vdootok.png-124.5kB


3.6.2 bind 的 挂载 本地 容器

  1. 用卷创建 一个容器:
  2. # mkdir -p /app/www/html
  3. # docker run -d -it --name=nginx-test --mount type=bind,src=/app/www/html,dst=/usr/share/nginx/html nginx
  4. # docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
  5. 验证绑定:
  6. # docker inspect nginx-test
  7. 清理:
  8. # docker container stop nginx-test
  9. # docker container rm nginx-test
  10. 注意:
  11. 1. 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
  12. 2. 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏

image_1cbu1csf1rm61llfdtb1q491dkrm.png-613kB

  1. Docker报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
  2. # vim /usr/lib/sysctl.d/00-system.conf
  3. 加上:
  4. net.ipv4.ip_forward=1
  5. 重启网卡:
  6. service network restart

四: 搭建一个lnmp 环境

  1. 0 宿主机安装mysql8.0
  2. rpm -e mariadb-devel mariadb-libs mariadb --nodeps
  3. yum install -y perl-JSON
  4. rm -rf mysql-community-server-minimal-8.0.11-1.el7.x86_64.rpm
  5. rpm -ivh mysql-community-*
  6. 1 、自定义网络
  7. docker network create lnmp
  8. 2 、创建 Mysql 数据库容器
  9. docker run -itd \
  10. --name lnmp_mysql \
  11. --net lnmp \
  12. -p 3306:3306 \
  13. --mount src=mysql-vol,dst=/var/lib/mysql \
  14. -e MYSQL_ROOT_PASSWORD=123456 \
  15. mysql --character-set-server=utf8
  16. 3 、创建 所需 数据库
  17. docker exec lnmp_mysql sh \
  18. -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
  19. 4 、创建 PHP 环境容器
  20. docker run -itd \
  21. --name lnmp_web \
  22. --net lnmp \
  23. -p 88:80 \
  24. --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm 5 wordpress 博客为例测试
  25. wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
  26. tar zxf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot
  27. 容器的访问:
  28. iptables -I INPUT -s 0.0.0.0 -j ACCEPT
  29. iptables -I INPUT -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
  30. # 浏览器测试访问
  31. http://IP:88/wordpress/

image_1cc07otuj10up35r1fl01b1v1dvg9.png-379.5kB

  1. 数据的主机填写lnmp_mysqldocker的构建的mysql的名字

image_1cc07sq5n1p7t58p9ducbitaum.png-253.3kB

五:docker 的网络

5.1: docker 的网络模式

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

  1. docker bridge 网络
  2. Docker 容器默认使用 bridge 模式的网络。其特点如下:
  3. 使用一个 linux bridge,默认为 docker0
  4. 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0
  5. 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair IP地址不在同一个网段内
  6. Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
  7. 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
  8. NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
  9. 容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信

image_1cc0986mt1spc801c77bc81s8q13.png-295.1kB

image_1cc09cthla941ht9kis274g5020.png-616.9kB

  1. host 模式
  2. docker run -tid --name centos_host1_test --net host centos_test
  3. 会与宿主机公用一个网络

image_1cc0bigkanb11bne17j12hs1uaqp.png-442.1kB

  1. none 模式
  2. docker run -tid --name centos1_none --net none centos_test
  3. 这个模式下面是单独的网络,没有IP 地址

image_1cc0bc9nk1noh1nn11jjpkdt1g457.png-291.3kB


5.2 容器网络访问原理

  1. Linux IP 信息包过滤原理:
  2. Docker主要通过netfilter/iptables实现网络通信。
  3. iptablesnetfilteriptables组成,netfilter组件是Linux内核集成的信息包过滤系统,它维护一个信息包过滤表,这个表用于控制信息包
  4. 过滤处理的规则集。而iptables只是一个在用户空间的工具,用于增删改查这个过滤表的规则。

image_1cc0bqivfen6jng16qk1iueltd26.png-197.8kB

5.4 容器网络访问原理

  1. 容器 访问外部
  2. # iptables -t nat -nL
  3. Chain POSTROUTING (policy ACCEPT)
  4. target prot opt source destination
  5. MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
  6. 外部 访问容器
  7. # iptables -t nat -nL
  8. Chain DOCKER (2 references)
  9. target prot opt source destination
  10. DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:88 to:172.18.0.2:80
  11. 创建一个容器:
  12. docker run -ti --name centos_test /bin/bash

image_1cc0c7j5k1hp91v891b8l1a8gunb2j.png-477.5kB
image_1cc0cc9k11sns1gq01rm6e9prhe30.png-99.2kB
image_1cc0cjkfego71mjbt6n10771bb64d.png-131.4kB

image_1cc0ckorocoten1cpv19fb1fi94q.png-376.1kB

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

  1. 临时网络
  2. # 网桥名称
  3. br_name=br0
  4. # 添加网桥
  5. brctl addbr $br_name
  6. # 给网桥设置IP
  7. ip addr add 192.168.0.211/24 dev $br_name
  8. # 删除已存在的eth0网卡配置
  9. ip addr del 192.168.0.211/24 dev eth0
  10. # 激活网桥
  11. ip link set $br_name up
  12. # 添加eth0到网桥
  13. brctl addif $br_name eth0
  14. # 添加路由
  15. ip route add default via 192.168.0.1 dev br0
  16. -----
  17. 还需要在Docker启动时桥接这个网桥:
  18. # vi /usr/lib/systemd/system/docker.service
  19. ExecStart=/usr/bin/dockerd -b=br0
  20. # systemctl restart docker

image_1cc0dv18j1pl19cg2e1a49f767.png-415.5kB

image_1cc0e4vsu1nen12pjhb0dccn9u6k.png-187.3kB


  1. 永久生效:
  2. # vi /etc/sysconfig/network-scripts/ifcfg-eth0
  3. DEVICE=eth0
  4. TYPE=Ethernet
  5. ONBOOT=yes
  6. BRIDGE=br0
  7. # vi /etc/sysconfig/network-scripts/ifcfg-br0
  8. DEVICE=br0
  9. TYPE=Bridge
  10. ONBOOT=yes
  11. BOOTPROTO=static
  12. IPADDR=192.168.0.211
  13. NETMASK=255.255.255.0
  14. GATEWAY=192.168.0.1
  15. DNS1=114.114.114.114

  1. 配置 固定 IP
  2. C_ID=$(docker run -itd --net=none ubuntu)
  3. C_PID=$(docker inspect -f '{{.State.Pid}}' $C_ID)
  4. # 创建network namespace目录并将容器的network namespace软连接到此目录,以便ip netns命令读取
  5. mkdir -p /var/run/netns
  6. ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID
  7. # 添加虚拟网卡veth+容器PID,类型是veth pair,名称是vp+容器PID
  8. ip link add veth$C_PID type veth peer name vp$C_PID
  9. # 添加虚拟网卡到br0网桥
  10. brctl addif br0 veth$C_PID
  11. # 激活虚拟网卡
  12. ip link set veth$C_PID up
  13. # 设置容器网络信息
  14. IP='192.168.0.123/24'
  15. GW='192.168.0.1'
  16. # 给进程配置一个network namespace
  17. ip link set vp$C_PID netns $C_PID
  18. # 在容器进程里面设置网卡信息
  19. ip netns exec $C_PID ip link set dev vp$C_PID name eth0
  20. ip netns exec $C_PID ip link set eth0 up
  21. ip netns exec $C_PID ip addr add $IP dev eth0
  22. ip netns exec $C_PID ip route add default via 192.168.1.1
  23. 这种方法一般不采用:
  1. 采取的方法:
  2. pipework 工具配置容器固定 IP
  3. git clone https://github.com/jpetazzo/pipework.git
  4. cp pipework/pipework /usr/local/bin/
  5. docker run -tid --name centos1_none --net none centos_test
  6. pipework br0 centos1_none 172.17.100.11/24@172.17.100.2
  7. 进入这个容器
  8. docker exec -ti e95dff5 bash
  9. 这个只是临时配置的,重启容器就丢了,docker 不建议这样做。

image_1cc0fppos1ip7oe6nno1ebl3mk9e.png-357kB

image_1cc0fm6mi189418b48tr1a60km271.png-518.8kB

image_1cc0fr6ekoq5152d1oj53hiu59r.png-574.2kB

六: dockerfile 构建

6.1 dockerfile的命令

image_1cc0ktgb81m3c1nft4le1lum13c5ao.png-526.6kB

6.2 docker的 build 命令

  1. Usage: docker image build [OPTIONS] PATH | URL | -
  2. Options:
  3. -t, --tag list # 镜像名称
  4. -f, --file string # 指定Dockerfile文件位置
  5. 示例:
  6. docker build .
  7. docker build -t shykes/myapp .
  8. docker build -t shykes/myapp -f /path/Dockerfile /path

6.3 构建一个PHP的站点

6.3.1 构建nginx的镜像

  1. FROM centos:7
  2. MAINTAINER www.aliangedu.com
  3. RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
  4. ADD nginx-1.12.1.tar.gz /tmp
  5. RUN cd /tmp/nginx-1.12.1 && \
  6. ./configure --prefix=/usr/local/nginx && \
  7. make -j 2 && \
  8. make install
  9. RUN rm -rf /tmp/nginx-1.12.1* && yum clean all
  10. COPY nginx.conf /usr/local/nginx/conf
  11. WORKDIR /usr/local/nginx
  12. EXPOSE 80
  13. CMD ["./sbin/nginx", "-g", "daemon off;"]
  14. ----
  15. 执行构建
  16. cd nginx/
  17. docker build -t nginx:v1 -f Dockerfile .

6.3.2 构建php的镜像

  1. FROM centos:7
  2. MAINTAINER www.aliangedu.com
  3. RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-
  4. devel libpng-devel openssl-devel
  5. ADD php-5.6.31.tar.gz /tmp/
  6. RUN cd /tmp/php-5.6.31 && \
  7. ./configure --prefix=/usr/local/php \
  8. --with-config-file-path=/usr/local/php/etc \
  9. --with-mysql --with-mysqli \
  10. --with-openssl --with-zlib --with-curl --with-gd \
  11. --with-jpeg-dir --with-png-dir --with-iconv \
  12. --enable-fpm --enable-zip --enable-mbstring && \
  13. make -j 4 && \
  14. make install && \
  15. cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
  16. sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
  17. sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
  18. COPY php.ini /usr/local/php/etc
  19. RUN rm -rf /tmp/php-5.6.31* && yum clean all
  20. WORKDIR /usr/local/php
  21. EXPOSE 9000
  22. CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]
  23. -----
  24. 执行构建命令
  25. cd /root/php/
  26. docker build -t php:v1 -f Dockerfile .

image_1cc0lb1g127k1eur1onuc6i195eb5.png-571kB

6.3.3 根据构建好的镜像创建容器

  1. 1 、自定义网络
  2. docker network create lnmp
  3. 2 2 、创建 PHP 容器
  4. docker run -itd \
  5. --name lnmp_php \
  6. --net lnmp \
  7. --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html \
  8. php:v1
  9. 3 3 、创建 Nginx 容器
  10. mkdir -p /app/wwwroot/
  11. docker run -itd \
  12. --name lnmp_nginx \
  13. -p 888:80 \
  14. --net lnmp \
  15. --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html \
  16. nginx:v1
  17. 4 4 、创建 MySQL 容器
  18. docker run -itd \
  19. --name lnmp_mysql \
  20. --net lnmp \
  21. -p 3306:3306 \
  22. --mount src=mysql-vol,dst=/var/lib/mysql \
  23. -e MYSQL_ROOT_PASSWORD=123456 \
  24. mysql --character-set-server=utf8

image_1cc0ljks3h76156scbrl1r19r5bi.png-503.1kB

image_1ccfgd62o1g7m15egt3ltvb1q839.png-312.7kB


6.3.4 构建tomcat的镜像

  1. FROM centos:7
  2. MAINTAINER www.aliangedu.com
  3. ADD jdk-8u45-linux-x64.tar.gz /usr/local
  4. ENV JAVA_HOME /usr/local/jdk1.8.0_45
  5. ADD apache-tomcat-8.0.46.tar.gz /usr/local
  6. COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
  7. RUN rm -f /usr/local/*.tar.gz
  8. WORKDIR /usr/local/apache-tomcat-8.0.46
  9. EXPOSE 8080
  10. ENTRYPOINT ["./bin/catalina.sh", "run"]
  11. -------------
  12. cd /root/tomcat/
  13. docker build -t tomcat:v1 -f Dockerfile .
  14. ------------
  15. 开启容器:
  16. mkdir -p /app/webapps/
  17. docker run -itd \
  18. --name=tomcat \
  19. -p 8080:8080 \
  20. --mount type=bind,src=/app/webapps/,dst=/usr/local/apache-tomcat-8.0.46/webapps \
  21. tomcat:v1
  22. cd /app/webapps/
  23. mkdir ROOT
  24. cd ROOT
  25. echo "hello world" >> index.html

image_1ccfgnhem10mktvl1ba3b1ovtqm.png-180.3kB

image_1ccfgusvr1tjkah1ovs1qeu14qi13.png-78.9kB

七: 构建私有仓库

7.1: docker 的私有仓库

  1. Docker Hub作为Docker默认官方公共镜像;如果想自己搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓库非常简单。
  2. 下载 registry 镜像并启动
  3. # docker pull registry
  4. # docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
  5. 测试 ,查看镜像仓库中所有镜像
  6. # curl http://172.17.100.11:5000/v2/_catalog
  7. {"repositories":[]}

image_1ccfhdkkr1i3r9b51pkd1rqc8431g.png-372.3kB

image_1ccfhea59p0d1qujq4uq641vrd1t.png-112.6kB

7.2 搭建私有镜像仓库

  1. 搭建私有镜像仓库
  2. 1 1 、配置 私有仓库可信任
  3. # vi /etc/docker/daemon.json
  4. {"insecure-registries":["172.17.100.11:5000"]}
  5. # systemctl restart docker
  6. 2 、打标签
  7. # docker tag centos7.0:v1 172.17.100.11:5000/centos7.0:v1
  8. 3 、上
  9. # docker push 172.17.100.11:5000/centos7.0
  10. 4 、下载
  11. # docker pull 172.17.100.11:5000/centos7.0
  12. 5 、列出 镜像标签
  13. # curl http://172.17.100.11:5000/v2/centos7.0/tags/list
  14. 私有镜像仓库管

image_1ccfmf1ba4sg1v2r1778psa1an52a.png-101.9kB

image_1ccfmgr86b2b1ehb4on1c8pejc2n.png-288.7kB

image_1ccfms37d1ejm1caf1v9t1tba1ut434.png-450.9kB

image_1ccfmsocrogo1nas19nh9721ko93h.png-78kB

7.3 Docker Hub公共镜像仓库使用

  1. 1 、注册账号
  2. https://hub.docker.com
  3. 2 、登录 Docker Hub
  4. # docker login
  5. # docker login --username=zhangyy --password=123456
  6. 3 、镜像打标签
  7. # docker tag wordpress:v1 zhangyy/wordpress:v1
  8. 4 、上传
  9. # docker push zhangyy/wordpress:v1
  10. 搜索测试:
  11. # docker search zhangyy
  12. 5 、下载
  13. # docker pull zhangyy/wordpress:v1

八: docker 的图形化 Portainer

  1. Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,可管理Docker主机或Swarm集群,支持最新版DockerSwarm模式。
  2. 1 1 、创建卷
  3. # docker volume create portainer_data
  4. 2 2 、创建P P ortainer 容器
  5. # docker run -d \
  6. -p 9000:9000 \
  7. -v /var/run/docker.sock:/var/run/docker.sock \
  8. -v portainer_data:/data \
  9. portainer/portainer

image_1ccfnmnnk7afh3jaf81145mld3u.png-186.8kB

image_1ccfo0ci6ovmsod68m1qoqrk04b.png-199.3kB

image_1ccfokvqn8v71fr71e4f1ok71e9m4o.png-451.2kB

九:构建容器监控系统

  1. 创建一个网络
  2. docker create network monitor
  3. Influxdb
  4. docker run -d \
  5. --name influxdb \
  6. --net monitor \
  7. -p 8083:8083 \
  8. -p 8086:8086 \
  9. tutum/influxdb
  10. cAdvisor
  11. docker run -d \
  12. --name=cadvisor \
  13. --net monitor \
  14. -p 8081:8080 \
  15. --mount type=bind,src=/,dst=/rootfs,ro \
  16. --mount type=bind,src=/var/run,dst=/var/run \
  17. --mount type=bind,src=/sys,dst=/sys,ro \
  18. --mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,ro \
  19. google/cadvisor \
  20. -storage_driver=influxdb \
  21. -storage_driver_db=cadvisor \
  22. -storage_driver_host=influxdb:8086
  23. Grafana
  24. docker run -d \
  25. --name grafana \
  26. --net monitor \
  27. -p 3000:3000 \
  28. grafana/grafana

image_1ccfs4o3d15kh12cd1kg11rli1f5g55.png-127.2kB

image_1ccfs62hm6st4ig1hfob072rp5i.png-234.3kB

image_1ccfs6nsr1sdrqer184q10dpvtd5v.png-544.6kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注