一 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.html

docker 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端口