博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker容器技术1
阅读量:3941 次
发布时间:2019-05-24

本文共 44520 字,大约阅读时间需要 148 分钟。

什么是容器?

  • 容器技术是一种应用程序封装和交付的核心技术
  • 容器技术的核心由以下几个内核技术组成:
    (1)Cgroups(Control Groups):资源管理
    (2)NameSpace:进程隔离
    a. 主机名称隔离
    b. 网络隔离
    c. 文件系统隔离
    d. 用户隔离
    e. 进程隔离
    f. 进程信号向量隔离
    (3)SeLinux安全
  • 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速

什么是Docker

  • Docker是完整的一套容器管理系统
  • Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术

Docker与传统虚拟化方式:

两者的不同之处如下面2张图所示,传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

![在这里插入图片描述]( 什么是容器?

  • 容器技术是一种应用程序封装和交付的核心技术
  • 容器技术的核心由以下几个内核技术组成:
    (1)Cgroups(Control Groups):资源管理
    (2)NameSpace:进程隔离
    a. 主机名称隔离
    b. 网络隔离
    c. 文件系统隔离
    d. 用户隔离
    e. 进程隔离
    f. 进程信号向量隔离
    (3)SeLinux安全
  • 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速

什么是Docker

  • Docker是完整的一套容器管理系统
  • Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术

Docker与传统虚拟化方式:

两者的不同之处如下面2张图所示,传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

在这里插入图片描述
在这里插入图片描述
Docker对比传统虚拟机总结
在这里插入图片描述

Docker优点

  • 更高效利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的应用迁移
  • 更轻松的维护和扩展

Docker缺点

  • 容器隔离性没有虚拟化强
  • 共用Linux内核,安全性有先天缺陷
  • SELinux难以驾驭
  • 监控容器和容器排错是挑战

Docker部署

准备两台虚拟机(docker01:192.168.8.11,docker02:192.168.8.12),能访问外网

1、安装前准备

[root@docker01 ~]# vim /etc/hosts		//以docker01为例。下同#添加以下两行192.168.8.11 docker01192.168.8.12 docker02[root@docker01 ~]# vim /etc/yum.repos.d/dvd.repoCentos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[Docker]name=Centos7.4baseurl=ftp://192.168.8.254/docker/enabled=1gpgcheck=0

2、安装并启动docker

[root@docker01 ~]# yum list |grep dockerdocker-engine.x86_64                   1.12.1-1.el7.centos             @Docker  docker-engine-selinux.noarch           1.12.1-1.el7.centos             @Docker[root@docker01 ~]# yum -y install docker-engine[root@docker01 ~]# systemctl start docker[root@docker01 ~]# systemctl enable docker[root@docker01 ~]# ifconfig docker0		//docker启动后会生成一个虚拟交换机docker0docker0: flags=4099
mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0

镜像

  • 在Docker中容器是基于镜像启动的
  • 镜像是启动容器的核心
  • 镜像采用分层技术
  • 使用快照的cow技术,确保底层数据不丢失

镜像常用命令

[root@docker01 ~]# docker images								//查看镜像[root@docker01 ~]# docker history busybox						//查看镜像制作历史(层次结构)[root@docker01 ~]# docker inspect centos:latest					//查看镜像底层信息[root@docker01 ~]# docker pull	centos							//下载镜像[root@docker01 ~]# docker push centos							//上传镜像[root@docker01 ~]# docker save busybox:latest > busybox.tar		//镜像另存为tar包[root@docker02 ~]# docker load < busybox.tar					//使用tar包导入镜像[root@docker01 ~]# docker search busybox						//搜索镜像[root@docker01 ~]# docker tag centos:latest centos:lx			//修改镜像名称和标签[root@docker01 ~]# docker rmi centos:lx							//删除本地镜像

镜像命令实践

############################################################################[root@docker01 ~]# man docker search		//查看docker相应命令帮助文件############################################################################[root@docker01 ~]# docker images		//查看docker镜像,初始镜像为空REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE[root@docker01 ~]# docker search mysql		//搜索mysql网络镜像NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED		//OFFICIAL值为ok时表示为官方镜像mysql                             MySQL is a widely used, open-source relati...   8196      [OK]       mariadb                           MariaDB is a community-developed fork of M...   2791      [OK]       mysql/mysql-server                Optimized MySQL Server Docker images. Crea...   610                  [OK]percona                           Percona Server is a fork of the MySQL rela...   434       [OK]       centurylink/mysql                 Image containing mysql. Optimized to be li...   60                   [OK][root@docker01 ~]# docker search busybox		//搜索busybox网络镜像NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDbusybox                  Busybox base image.                             1589      [OK]       progrium/busybox                                                         69                   [OK]radial/busyboxplus       Full-chain, Internet enabled, busybox made...   24                   [OK][root@docker01 ~]# docker pull busybox		//下载busybox网络镜像Using default tag: latestlatest: Pulling from library/busybox53071b97a884: Pull complete Digest: sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3dStatus: Downloaded newer image for busybox:latest[root@docker01 ~]# docker images		//查看下载镜像REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MB[root@docker01 ~]# ls[root@docker01 ~]# docker save busybox:latest > busybox.tar		//备份docker镜像[root@docker01 ~]# lsbusybox.tar[root@docker01 ~]# scp busybox.tar 192.168.8.12:/root[root@docker02 ~]# docker load < busybox.tar		//恢复镜像d1156b98822d: Loading layer [==================================================>] 1.416 MB/1.416 MBLoaded image: busybox:latest[root@docker02 ~]# docker images		REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MB[root@docker01 ~]# cd docker_images/[root@docker01 docker_images]# lscentos.tar  nginx.tar  redis.tar  registry.tar  ubuntu.tar[root@docker01 docker_images]# for i in *;do docker load -i ${i};done		//导入已下载镜像,docker02主机同样操作[root@docker01 docker_images]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MBubuntu              latest              452a96d81c30        13 months ago       79.62 MBcentos              latest              e934aafc2206        13 months ago       198.6 MBregistry            latest              d1fd7d86a825        16 months ago       33.26 MBnginx               latest              a5311a310510        2 years ago         181.4 MBredis               latest              1aa84b1b434e        2 years ago         182.8 MB

容器常用命令

[root@docker01 ~]# docker run -itd nginx:latest		//运行容器,-itd(选项分别表示交互式、运行后开启终端、后台运行)[root@docker01 ~]# docker run -it centos			//运行容器后进入容器[root@f26819924bcf /]# exit		//退出容器,容器自动关闭(注:ctrl+p+q可以实现退出时不关闭容器)[root@docker01 ~]# docker attach 4fcdae128d1e		//进入运行中的容器(前提是容器默认启动命令支持交互如/bin/bash,exit时关闭容器,常用容器排错)[root@docker01 ~]# docker exec -it 4888e01da6b1 /bin/bash	//进入运行中的容器(exit不会关闭容器,常用于容器维护)[root@docker01 ~]# docker ps						//查看启动容器[root@docker01 ~]# docker ps -a						//查看启动过的容器[root@docker01 ~]# docker ps -aq					//查看启动过的容器ID[root@docker01 ~]# docker stop 1cf8349b9de0		    //关闭容器[root@docker01 ~]# docker start 1cf8349b9de0		//启动容器[root@docker01 ~]# docker restart 1cf8349b9de0		//重启容器[root@docker01 ~]# docker inspect 1cf8349b9de0		//查看容器底层信息[root@docker01 ~]# docker top 1cf8349b9de0		    //查看容器进程列表[root@docker01 ~]# docker rm 1cf8349b9de0			//删除容器(需在关闭容器后执行,否则会报错)[root@docker01 ~]# docker rm $(docker stop eec00f87a111)		//删除正在运行的容器[root@docker01 ~]# for i in `docker ps -aq`; do docker rm $i;done		//批量删除启动过的容器[root@docker01 ~]# docker rm $(docker ps -aq)		//批量删除启动过的容器

启动容器

[root@docker01 ~]# docker run -it centos:latest /bin/bash		//启动容器centos[root@eac031d4b130 /]# hostname		//启动容器后主机名隔离eac031d4b130[root@eac031d4b130 yum.repos.d]# ifconfig		//容器中无config命令,配置yum安装bash: ifconfig: command not found[root@eac031d4b130 /]# cd /etc/yum.repos.d/[root@eac031d4b130 yum.repos.d]# lsCentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Sources.repo  CentOS-fasttrack.repoCentOS-CR.repo    CentOS-Media.repo      CentOS-Vault.repo[root@eac031d4b130 yum.repos.d]# rm -rf *[root@eac031d4b130 yum.repos.d]# vi /etc/yum.repos.d/dvd.repo[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@eac031d4b130 yum.repos.d]# yum provides ifconfig		//查看ifconfig命令安装包Loaded plugins: fastestmirror, ovlCentos                                                                                       | 4.1 kB  00:00:00     (1/2): Centos/group_gz                                                                       | 137 kB  00:00:00     (2/2): Centos/primary_db                                                                     | 4.0 MB  00:00:00     Determining fastest mirrorsCentos/filelists_db                                                                          | 3.4 MB  00:00:00     net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking toolsRepo        : CentosMatched from:Filename    : /sbin/ifconfig[root@eac031d4b130 yum.repos.d]# yum -y install net-tools		//安装ifconfig命令安装包[root@eac031d4b130 yum.repos.d]# ifconfig		eth0: flags=4163
mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 //启动容器后网络隔离[root@docker01 ~]# ifconfig //对比容器网络docker0: flags=4163
mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0[root@eac031d4b130 /]# ls /anaconda-post.log bin dev etc home lib lib64 //启动容器后文件系统隔离media mnt opt proc root run sbin srv sys tmp usr var[root@docker01 ~]# ls / //对比容器根目录bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var[root@eac031d4b130 /]# pstree //启动容器后进程信息向量隔离bash---pstree[root@docker01 ~]# pstree //对比容器进程信息向量[root@eac031d4b130 /]# cat /etc/passwd //启动容器后用户隔离[root@docker01 ~]# cat /etc/passwd //对比容器用户##############################################################################[root@docker01 ~]# docker run -it busybox:latest /bin/bash //busybox容器中无/bin/bash命令,启动容器失败[root@docker01 ~]# docker run -it busybox:latest /bin/sh //busybox容器中默认启动命令为/bin/sh[root@docker01 ~]# docker run -it centos:latest //按默认启动命令启动centos容器[root@40f027323b25 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 13:14 ? 00:00:00 /bin/bash //centos容器中默认启动命令为/bin/bashroot 13 1 0 13:14 ? 00:00:00 ps -ef[root@docker01 ~]# docker ps //开启另一个终端,查看启动的容器

启动一个centos容器,安装apache,设置默认首页为hello world!

[root@docker01 ~]# docker run -it centos[root@f3a71d377ef0 ~]# vi /etc/yum.repos.d/dvd.repo[rhel7]name=rhel7baseurl=ftp://192.168.8.254/rhel7enabled=1gpgcheck=0[root@f3a71d377ef0 ~]# yum -y install httpd vim[root@f3a71d377ef0 ~]# cd /var/www/html/[root@f3a71d377ef0 html]# vim index.htmlhello world![root@f3a71d377ef0 html]# systemctl start httpd		//容器中无systemd命令,启动httpd报错[root@f3a71d377ef0 html]# cat /usr/lib/systemd/system/httpd.service		//查看手动启动httpd命令...[Service]Type=notifyEnvironmentFile=/etc/sysconfig/httpdExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND...[root@f3a71d377ef0 html]# /usr/sbin/httpd $OPTIONS -DFOREGROUND		//手动启动centos容器中的httpd服务[root@docker01 ~]# curl 172.17.0.2		//宿主机访问centos容器httpd服务hello world!

启动一个nginx容器

[root@docker01 ~]# docker run -itd nginx[root@docker01 ~]# docker ps		//查看nginx容器id[root@docker01 ~]# docker exec -it 77eda1ebcb2f /bin/bash		//进入nginx容器root@77eda1ebcb2f:/# cat /etc/debian_version 8.6++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++               Redhat系统          Debian系统----------------------------------------------   包管理命令       rpm                dpkg   包安装命令       yum	            apt-get++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[root@f3a71d377ef0 /]# rpm -qa | grep httpd		//查看httpd安装包root@77eda1ebcb2f:/# dpkg -l | grep nginx		//查看nginx安装包[root@f3a71d377ef0 /]# rpm -ql httpd			//查看httpd安装路径root@77eda1ebcb2f:/# dpkg -L nginx				//查看nginx安装路径[root@f3a71d377ef0 /]# rpm -qf /bin/ls			//查看ls命令安装包root@77eda1ebcb2f:/# dpkg -S /bin/ls			//查看ls命令安装包

commit创建镜像

  • 使用镜像启动容器,在该容器基础上修改后另存为一个新镜像
[root@docker01 ~]# docker rm $(docker stop $(docker ps -aq))		//删除所有容器[root@docker01 ~]# docker run -it centos		//启动容器[root@1a762df67c60 /]# cd /etc/yum.repos.d/		[root@1a762df67c60 yum.repos.d]# rm -f *[root@1a762df67c60 yum.repos.d]# vi dvd.repo		//配置yum[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@1a762df67c60 yum.repos.d]# yum -y install vim net-tools psmisc iproute		//安装常用软件包[root@1a762df67c60 ~]# exit		//退出centos容器[root@docker01 ~]# docker commit 1a762df67c60 mycentos:latest		//将修改后的centos容器另存为新镜像mycentos[root@docker01 ~]# docker history mycentos:latest		//查看镜像mycentos的制作过程[root@docker01 ~]# docker run -it mycentos		//启动mycentos容器,测试yum、ifconfig、vim等命令

dockerfile语法格式:

— FROM:基础镜像

— MAINTAINER:镜像创建者信息
— EXPOSE:开放的端口
— ENV: 设置变量
— ADD:复制文件到镜像
— RUN:制作镜像时执行的命令,可以有多个
— WORKDIR:定义容器默认工作目录
— CMD:容器启动时执行的命令,仅可以有一条CMD

dockerfile制作镜像

[root@docker01 ~]# mkdir aaa				//创建任意目录[root@docker01 ~]# cd aaa/					[root@docker01 aaa]# vim yum.repo[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@docker01 aaa]# touch Dockerfile		//固定格式[root@docker01 aaa]# vim DockerfileFROM centos:latest		//基于centos镜像RUN rm -f /etc/yum.repos.d/*.repo		ADD yum.repo /etc/yum.repos.d/yum.repoRUN yum -y install vim net-tools psmisc iproute[root@docker01 aaa]# lsDockerfile  yum.repo[root@docker01 aaa]# docker build -t test:latest .		//创建镜像(“.”表示上下文目录)[root@docker01 aaa]# docker images		//查看创建的镜像REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEtest                latest              6fb46839a1fc        24 minutes ago      302.8 MBmycentos            latest              203271180188        About an hour ago   302.8 MBbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MBubuntu              latest              452a96d81c30        13 months ago       79.62 MBcentos              latest              e934aafc2206        13 months ago       198.6 MBregistry            latest              d1fd7d86a825        16 months ago       33.26 MBnginx               latest              a5311a310510        2 years ago         181.4 MBredis               latest              1aa84b1b434e        2 years ago         182.8 MB[root@docker01 aaa]# docker history test:latest 		//查看镜像test的制作过程IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT6fb46839a1fc        25 minutes ago      /bin/sh -c yum -y install vim net-tools psmis   104.1 MB            6c36ec3b9f4f        26 minutes ago      /bin/sh -c #(nop) ADD file:4003eb1511235a4fde   80 B                f81a50ced8ca        26 minutes ago      /bin/sh -c rm -f /etc/yum.repos.d/*.repo        0 B                 e934aafc2206        13 months ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
13 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
13 months ago /bin/sh -c #(nop) ADD file:f755805244a649ecca 198.6 MB[root@docker01 aaa]# docker run -it test //启动一个test容器,测试yum、ifconfig、vim等命令#############################################################################制作默认启动python镜像[root@docker01 aaa]# rm -f yum.repo [root@docker01 aaa]# lsDockerfile[root@docker01 aaa]# vim DockerfileFROM mycentos:latest //基于mycentos镜像CMD ["/usr/bin/python"] //定义默认启动命令[root@docker01 aaa]# docker build -t mycentos:python . //创建镜像mycentos:python[root@docker01 aaa]# docker run -it mycentos:python //启动一个mycentos:python容器Python 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> //启动容器后默认进入python#############################################################################制作一个默认启动sshd服务镜像[root@docker01 aaa]# cd[root@docker01 ~]# mkdir bbb[root@docker01 ~]# cd bbb/[root@docker01 bbb]# touch Dockerfile[root@docker01 bbb]# vim DockerfileFROM mycentos:latestRUN yum -y install openssh-server initscriptsRUN sshd-keygenRUN echo "123456" | passwd --stdin rootENV EnvironmentFile=/etc/sysconfig/sshd //设置环境变量EXPOSE 22 //开放22端口CMD ["/usr/sbin/sshd", "-D"] //定义默认启动命令sshd[root@docker01 bbb]# docker build -t mycentos:sshd .[root@docker01 bbb]# docker run -itd mycentos:sshd //启动一个mycentos:sshd容器,直接进入ssh连接###############################################################################制作一个默认启动httpd服务,首页为hello world!!!的镜像[root@docker01 ~]# mkdir ccc[root@docker01 ccc]# touch Dockerfile[root@docker01 ccc]# vim DockerfileFROM mycentos:latestRUN yum -y install httpdWORKDIR /var/www/html/ADD index.html index.htmlENV EnvironmentFile=/etc/sysconfig/httpdEXPOSE 80EXPOSE 443CMD ["/usr/sbin/httpd", "-DFOREGROUND"][root@docker01 ccc]# docker build -t mycentos:httpd . //创建镜像[root@docker01 ccc]# docker run -itd mycentos:httpd //启动容器[root@docker01 ~]# curl 172.17.0.2 //宿主机访问首页hello world!!![root@docker01 ~]# docker inspect -f "{
{.NetworkSettings.IPAddress}}" 65d09cc43858 //查看启动容器ip172.17.0.2[root@docker01 ~]# docker inspect -f "{
{.State.Pid}}" 65d09cc43858 //查看启动容器的进程id23611

创建私有镜像仓库

  • registry:共享镜像的一台服务器

镜像、容器、镜像仓库的工作流程如下图所示。

在这里插入图片描述

#配置服务端[root@docker01 ~]# vim /etc/docker/daemon.json		//创建配置文件{    "insecure-registries": ["192.168.8.11:5000"]		//将宿主机作为私有镜像仓库服务器,默认端口5000}[root@docker01 ~]# systemctl restart docker		//重启docker服务[root@docker01 ~]# docker run -itd -p 5000:5000 registry		//启动私有仓库[root@docker01 ~]# curl http://192.168.8.11:5000/v2/		//验证私有仓库,初始为空{}[root@docker01 ~]# docker tag busybox:latest 192.168.8.11:5000/busybox:latest		//上传镜像前打标签[root@docker01 ~]# docker push 192.168.8.11:5000/busybox:latest		//上传镜像[root@docker01 ~]# for i in python sshd httpd;> do docker tag mycentos:${i} 192.168.8.11:5000/mycentos:${i}> docker push 192.168.8.11:5000/mdaycentos:${i}^C[root@docker01 ~]# for i in latest python sshd httpd;do		//继续上传其他镜像> docker tag mycentos:${i} 192.168.8.11:5000/mycentos:${i}> docker push 192.168.8.11:5000/mycentos:${i}> docker rmi 192.168.8.11:5000/mycentos:${i}> done#配置客户端[root@docker02 ~]# vim /etc/docker/daemon.json		//配置客户端docker02{    "insecure-registries": ["192.168.8.11:5000"]}[root@docker02 ~]# systemctl restart docker[root@docker02 ~]# docker run -it 192.168.8.11:5000/mycentos:latest		//客户端通过远程镜像仓库启动容器[root@docker02 ~]# curl http://192.168.8.11:5000/v2/_catalog		//查看仓库中的镜像{"repositories":["busybox","mycentos"]}[root@docker02 ~]# curl http://192.168.8.11:5000/v2/mycentos/tags/list		//查看某一镜像的所有标签{"name":"mycentos","tags":["latest","python","sshd","httpd"]}

卷的概念

  • docker容器不保持任何数据
  • 重要数据需要使用外部卷存储(数据持久化)
  • 容器可以挂载真实机目录或共享存储为卷

主机卷的映射

  • 将真实机目录挂载到容器提供数据持久化存储

共享存储

  • 一台共享存储服务器(如NFS)可以提供给所有Docker主机使用

1、搭建一个NFS服务器,创建共享目录

2、docker01挂载nfs服务器共享目录,在doker01上启动nginx容器,将挂载的共享目录映射给容器
3、docker02挂载nfs服务器共享目录,在doker02上启动apache容器,将挂载的共享目录映射给容器

#创建NFS服务器(nfs99:192.168.8.99)[root@nfs99 ~]# yum -y install nfs-utils[root@nfs99 ~]# vim /etc/exports/var/webpublic    *(rw)		//配置所有主机对nfs服务器共享目录/var/webpublic均有读写权限[root@nfs99 ~]# mkdir /var/webpublic[root@nfs99 ~]# chmod 777 /var/webpublic/[root@nfs99 ~]# systemctl start nfs[root@nfs99 ~]# systemctl enable nfs#docker主机挂载nfs共享目录(以docker01主机为例)[root@docker01 ~]# yum -y install nfs-utils[root@docker01 ~]# showmount -e 192.168.8.99		//查看nfs服务器共享目录Export list for 192.168.8.99:/var/webpublic *[root@docker01 ~]# mkdir /var/webroot[root@docker01 ~]# mount -t nfs 192.168.8.99:/var/webpublic /var/webroot		//将本机/var/webroot挂载至nfs共享目录[root@docker01 webroot]# vim /etc/fstab/dev/vda1 /                       xfs     defaults        0 0192.168.8.99:/var/webpublic /var/webroot nfs defaults,_netdev 0 0		//设置开机自动挂载[root@docker01 ~]# cd /var/webroot/[root@docker01 webroot]# vim index.htmlhello world!!!#映射nfs共享目录至docker容器[root@docker01 ~]# docker run -it nginx /bin/bashroot@485fa8e0f189:/# nginx -T		//查看nginx配置文件...location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }...root@485fa8e0f189:/# exit[root@docker01 ~]# docker run -itd -v /var/webroot/:/usr/share/nginx/html nginx		//启动nginx容器,映射挂载的共享目录至nginx根目录[root@docker01 ~]# docker ps[root@docker01 ~]# docker inspect d697eb5d74fe		//查看容器ip[root@docker01 ~]# curl 172.17.0.2		//访问nginx容器首页hello world!!![root@docker02 webroot]# docker run -itd -v /var/webroot/:/var/www/html 192.168.8.11:5000/mycentos:httpd		//docker02主机通过远程镜像仓库启动apache容器,并映射挂载的共享目录至apache根目录[root@docker02 webroot]# curl 172.17.0.2		//访问apache首页hello world!!!		//内容与docker01主机的nginx容器首页一致#############################################################################[root@docker01 webroot]# vim index.html		//docker01主机修改首页hello world!!!Nice to meet you![root@docker01 webroot]# curl 172.17.0.2		//docker01主机再次访问nginx容器首页hello world!!!Nice to meet you![root@docker02 webroot]# curl 172.17.0.2		//docker02主机再次访问apache容器首页hello world!!!Nice to meet you!

Docker网络模型

[root@docker01 ~]# docker network list		//查看docker创建的默认网络模型NETWORK ID          NAME                DRIVER              SCOPEf42c63f0a299        bridge              bridge              local               0c34442f9fbc        host                host                local               6a11eddd8c46        none                null                local[root@docker01 ~]# docker network create --subnet=10.10.10.0/24 docker1		//创建虚拟网桥docker1,指定子网为10.10.10.0/24[root@docker01 ~]# docker network listNETWORK ID          NAME                DRIVER              SCOPEf42c63f0a299        bridge              bridge              local               75922336526a        docker1             bridge              local               0c34442f9fbc        host                host                local               6a11eddd8c46        none                null                local [root@docker01 ~]# docker run -it busybox		//启动busybox容器1,默认连接虚拟交换机docker0[root@docker01 ~]# docker run -it busybox		//启动busybox容器2,默认连接虚拟交换机docker0[root@docker01 ~]# docker run -it --network=docker1 busybox		//启动busybox容器3,指定连接虚拟交换机docker1[root@docker01 ~]# docker run -it --network=docker1 busybox		//启动busybox容器4,指定连接虚拟交换机docker1#测试ping命令,容器1、2可相互ping通,容器3、4可以相互ping通,容器1、2与容器3、4无法ping通

客户端访问容器内资源

  • 默认容器通过SNAT可以访问外网
  • 但是外部网络的主机不可以访问容器内的资源
  • 使用端口映射可以实现外部网络访问容器内的资源
[root@docker01 ~]# docker run -itd -p 80:80 mycentos:httpd		//通过端口映射启动一个httpd容器[root@room9pc01 ~]# curl http://192.168.8.11/		//客户端访问容器httpd服务hello world!!!#############################################################################[root@docker01 ~]# docker stop 78e97a2f82b8		//关闭以上httpd容器[root@docker01 ~]# docker run -itd -p 80:80 nginx		//通过端口映射启动一个nginx容器[root@room9pc01 ~]# curl http://192.168.8.11/		//客户端访问容器nginx服务Welcome to nginx!...############################################################################[root@docker01 ~]# docker run -itd -p 3306:3306 mycentos:mysqld		//通过端口映射启动一个mysqld容器[root@docker01 ~]# docker exec -it 89af33392156 /bin/bash		//进入mysqld容器[root@89af33392156 /]# mysqlMariaDB [mysql]> use mysqlMariaDB [mysql]> update user set Host='%' where User='root';		//修改所有人(%)权限MariaDB [mysql]> flush privileges;		//刷新权限[root@room9pc01 ~]# mysql -uroot -h192.168.8.11		//客户端访问mysqld容器数据库MariaDB [(none)]>

/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXhlMTk5MA==,size_16,color_FFFFFF,t_70)

在这里插入图片描述
Docker对比传统虚拟机总结
在这里插入图片描述

Docker优点

  • 更高效利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的应用迁移
  • 更轻松的维护和扩展

Docker缺点

  • 容器隔离性没有虚拟化强
  • 共用Linux内核,安全性有先天缺陷
  • SELinux难以驾驭
  • 监控容器和容器排错是挑战

Docker部署

准备两台虚拟机(docker01:192.168.8.11,docker02:192.168.8.12),能访问外网

1、安装前准备

[root@docker01 ~]# vim /etc/hosts		//以docker01为例。下同#添加以下两行192.168.8.11 docker01192.168.8.12 docker02[root@docker01 ~]# vim /etc/yum.repos.d/dvd.repoCentos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[Docker]name=Centos7.4baseurl=ftp://192.168.8.254/docker/enabled=1gpgcheck=0

2、安装并启动docker

[root@docker01 ~]# yum list |grep dockerdocker-engine.x86_64                   1.12.1-1.el7.centos             @Docker  docker-engine-selinux.noarch           1.12.1-1.el7.centos             @Docker[root@docker01 ~]# yum -y install docker-engine[root@docker01 ~]# systemctl start docker[root@docker01 ~]# systemctl enable docker[root@docker01 ~]# ifconfig docker0		//docker启动后会生成一个虚拟交换机docker0docker0: flags=4099
mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0

镜像

  • 在Docker中容器是基于镜像启动的
  • 镜像是启动容器的核心
  • 镜像采用分层技术
  • 使用快照的cow技术,确保底层数据不丢失

镜像常用命令

[root@docker01 ~]# docker images								//查看镜像[root@docker01 ~]# docker history busybox						//查看镜像制作历史(层次结构)[root@docker01 ~]# docker inspect centos:latest					//查看镜像底层信息[root@docker01 ~]# docker pull	centos							//下载镜像[root@docker01 ~]# docker push centos							//上传镜像[root@docker01 ~]# docker save busybox:latest > busybox.tar		//镜像另存为tar包[root@docker02 ~]# docker load < busybox.tar					//使用tar包导入镜像[root@docker01 ~]# docker search busybox						//搜索镜像[root@docker01 ~]# docker tag centos:latest centos:lx			//修改镜像名称和标签[root@docker01 ~]# docker rmi centos:lx							//删除本地镜像

镜像命令实践

############################################################################[root@docker01 ~]# man docker search		//查看docker相应命令帮助文件############################################################################[root@docker01 ~]# docker images		//查看docker镜像,初始镜像为空REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE[root@docker01 ~]# docker search mysql		//搜索mysql网络镜像NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED		//OFFICIAL值为ok时表示为官方镜像mysql                             MySQL is a widely used, open-source relati...   8196      [OK]       mariadb                           MariaDB is a community-developed fork of M...   2791      [OK]       mysql/mysql-server                Optimized MySQL Server Docker images. Crea...   610                  [OK]percona                           Percona Server is a fork of the MySQL rela...   434       [OK]       centurylink/mysql                 Image containing mysql. Optimized to be li...   60                   [OK][root@docker01 ~]# docker search busybox		//搜索busybox网络镜像NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDbusybox                  Busybox base image.                             1589      [OK]       progrium/busybox                                                         69                   [OK]radial/busyboxplus       Full-chain, Internet enabled, busybox made...   24                   [OK][root@docker01 ~]# docker pull busybox		//下载busybox网络镜像Using default tag: latestlatest: Pulling from library/busybox53071b97a884: Pull complete Digest: sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3dStatus: Downloaded newer image for busybox:latest[root@docker01 ~]# docker images		//查看下载镜像REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MB[root@docker01 ~]# ls[root@docker01 ~]# docker save busybox:latest > busybox.tar		//备份docker镜像[root@docker01 ~]# lsbusybox.tar[root@docker01 ~]# scp busybox.tar 192.168.8.12:/root[root@docker02 ~]# docker load < busybox.tar		//恢复镜像d1156b98822d: Loading layer [==================================================>] 1.416 MB/1.416 MBLoaded image: busybox:latest[root@docker02 ~]# docker images		REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MB[root@docker01 ~]# cd docker_images/[root@docker01 docker_images]# lscentos.tar  nginx.tar  redis.tar  registry.tar  ubuntu.tar[root@docker01 docker_images]# for i in *;do docker load -i ${i};done		//导入已下载镜像,docker02主机同样操作[root@docker01 docker_images]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MBubuntu              latest              452a96d81c30        13 months ago       79.62 MBcentos              latest              e934aafc2206        13 months ago       198.6 MBregistry            latest              d1fd7d86a825        16 months ago       33.26 MBnginx               latest              a5311a310510        2 years ago         181.4 MBredis               latest              1aa84b1b434e        2 years ago         182.8 MB

容器常用命令

[root@docker01 ~]# docker run -itd nginx:latest		//运行容器,-itd(选项分别表示交互式、运行后开启终端、后台运行)[root@docker01 ~]# docker run -it centos			//运行容器后进入容器[root@f26819924bcf /]# exit		//退出容器,容器自动关闭(注:ctrl+p+q可以实现退出时不关闭容器)[root@docker01 ~]# docker attach 4fcdae128d1e		//进入运行中的容器(前提是容器默认启动命令支持交互如/bin/bash,exit时关闭容器,常用容器排错)[root@docker01 ~]# docker exec -it 4888e01da6b1 /bin/bash	//进入运行中的容器(exit不会关闭容器,常用于容器维护)[root@docker01 ~]# docker ps						//查看启动容器[root@docker01 ~]# docker ps -a						//查看启动过的容器[root@docker01 ~]# docker ps -aq					//查看启动过的容器ID[root@docker01 ~]# docker stop 1cf8349b9de0		    //关闭容器[root@docker01 ~]# docker start 1cf8349b9de0		//启动容器[root@docker01 ~]# docker restart 1cf8349b9de0		//重启容器[root@docker01 ~]# docker inspect 1cf8349b9de0		//查看容器底层信息[root@docker01 ~]# docker top 1cf8349b9de0		    //查看容器进程列表[root@docker01 ~]# docker rm 1cf8349b9de0			//删除容器(需在关闭容器后执行,否则会报错)[root@docker01 ~]# docker rm $(docker stop eec00f87a111)		//删除正在运行的容器[root@docker01 ~]# for i in `docker ps -aq`; do docker rm $i;done		//批量删除启动过的容器[root@docker01 ~]# docker rm $(docker ps -aq)		//批量删除启动过的容器

启动容器

[root@docker01 ~]# docker run -it centos:latest /bin/bash		//启动容器centos[root@eac031d4b130 /]# hostname		//启动容器后主机名隔离eac031d4b130[root@eac031d4b130 yum.repos.d]# ifconfig		//容器中无config命令,配置yum安装bash: ifconfig: command not found[root@eac031d4b130 /]# cd /etc/yum.repos.d/[root@eac031d4b130 yum.repos.d]# lsCentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Sources.repo  CentOS-fasttrack.repoCentOS-CR.repo    CentOS-Media.repo      CentOS-Vault.repo[root@eac031d4b130 yum.repos.d]# rm -rf *[root@eac031d4b130 yum.repos.d]# vi /etc/yum.repos.d/dvd.repo[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@eac031d4b130 yum.repos.d]# yum provides ifconfig		//查看ifconfig命令安装包Loaded plugins: fastestmirror, ovlCentos                                                                                       | 4.1 kB  00:00:00     (1/2): Centos/group_gz                                                                       | 137 kB  00:00:00     (2/2): Centos/primary_db                                                                     | 4.0 MB  00:00:00     Determining fastest mirrorsCentos/filelists_db                                                                          | 3.4 MB  00:00:00     net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking toolsRepo        : CentosMatched from:Filename    : /sbin/ifconfig[root@eac031d4b130 yum.repos.d]# yum -y install net-tools		//安装ifconfig命令安装包[root@eac031d4b130 yum.repos.d]# ifconfig		eth0: flags=4163
mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 //启动容器后网络隔离[root@docker01 ~]# ifconfig //对比容器网络docker0: flags=4163
mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0[root@eac031d4b130 /]# ls /anaconda-post.log bin dev etc home lib lib64 //启动容器后文件系统隔离media mnt opt proc root run sbin srv sys tmp usr var[root@docker01 ~]# ls / //对比容器根目录bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var[root@eac031d4b130 /]# pstree //启动容器后进程信息向量隔离bash---pstree[root@docker01 ~]# pstree //对比容器进程信息向量[root@eac031d4b130 /]# cat /etc/passwd //启动容器后用户隔离[root@docker01 ~]# cat /etc/passwd //对比容器用户##############################################################################[root@docker01 ~]# docker run -it busybox:latest /bin/bash //busybox容器中无/bin/bash命令,启动容器失败[root@docker01 ~]# docker run -it busybox:latest /bin/sh //busybox容器中默认启动命令为/bin/sh[root@docker01 ~]# docker run -it centos:latest //按默认启动命令启动centos容器[root@40f027323b25 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 13:14 ? 00:00:00 /bin/bash //centos容器中默认启动命令为/bin/bashroot 13 1 0 13:14 ? 00:00:00 ps -ef[root@docker01 ~]# docker ps //开启另一个终端,查看启动的容器

启动一个centos容器,安装apache,设置默认首页为hello world!

[root@docker01 ~]# docker run -it centos[root@f3a71d377ef0 ~]# vi /etc/yum.repos.d/dvd.repo[rhel7]name=rhel7baseurl=ftp://192.168.8.254/rhel7enabled=1gpgcheck=0[root@f3a71d377ef0 ~]# yum -y install httpd vim[root@f3a71d377ef0 ~]# cd /var/www/html/[root@f3a71d377ef0 html]# vim index.htmlhello world![root@f3a71d377ef0 html]# systemctl start httpd		//容器中无systemd命令,启动httpd报错[root@f3a71d377ef0 html]# cat /usr/lib/systemd/system/httpd.service		//查看手动启动httpd命令...[Service]Type=notifyEnvironmentFile=/etc/sysconfig/httpdExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND...[root@f3a71d377ef0 html]# /usr/sbin/httpd $OPTIONS -DFOREGROUND		//手动启动centos容器中的httpd服务[root@docker01 ~]# curl 172.17.0.2		//宿主机访问centos容器httpd服务hello world!

启动一个nginx容器

[root@docker01 ~]# docker run -itd nginx[root@docker01 ~]# docker ps		//查看nginx容器id[root@docker01 ~]# docker exec -it 77eda1ebcb2f /bin/bash		//进入nginx容器root@77eda1ebcb2f:/# cat /etc/debian_version 8.6++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++               Redhat系统          Debian系统----------------------------------------------   包管理命令       rpm                dpkg   包安装命令       yum	            apt-get++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[root@f3a71d377ef0 /]# rpm -qa | grep httpd		//查看httpd安装包root@77eda1ebcb2f:/# dpkg -l | grep nginx		//查看nginx安装包[root@f3a71d377ef0 /]# rpm -ql httpd			//查看httpd安装路径root@77eda1ebcb2f:/# dpkg -L nginx				//查看nginx安装路径[root@f3a71d377ef0 /]# rpm -qf /bin/ls			//查看ls命令安装包root@77eda1ebcb2f:/# dpkg -S /bin/ls			//查看ls命令安装包

commit创建镜像

  • 使用镜像启动容器,在该容器基础上修改后另存为一个新镜像
[root@docker01 ~]# docker rm $(docker stop $(docker ps -aq))		//删除所有容器[root@docker01 ~]# docker run -it centos		//启动容器[root@1a762df67c60 /]# cd /etc/yum.repos.d/		[root@1a762df67c60 yum.repos.d]# rm -f *[root@1a762df67c60 yum.repos.d]# vi dvd.repo		//配置yum[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@1a762df67c60 yum.repos.d]# yum -y install vim net-tools psmisc iproute		//安装常用软件包[root@1a762df67c60 ~]# exit		//退出centos容器[root@docker01 ~]# docker commit 1a762df67c60 mycentos:latest		//将修改后的centos容器另存为新镜像mycentos[root@docker01 ~]# docker history mycentos:latest		//查看镜像mycentos的制作过程[root@docker01 ~]# docker run -it mycentos		//启动mycentos容器,测试yum、ifconfig、vim等命令

dockerfile语法格式:

— FROM:基础镜像

— MAINTAINER:镜像创建者信息
— EXPOSE:开放的端口
— ENV: 设置变量
— ADD:复制文件到镜像
— RUN:制作镜像时执行的命令,可以有多个
— WORKDIR:定义容器默认工作目录
— CMD:容器启动时执行的命令,仅可以有一条CMD

dockerfile制作镜像

[root@docker01 ~]# mkdir aaa				//创建任意目录[root@docker01 ~]# cd aaa/					[root@docker01 aaa]# vim yum.repo[Centos]name=Centos7.4baseurl=ftp://192.168.8.254/rhel7/enabled=1gpgcheck=0[root@docker01 aaa]# touch Dockerfile		//固定格式[root@docker01 aaa]# vim DockerfileFROM centos:latest		//基于centos镜像RUN rm -f /etc/yum.repos.d/*.repo		ADD yum.repo /etc/yum.repos.d/yum.repoRUN yum -y install vim net-tools psmisc iproute[root@docker01 aaa]# lsDockerfile  yum.repo[root@docker01 aaa]# docker build -t test:latest .		//创建镜像(“.”表示上下文目录)[root@docker01 aaa]# docker images		//查看创建的镜像REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEtest                latest              6fb46839a1fc        24 minutes ago      302.8 MBmycentos            latest              203271180188        About an hour ago   302.8 MBbusybox             latest              64f5d945efcc        2 weeks ago         1.199 MBubuntu              latest              452a96d81c30        13 months ago       79.62 MBcentos              latest              e934aafc2206        13 months ago       198.6 MBregistry            latest              d1fd7d86a825        16 months ago       33.26 MBnginx               latest              a5311a310510        2 years ago         181.4 MBredis               latest              1aa84b1b434e        2 years ago         182.8 MB[root@docker01 aaa]# docker history test:latest 		//查看镜像test的制作过程IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT6fb46839a1fc        25 minutes ago      /bin/sh -c yum -y install vim net-tools psmis   104.1 MB            6c36ec3b9f4f        26 minutes ago      /bin/sh -c #(nop) ADD file:4003eb1511235a4fde   80 B                f81a50ced8ca        26 minutes ago      /bin/sh -c rm -f /etc/yum.repos.d/*.repo        0 B                 e934aafc2206        13 months ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
13 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
13 months ago /bin/sh -c #(nop) ADD file:f755805244a649ecca 198.6 MB[root@docker01 aaa]# docker run -it test //启动一个test容器,测试yum、ifconfig、vim等命令#############################################################################制作默认启动python镜像[root@docker01 aaa]# rm -f yum.repo [root@docker01 aaa]# lsDockerfile[root@docker01 aaa]# vim DockerfileFROM mycentos:latest //基于mycentos镜像CMD ["/usr/bin/python"] //定义默认启动命令[root@docker01 aaa]# docker build -t mycentos:python . //创建镜像mycentos:python[root@docker01 aaa]# docker run -it mycentos:python //启动一个mycentos:python容器Python 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> //启动容器后默认进入python#############################################################################制作一个默认启动sshd服务镜像[root@docker01 aaa]# cd[root@docker01 ~]# mkdir bbb[root@docker01 ~]# cd bbb/[root@docker01 bbb]# touch Dockerfile[root@docker01 bbb]# vim DockerfileFROM mycentos:latestRUN yum -y install openssh-server initscriptsRUN sshd-keygenRUN echo "123456" | passwd --stdin rootENV EnvironmentFile=/etc/sysconfig/sshd //设置环境变量EXPOSE 22 //开放22端口CMD ["/usr/sbin/sshd", "-D"] //定义默认启动命令sshd[root@docker01 bbb]# docker build -t mycentos:sshd .[root@docker01 bbb]# docker run -itd mycentos:sshd //启动一个mycentos:sshd容器,直接进入ssh连接###############################################################################制作一个默认启动httpd服务,首页为hello world!!!的镜像[root@docker01 ~]# mkdir ccc[root@docker01 ccc]# touch Dockerfile[root@docker01 ccc]# vim DockerfileFROM mycentos:latestRUN yum -y install httpdWORKDIR /var/www/html/ADD index.html index.htmlENV EnvironmentFile=/etc/sysconfig/httpdEXPOSE 80EXPOSE 443CMD ["/usr/sbin/httpd", "-DFOREGROUND"][root@docker01 ccc]# docker build -t mycentos:httpd . //创建镜像[root@docker01 ccc]# docker run -itd mycentos:httpd //启动容器[root@docker01 ~]# curl 172.17.0.2 //宿主机访问首页hello world!!![root@docker01 ~]# docker inspect -f "{
{.NetworkSettings.IPAddress}}" 65d09cc43858 //查看启动容器ip172.17.0.2[root@docker01 ~]# docker inspect -f "{
{.State.Pid}}" 65d09cc43858 //查看启动容器的进程id23611

创建私有镜像仓库

  • registry:共享镜像的一台服务器

镜像、容器、镜像仓库的工作流程如下图所示。

在这里插入图片描述

#配置服务端[root@docker01 ~]# vim /etc/docker/daemon.json		//创建配置文件{    "insecure-registries": ["192.168.8.11:5000"]		//将宿主机作为私有镜像仓库服务器,默认端口5000}[root@docker01 ~]# systemctl restart docker		//重启docker服务[root@docker01 ~]# docker run -itd -p 5000:5000 registry		//启动私有仓库[root@docker01 ~]# curl http://192.168.8.11:5000/v2/		//验证私有仓库,初始为空{}[root@docker01 ~]# docker tag busybox:latest 192.168.8.11:5000/busybox:latest		//上传镜像前打标签[root@docker01 ~]# docker push 192.168.8.11:5000/busybox:latest		//上传镜像[root@docker01 ~]# for i in python sshd httpd;> do docker tag mycentos:${i} 192.168.8.11:5000/mycentos:${i}> docker push 192.168.8.11:5000/mdaycentos:${i}^C[root@docker01 ~]# for i in latest python sshd httpd;do		//继续上传其他镜像> docker tag mycentos:${i} 192.168.8.11:5000/mycentos:${i}> docker push 192.168.8.11:5000/mycentos:${i}> docker rmi 192.168.8.11:5000/mycentos:${i}> done#配置客户端[root@docker02 ~]# vim /etc/docker/daemon.json		//配置客户端docker02{    "insecure-registries": ["192.168.8.11:5000"]}[root@docker02 ~]# systemctl restart docker[root@docker02 ~]# docker run -it 192.168.8.11:5000/mycentos:latest		//客户端通过远程镜像仓库启动容器[root@docker02 ~]# curl http://192.168.8.11:5000/v2/_catalog		//查看仓库中的镜像{"repositories":["busybox","mycentos"]}[root@docker02 ~]# curl http://192.168.8.11:5000/v2/mycentos/tags/list		//查看某一镜像的所有标签{"name":"mycentos","tags":["latest","python","sshd","httpd"]}

卷的概念

  • docker容器不保持任何数据
  • 重要数据需要使用外部卷存储(数据持久化)
  • 容器可以挂载真实机目录或共享存储为卷

主机卷的映射

  • 将真实机目录挂载到容器提供数据持久化存储

共享存储

  • 一台共享存储服务器(如NFS)可以提供给所有Docker主机使用

1、搭建一个NFS服务器,创建共享目录

2、docker01挂载nfs服务器共享目录,在doker01上启动nginx容器,将挂载的共享目录映射给容器
3、docker02挂载nfs服务器共享目录,在doker02上启动apache容器,将挂载的共享目录映射给容器

#创建NFS服务器(nfs99:192.168.8.99)[root@nfs99 ~]# yum -y install nfs-utils[root@nfs99 ~]# vim /etc/exports/var/webpublic    *(rw)		//配置所有主机对nfs服务器共享目录/var/webpublic均有读写权限[root@nfs99 ~]# mkdir /var/webpublic[root@nfs99 ~]# chmod 777 /var/webpublic/[root@nfs99 ~]# systemctl start nfs[root@nfs99 ~]# systemctl enable nfs#docker主机挂载nfs共享目录(以docker01主机为例)[root@docker01 ~]# yum -y install nfs-utils[root@docker01 ~]# showmount -e 192.168.8.99		//查看nfs服务器共享目录Export list for 192.168.8.99:/var/webpublic *[root@docker01 ~]# mkdir /var/webroot[root@docker01 ~]# mount -t nfs 192.168.8.99:/var/webpublic /var/webroot		//将本机/var/webroot挂载至nfs共享目录[root@docker01 webroot]# vim /etc/fstab/dev/vda1 /                       xfs     defaults        0 0192.168.8.99:/var/webpublic /var/webroot nfs defaults,_netdev 0 0		//设置开机自动挂载[root@docker01 ~]# cd /var/webroot/[root@docker01 webroot]# vim index.htmlhello world!!!#映射nfs共享目录至docker容器[root@docker01 ~]# docker run -it nginx /bin/bashroot@485fa8e0f189:/# nginx -T		//查看nginx配置文件...location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }...root@485fa8e0f189:/# exit[root@docker01 ~]# docker run -itd -v /var/webroot/:/usr/share/nginx/html nginx		//启动nginx容器,映射挂载的共享目录至nginx根目录[root@docker01 ~]# docker ps[root@docker01 ~]# docker inspect d697eb5d74fe		//查看容器ip[root@docker01 ~]# curl 172.17.0.2		//访问nginx容器首页hello world!!![root@docker02 webroot]# docker run -itd -v /var/webroot/:/var/www/html 192.168.8.11:5000/mycentos:httpd		//docker02主机通过远程镜像仓库启动apache容器,并映射挂载的共享目录至apache根目录[root@docker02 webroot]# curl 172.17.0.2		//访问apache首页hello world!!!		//内容与docker01主机的nginx容器首页一致#############################################################################[root@docker01 webroot]# vim index.html		//docker01主机修改首页hello world!!!Nice to meet you![root@docker01 webroot]# curl 172.17.0.2		//docker01主机再次访问nginx容器首页hello world!!!Nice to meet you![root@docker02 webroot]# curl 172.17.0.2		//docker02主机再次访问apache容器首页hello world!!!Nice to meet you!

Docker网络模型

[root@docker01 ~]# docker network list		//查看docker创建的默认网络模型NETWORK ID          NAME                DRIVER              SCOPEf42c63f0a299        bridge              bridge              local               0c34442f9fbc        host                host                local               6a11eddd8c46        none                null                local[root@docker01 ~]# docker network create --subnet=10.10.10.0/24 docker1		//创建虚拟网桥docker1,指定子网为10.10.10.0/24[root@docker01 ~]# docker network listNETWORK ID          NAME                DRIVER              SCOPEf42c63f0a299        bridge              bridge              local               75922336526a        docker1             bridge              local               0c34442f9fbc        host                host                local               6a11eddd8c46        none                null                local [root@docker01 ~]# docker run -it busybox		//启动busybox容器1,默认连接虚拟交换机docker0[root@docker01 ~]# docker run -it busybox		//启动busybox容器2,默认连接虚拟交换机docker0[root@docker01 ~]# docker run -it --network=docker1 busybox		//启动busybox容器3,指定连接虚拟交换机docker1[root@docker01 ~]# docker run -it --network=docker1 busybox		//启动busybox容器4,指定连接虚拟交换机docker1#测试ping命令,容器1、2可相互ping通,容器3、4可以相互ping通,容器1、2与容器3、4无法ping通

客户端访问容器内资源

  • 默认容器通过SNAT可以访问外网
  • 但是外部网络的主机不可以访问容器内的资源
  • 使用端口映射可以实现外部网络访问容器内的资源
[root@docker01 ~]# docker run -itd -p 80:80 mycentos:httpd		//通过端口映射启动一个httpd容器[root@room9pc01 ~]# curl http://192.168.8.11/		//客户端访问容器httpd服务hello world!!!#############################################################################[root@docker01 ~]# docker stop 78e97a2f82b8		//关闭以上httpd容器[root@docker01 ~]# docker run -itd -p 80:80 nginx		//通过端口映射启动一个nginx容器[root@room9pc01 ~]# curl http://192.168.8.11/		//客户端访问容器nginx服务Welcome to nginx!...############################################################################[root@docker01 ~]# docker run -itd -p 3306:3306 mycentos:mysqld		//通过端口映射启动一个mysqld容器[root@docker01 ~]# docker exec -it 89af33392156 /bin/bash		//进入mysqld容器[root@89af33392156 /]# mysqlMariaDB [mysql]> use mysqlMariaDB [mysql]> update user set Host='%' where User='root';		//修改所有人(%)权限MariaDB [mysql]> flush privileges;		//刷新权限[root@room9pc01 ~]# mysql -uroot -h192.168.8.11		//客户端访问mysqld容器数据库MariaDB [(none)]>

转载地址:http://yenwi.baihongyu.com/

你可能感兴趣的文章
基于深度学习知识追踪研究进展(综述)数据集模型方法
查看>>
linux常见命令与FileZilla
查看>>
PostgreSQL和ElasticSearch学习笔记
查看>>
java反射
查看>>
paint 和 paintcomponent的区别
查看>>
JSP字节码的存放路径问题
查看>>
对RMQ的理解
查看>>
LCA的离线算法
查看>>
spark学习与资料
查看>>
Java_SSM问题
查看>>
sql-数据库操作
查看>>
推荐CTR预估-几个基础模型FM \FFM\GBDT+LR
查看>>
推荐系统基础
查看>>
redis
查看>>
word2vec参数
查看>>
python的collections
查看>>
LDA和PCA
查看>>
推荐分解:介绍SVD、SVD++
查看>>
FM详解
查看>>
二叉树遍历
查看>>