一 Docker介绍
1 Docker 可以认为是直接使用物理硬件的虚拟机。
Docker是完整的一套容器管理系统。
Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术。
2 什么是容器
• 容器技术已经成为应用程序封装和交付的核心技术
• 容器技术的核心有以下几个内核技术组成:
– CGroups(Control Groups)-资源管理
– NameSpace-进程隔离
– SELinux安全
• 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
3 Docker优点
• 相比于传统的虚拟化技术,容器更加简洁高效
• 传统虚拟机需要给每个VM安装操作系统
• 容器使用的共享公共库和程序
4 Docker的缺点
• 容器的隔离性没有虚拟化强
• 共用Linux内核,安全性有先天缺陷
• SELinux难以驾驭
• 监控容器和容器排错是挑战
二 docker安装部署
1 互联网安装:
http://mirrors.163.com ----> centos使用帮助 下载对应版本repo文件, 放入/etc/yum.repos.d/
2 本地安装docker
rpm -ivh docker-engine-1.12.1-1.el7.centos.x86_64.rpm
rpm -ivh docker-engine-selinux-1.12.1-1.el7.centos.noarch.rpm
3 启动服务
systemctl start docker
systemctl enable docker
4 下载镜像
https://www.docker.com/ 国外站点
什么是镜像?
• 在Docker中容器是基于镜像启动的
• 镜像是启动容器的核心
• 镜像采用分层设计
• 使用快照的COW技术,确保底层数据不丢失
5 镜像操作:
(1)镜像搜索,联网状态
docker search mysql
(2)下载镜像(从镜像仓库中下载镜像)
[root@server0 ~]# docker help pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[root@server0 ~]# docker pull rhel7
(3)上传镜像(上传镜像到仓库)
[root@server0 ~]# docdocker help push
Usage: docker push [OPTIONS] NAME[:TAG]
(4)导入镜像
docker load < xx.tar
docker images
例如:
docker load < nginx.tar
docker run -p 80:80 nginx
客户端访问: firefox http://ip 将会显示nginx的页面!
从官方下载的镜像是只读的,如果不满足我们的需求需要修改的话,在原有的层次上再加层次,也是无法修改的。
(5)导出镜像(将本地镜像导出为tar文件)
docker images #查看镜像
docker save image_name > xx.tar
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 980e0e4c79ec 8 months ago 196.7 MB
镜像仓库名称 镜像标签 镜像ID 创建时间 大小
(6)启动镜像:
docker run
6 镜像命令列表
docker images //查看镜像列表
docker history //查看镜像制作历史
docker inspect //查看镜像底层信息 了解镜像环境变量、存储卷、标签等信息
docker pull //下载镜像
docker push //上传镜像
docker rmi //删除本地镜像
docker save //镜像另存为tar包
docker load //使用tar包导入镜像
docker search //搜索镜像
docker tag //修改镜像名称和标签 生成的新的镜像并不是将镜像复制一次,而是两个名字指向同一个镜像,可以根据镜像id验证
7 容器常用命令
docker run //运行容器
docker ps //查看容器列表
docker stop //关闭容器
docker start //启动容器
docker restart //重启容器
docker attach|exec //进入容器,attach不启用新进程,exec启用新的进程
docker inspect //查看容器底层信息
docker top //查看容器进程列表
docker rm //删除容器
案例:
docker run -it centos bash #进入容器操作,i表示交互,d表示在后台运行
[root@743eca227332 /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出:exit
启动容器后,如果想返回宿主机,但不想停止容器,可是使用:
使用组合键:ctrl+q+p
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器id 基于容器的镜像 运行的命令
docker ps -a #查看所有的容器,无论是运行中的还是已经结束的
docker rm 8b8 #删除容器 8b8:容器id
docker rm -f $(docker ps -qa) #一次性删除不用的容器
docker help run
案例
1 启动两个容器,基于centos镜像,一个用于安装httpd,另一个用于安装mariadb-server
2 在第一个容器上配置discuz论坛
步骤:
1 启动容器,为其设置主机名
docker run -h web1 -it centos bash #-h 设置主机名,如果不设置,以id号作为
docker run -h dbserver -idt centos bash
这样启动之后使用docker ps 查看无法知道哪个是web1 哪个是dbsever
修改容器名称:(删除之前启动的容器)
docker run -p 80:80 --name web1 -h web1 -it centos bash
docker run -p 3306:3306 --name dbserver -h dbserver -idt centos bash
使用docker ps 查看就可以知道启动的哪个容器
2 分别连入两个容器,配置yum
docker attach web1
配置yum:vim /etc/yum.repos.d/
3 在web1上安装httpd/php/php-mysql
yum -y install httpd php php-mysql
[root@web1 /]# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted
为什么不被允许?容器的服务运行要求在前台运行
在前台启动:httpd -DFOREGROUND
测试:firefox http://192.168.4.41 #因为做了端口映射,因此访问容器所在的服务器的ip就可以
4 在dbserver上安装mariadb-server
yum -y install mariadbserver
mysql_install_db
chown -R mysql:mysql /var/lib/mysql
mysqld_safe #在前台运行的命令
5 在dbserver上授权
docker exec -it dbserver bash #重新启动新的进程进入dbserver
mysql
grant all on *.* to admin@'%' identified by '123456';
exit
6 安装discuz (web1)
yum -y install lftp unzip
lftp 192.168.4.254
get discuz
cp -r upload/ /var/www/html/bbs
chmod -R 777 /var/www/html/bbs
firefox http://192.168.4.41/bbs 进行初始设置,并登录
三 自定义镜像与仓库
1 自定义镜像
1.1 使用docker commit命令
以centos镜像为例,创建新的镜像,新镜像已经配置好了yum并且安装了net-tools
(1)基于centos启动容器
docker run -it centos bash
创建新的yum源
rm -rf /etc/yum.repos.d/*
vi /etc/yum.repos.d/server.repo
[server]
name=server
baseurl=http://192.168.4.254/rhel7
enabled=1
gpgcheck=0
yum -y install net-tools
组合键:ctrl+q+p不停止容器退出
(2)将容器centos commit 成为新的镜像
docker ps
找到进程的CONTAINER ID(容器id)
docker commit 容器id mycentos(自定义名称)
(3)测试新的镜像是否能使用,并是否有yum,有net-tools
docker images
docker run -it mycentos bash
yum repolist
rpm -q net-tools
2使用dockerfile命令
2.1 Dockerfile语法格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– EXPOSE:开放的端口
– ENV:设置变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
2.2 使用Dockerfile工作流程
– mkdir build; cd build
– vim Dockerfile
– docker build -t imagename Dockerfile
2.3 具体流程:
(1)创建工作目录
mkdir -p ~/mydocker/build1
cd ~/mydocker/build1
(2)编写Dockerfile
vim Dockerfile
FROM centos:latest
CMD ["/bin/echo","hello world"]
(3)生成镜像
docker build -t mytest:latest .(注意这里有个点,代表当前目录)
docker images
docker run -it mytest
2.4 其它命令的使用:
(1)创建工作目录
mkdir ~/mydocker/build2
cd ~/mydocker/build2
(2)编写Dockerfile
vim Dockerfile
FROM mycentos #基于哪个镜像
MAINTAINER Ding [email protected] #镜像创建者描述信息
WORKDIR /var/www/html
ADD test.sh /root/mytest.sh
RUN yum -y install httpd #RUN安装软件用
RUN yum -y install php
EXPOSE 80
CMD ["httpd","-DFOREGROUND"] #Container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.
echo pwd > test.sh
(3)生成镜像
docker build -t centos:http .
(4)验证
docker run -P -itd centos:http
docker ps
b6f87329e196 centos:http "httpd -DFOREGROUND" 10 seconds ago Up 7 seconds 0.0.0.0:32770->80/tcp furious_hugle
firefox http://192.168.4.41:32770
docker attach b6f87329e196 #进入镜像
pwd #此时的目录为Dockerfile中定义的路径/var/www/html
2.5 生成镜像的建议
(1)每个容器只运行一个进程
(2)不要假定你的容器可以一直处于运行状态,他们只时临时的,很有可能被停止
(3)使用.dockerignore文件排除不想加入到镜像中的文件
(4)使用官方提供的镜像,而不是自己从头制作
(5)尽量减少镜像的层次(dcoker history centos:http)即在Dockerfile文件中减少命令的行数
docker run -P -itd -v /webroot/web1:/var/www/html centos:http
-v 指定宿主机的网页路径为容器的网页路径,容器发生故障对数据不影响
基于镜像启动多个容器:
for i in {1..5};do docker run -P -h web$i --name web$i -itd centos:http;done
四 自定义私有仓库
1 流程:
(1)下载仓库镜像
docker pull registry /docker load < registry.tar
(2)修改docker服务,可以使用本地仓库
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=ip:5000
systemctl daemon-reload
systemctl restart docker
(3)查看导入的镜像是否有名称,没有名称为其添加名字
docker tag
(4)后台启动registry
docker run -id -p 5000:5000 registry
(5)镜像名称的格式是:仓库名/镜像名 才能上传
docker tag 镜像 IP:5000/镜像:label
(docker tag centos:http 192.168.4.41:5000/centos:http)
docker images
(6)上传镜像到仓库
docker push IP:5000/镜像:label
(7)进入registry容器查看/etc/docker/registry/config.yml
五 持久化存储
1 不要在容器里存放重要数据,应该将数据存储在宿主机上
[root@server41 ~]# docker run -idt -P --name web1 -v /webroot/web1:/var/www/html 192.168.4.41:5000/centos:http
7e699a8845d6ba446ec13009ed9f371c83fda4a204afff6b625808e962ad7808
echo '
my test
' >/webroot/web1/index.htmldocker ps
firefox http://192.168.4.41:32768
2 共享存储:
NFS 将41/42的数据存放在43上
环境:192.168.4.43(nfs共享),192.168.4.41/42 docker主机
(1)创建nfs后端存储
mkdir -m 777 /nfsroot
yum -y install nfs-utils
vim /etc/exports
/nfsroot 192.168.4.0/24(rw,sync)
systemctl start nfs-server
(2)docker主机开机自挂载
showmount -e 192.168.4.43
mkdir /dockdir
vim /etc/fstab
192.168.4.43:/nfsroot /dockdir nfs defaults 0 0
mount -a
df -h
(3)启动容器,将容器的卷对应到nfs共享中
docker主机1 :192.168.4.41
docker run -idt -P -v /dockdir/vh01/web1:/var/www/html 192.168.4.41:5000/centos:http
docker主机2:192.168.4.42
docker run -idt -P -v /dockdir/vh02/web1:/var/www/html 192.168.4.41:5000/centos:http
3 docker 网络管理
3.1 真实网卡配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
3.2 虚拟网卡配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
3.3 创建虚拟网桥
/etc/sysconfig/network-scripts/ifcfg-br0
brctl show
3.4 查看 docker 网络结构
docker network ls/list
NETWORK ID NAME DRIVER SCOPE
9b253a7830e9 bridge bridge local #桥接模式
aaf97b7c3392 host host local #主机模式
3393772851b5 none null local #无网络
桥接模式:当虚拟机系统的网络连接模式为桥接模式时,相当于在主机系统和虚拟机系统之间连接了一个网桥,而网桥两端的网络都属于同一网络,主机和虚拟机是处于同一网络中的对等主机。将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信
主机模式:将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯
3.5 使用Docker创建网桥
docker network create --driver bridge test01
ip a s /ip add show #查看
docker network inspect test01
docker network inspect 网桥id #查看某一个桥的详细信息
3.6 自定义网段
docker network create --subnet=172.30.0.0/16 test01
docker run --network=test01 -idt centos bash #启动容器使用自定义网络
docker inspect 容器id #查看容器连接在哪个网络
3.7 客户端访问容器内的资源
默认容器通过SNAT可以访问外网,但外部网络的主机不可以访问容器内的资源
使用端口映射可以实现外部网络访问容器内的资源
docker run -p 8080:80 -id nginx 物理机端口号:8080 容器端口号:80
访问物理机的8080就相当于访问容器的80端口