什么是容器?
- 容器技术是一种应用程序封装和交付的核心技术
- 容器技术的核心由以下几个内核技术组成:
(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 docker01
192.168.8.12 docker02
[root@docker01 ~]# vim /etc/yum.repos.d/dvd.repo
Centos]
name=Centos7.4
baseurl=ftp://192.168.8.254/rhel7/
enabled=1
gpgcheck=0
[Docker]
name=docker
baseurl=ftp://192.168.8.254/docker/
enabled=1
gpgcheck=0
2、安装并启动docker
[root@docker01 ~]# yum list |grep docker
docker-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启动后会生成一个虚拟交换机docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> 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 AUTOMATED
busybox 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: latest
latest: Pulling from library/busybox
53071b97a884: Pull complete
Digest: sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3d
Status: Downloaded newer image for busybox:latest
[root@docker01 ~]# docker images //查看下载镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 64f5d945efcc 2 weeks ago 1.199 MB
[root@docker01 ~]# ls
[root@docker01 ~]# docker save busybox:latest > busybox.tar //备份docker镜像
[root@docker01 ~]# ls
busybox.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 MB
Loaded image: busybox:latest
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 64f5d945efcc 2 weeks ago 1.199 MB
[root@docker01 ~]# cd docker_images/
[root@docker01 docker_images]# ls
centos.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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 64f5d945efcc 2 weeks ago 1.199 MB
ubuntu latest 452a96d81c30 13 months ago 79.62 MB
centos latest e934aafc2206 13 months ago 198.6 MB
registry latest d1fd7d86a825 16 months ago 33.26 MB
nginx latest a5311a310510 2 years ago 181.4 MB
redis latest 1aa84b1b434e 2 years ago 182.8 MB
容器常用命令
[root@docker01 ~]# docker run -itd nginx:latest //运行容器,-itd(选项分别表示交互式、运行后开启终端、后台运行)
[root@docker01 ~]# docker run -it centos //运行容器后进入容器
[root@docker01 ~]# docker run -it --name centos1 -h mycentos centos //运行容器时指定容器名称(centos1)和容器主机名(mycentos)
[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]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-fasttrack.repo
CentOS-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.4
baseurl=ftp://192.168.8.254/rhel7/
enabled=1
gpgcheck=0
[root@eac031d4b130 yum.repos.d]# yum provides ifconfig //查看ifconfig命令安装包
Loaded plugins: fastestmirror, ovl
Centos | 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 mirrors
Centos/filelists_db | 3.4 MB 00:00:00
net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking tools
Repo : Centos
Matched from:
Filename : /sbin/ifconfig
[root@eac031d4b130 yum.repos.d]# yum -y install net-tools //安装ifconfig命令安装包
[root@eac031d4b130 yum.repos.d]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 //启动容器后网络隔离
[root@docker01 ~]# ifconfig //对比容器网络
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> 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 -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:14 ? 00:00:00 /bin/bash //centos容器中默认启动命令为/bin/bash
root 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=rhel7
baseurl=ftp://192.168.8.254/rhel7
enabled=1
gpgcheck=0
[root@f3a71d377ef0 ~]# yum -y install httpd vim
[root@f3a71d377ef0 ~]# cd /var/www/html/
[root@f3a71d377ef0 html]# vim index.html
hello world!
[root@f3a71d377ef0 html]# systemctl start httpd //容器中无systemd命令,启动httpd报错
[root@f3a71d377ef0 html]# cat /usr/lib/systemd/system/httpd.service //查看手动启动httpd命令
...
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/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.4
baseurl=ftp://192.168.8.254/rhel7/
enabled=1
gpgcheck=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等命令
注:
1、使用docker commit命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
2、首先,安装软件包、编译构建等操作会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿
3、其次,使用docker commit对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知,维护起来非常困难。
4、另外,docker commit命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。定制镜像应该使用Dockerfile来完成。
dockerfile语法格式:
— FROM:基础镜像
— MAINTAINER:镜像创建者信息
— EXPOSE:开放的端口
— ENV: 设置变量
— ADD:复制文件到镜像
— RUN:制作镜像时执行的命令,可以有多个
— WORKDIR:定义容器默认工作目录
— CMD:容器启动时执行的命令,仅可以有一条CMD
— ENTRYPOINT:容器启动时执行的命令,可以接收参数
dockerfile制作镜像
[root@docker01 ~]# mkdir aaa //创建任意目录
[root@docker01 ~]# cd aaa/
[root@docker01 aaa]# vim yum.repo
[Centos]
name=Centos7.4
baseurl=ftp://192.168.8.254/rhel7/
enabled=1
gpgcheck=0
[root@docker01 aaa]# touch Dockerfile //固定格式
[root@docker01 aaa]# vim Dockerfile
FROM centos:latest //基于centos镜像
RUN rm -f /etc/yum.repos.d/*.repo
ADD yum.repo /etc/yum.repos.d/yum.repo
RUN yum -y install vim net-tools psmisc iproute
[root@docker01 aaa]# ls
Dockerfile yum.repo
[root@docker01 aaa]# docker build -t test:latest . //创建镜像(“.”表示上下文目录)
#在构建镜像时使用的‘.’并不是指当前目录的意思,而是构建上下文环境context。docker是C/S模型运行,在构建时,客户端会把
#构建当前目录的内容拷贝到context,然后通过context环境执行构建。构建好的镜像放到服务器的镜像库中。
[root@docker01 aaa]# docker images //查看创建的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 6fb46839a1fc 24 minutes ago 302.8 MB
mycentos latest 203271180188 About an hour ago 302.8 MB
busybox latest 64f5d945efcc 2 weeks ago 1.199 MB
ubuntu latest 452a96d81c30 13 months ago 79.62 MB
centos latest e934aafc2206 13 months ago 198.6 MB
registry latest d1fd7d86a825 16 months ago 33.26 MB
nginx latest a5311a310510 2 years ago 181.4 MB
redis latest 1aa84b1b434e 2 years ago 182.8 MB
[root@docker01 aaa]# docker history test:latest //查看镜像test的制作过程
IMAGE CREATED CREATED BY SIZE COMMENT
6fb46839a1fc 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
<missing> 13 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
<missing> 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]# ls
Dockerfile
[root@docker01 aaa]# vim Dockerfile
FROM 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 linux2
Type "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 Dockerfile
FROM mycentos:latest
RUN yum -y install openssh-server initscripts
RUN sshd-keygen
RUN echo "123456" | passwd --stdin root
ENV 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 Dockerfile
FROM mycentos:latest
RUN yum -y install httpd
WORKDIR /var/www/html/
ADD index.html index.html
ENV EnvironmentFile=/etc/sysconfig/httpd
EXPOSE 80
EXPOSE 443
CMD ["/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 //查看启动容器ip
172.17.0.2
[root@docker01 ~]# docker inspect -f "{{.State.Pid}}" 65d09cc43858 //查看启动容器的进程id
23611
创建私有镜像仓库
- 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 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 0
192.168.8.99:/var/webpublic /var/webroot nfs defaults,_netdev 0 0 //设置开机自动挂载
[root@docker01 ~]# cd /var/webroot/
[root@docker01 webroot]# vim index.html
hello world!!!
#映射nfs共享目录至docker容器
[root@docker01 ~]# docker run -it nginx /bin/bash
root@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 SCOPE
f42c63f0a299 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 list
NETWORK ID NAME DRIVER SCOPE
f42c63f0a299 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服务
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
############################################################################
[root@docker01 ~]# docker run -itd -p 3306:3306 mycentos:mysqld //通过端口映射启动一个mysqld容器
[root@docker01 ~]# docker exec -it 89af33392156 /bin/bash //进入mysqld容器
[root@89af33392156 /]# mysql
MariaDB [mysql]> use mysql
MariaDB [mysql]> update user set Host='%' where User='root'; //修改所有人(%)权限
MariaDB [mysql]> flush privileges; //刷新权限
[root@room9pc01 ~]# mysql -uroot -h192.168.8.11 //客户端访问mysqld容器数据库
MariaDB [(none)]>