docker-从入门到实践
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
docker基础所有包下载
链接:https://pan.baidu.com/s/1TYH3RUFR3OiN6fX67sa5rg
提取码:yy44
什么叫虚拟化
正常服务器丨真实硬件层丨操作系统kernel丨shell层丨应用程序层
kvm丨真实硬件层丨虚拟化层丨Virual硬件层丨操作系统kernel丨shell层丨应用程序层
docker丨真实硬件层丨操作系统kernel丨分成一份一份的shell层丨分成一份一份的程序
LVM硬盘虚拟化
KVM硬件虚拟化(需要单独装操作系统,半虚拟化通过接口vitio)
Docker容器虚拟化(虚拟化后不需要装操作系统,比KVM小的多)
一,Docker简介,功能特性与应用场景
1.1 Docker简介
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成
Docker Client 客户端
Docker Daemon 守护进程
Docker Image 镜像
Docker Container 容器
1.2 Docker功能特性
隔离环境(系统,网络,文件系统)与应用
解决依赖与版本问题
易于分发,开箱即用
节点与容器快速扩容
镜像制作简单便捷,管理方便
(1)隔离
通过cgroup(隔离和跟踪资源的使用)& namespace(组与组之间隔离)来实现轻量级的进程隔离
对于容器中运行的进程来说,自己独占了一个系统
容器间网络,文件及其他资源都互相隔离
(2)版本与依赖
传统模式下,多个不同环境或版本的项目需要部署在不同机器上,部署与后期维护管理复杂繁琐。
使用Docker,通过多个不同版本或者环境的镜像,可以同时运行在一台机器上互不干扰,部署与后期维护简单方便。
(3)分发与使用
镜像可以通过导入,导出,上传到镜像仓库等多种方式进行分发
在启动了Docker的系统上直接使用docker run即可启动镜像,无需特别配置。
(4)扩容
容器扩容简单方便
扩容节点只需安装并启动Docker即可
(5)镜像制作
镜像的灵魂Dockerfile
使用Dockerfile进行指令控制
基于Linux命令,易于理解,快速上手
易于定制与修改
1.3 Docker应用场景
Docker通常应用于如下场景
web应用的自动化打包和发布
自动化测试和持续集成,发布
应用服务,如MySQL,Redis等,通过Docker实现快速部署
k8s私有云
1.3.1 场景1:多版本多种类系统与软件
1.3.2 场景2: 环境
1.3.3 场景3: 分发
二,Docker的安装(安装社区版进行测试)
2.1 安装环境
最小化安装Centos7.5
cat /etc/redhat-release
uname -r
关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.2 版本选择
Docker
17.03之后版本变为Docker CEDocker CE(测试选择社区版)
社区版,Community EditionDocker EE
企业版,Enterprise Edition
收费版本,强调安全性,提供一些高级特性及商业支持
2.3 Docker安装:标准版本(版本太低不用)
特别提示:
centos7.5在搭建本地yum仓库的时候只需要修改
CentOS-Media.repo 文件即可(不需要将其他文件仍子目录里)
确保虚拟机能正常上网
[root@Docker ~]# yum -y install docker
[root@Docker ~]# systemctl start docker #启动docker进程
[root@Docker ~]# systemctl enable docker #加入docker开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@Docker ~]# docker ps #查看封装在docker镜像中的正在运行的镜像进程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@Docker ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Experimental: false
2.4 Docker安装:CE社区版(清理docker方法)
首先清理掉yum安装的docker标准版
这里有两种方式
#第一种清理docker方法
[root@Docker ~]# yum -y remove docker
#第二种清理docker方法
[root@Docker ~]# yum history list #查看yum安装的历史列表
已加载插件:fastestmirror
ID | 登录用户 | 日期和时间 | 操作 | 变更数
-------------------------------------------------------------------------------
6 | root | 2018-07-02 22:30 | Install | 17 EE #这次就是安装的docker
5 | root | 2018-07-02 20:08 | I, U | 60
4 | root | 2018-07-03 03:54 | Install | 93
3 | root | 2018-07-03 03:53 | Install | 1
2 | root | 2018-07-03 03:53 | Install | 1
1 | 系统 <空> | 2018-07-03 03:46 | Install | 313
history list
[root@Docker ~]# yum history info 6 #查看yum历史安装ID为6的安装信息
已加载插件:fastestmirror
事务 ID: 6
起始时间 : Mon Jul 2 22:30:11 2018
启动 RPM 数据库 : 409:3aba29f1d5b7e2d7ff3ed9f169ec4a2225595390
结束时间 : 22:30:27 2018 (16 秒)
结束 RPM 数据库 : 426:28338758ec6a2332cabb3a1439336bd451c52366
用户 : root
返回码 : 成功
命令行 : -y install docker
事务完成属主:
已安装 rpm-4.11.3-32.el7.x86_64 @anaconda
已安装 yum-3.4.3-158.el7.centos.noarch @anaconda
已安装 yum-plugin-fastestmirror-1.1.31-45.el7.noarch @anaconda
已变更的包:
依赖安装 audit-libs-python-2.8.1-3.el7.x86_64 @base
依赖安装 checkpolicy-2.5-6.el7.x86_64 @base
依赖安装 container-selinux-2:2.55-1.el7.noarch @extras
依赖安装 container-storage-setup-0.9.0-1.rhel75.gite0997c3.el7.noarch @extras
安装 docker-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依赖安装 docker-client-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依赖安装 docker-common-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依赖安装 libcgroup-0.41-15.el7.x86_64 @base
依赖安装 libsemanage-python-2.5-11.el7.x86_64 @base
依赖安装 oci-register-machine-1:0-6.git2b44233.el7.x86_64 @extras
依赖安装 oci-systemd-hook-1:0.1.15-2.gitc04483d.el7.x86_64 @extras
依赖安装 oci-umount-2:2.3.3-3.gite3c9055.el7.x86_64 @extras
依赖安装 policycoreutils-python-2.5-22.el7.x86_64 @base
依赖安装 python-IPy-0.75-6.el7.noarch @base
依赖安装 setools-libs-3.3.8-2.el7.x86_64 @base
依赖安装 skopeo-containers-1:0.1.29-3.dev.git7add6fc.el7.0.x86_64 @extras
依赖安装 yajl-2.0.4-4.el7.x86_64 @base
Scriptlet 输出:
1 setsebool: SELinux is disabled.
history info
[root@Docker ~]# yum -y history undo 6 #进行yum安装操作回退
特别提示:
yum的回退安装在工作中很有用
安装Docker的CE社区版
安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
添加docker的CE版本的yum源配置文件
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
ll /etc/yum.repos.d/docker-ce.repo
安装CE版本的docker
yum -y install docker-ce
systemctl start docker #启动docker
systemctl enable docker #添加开机启动
docker version #查看docker版本
三,Docker的操作命令
3.0 添加docker国内镜像源
在开始学习docker之前,我们首先要更改一下docker的默认源镜像下载地址(默认是从国外下载,很慢),我们需要添加国内的源地址
vim /etc/docker/daemon.json
cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
systemctl daemon-reload
systemctl restart docker
3.1 Docker命令:search(查看镜像)
用于从docker的官方公有镜像仓库查找镜像
(1)查看Docker Hub上公开的centos镜像
docker search centos
特别说明:
Name:镜像的名字
DESCRIPTION:描述
STARS:星级(越高越好)
OFFICIAL:是否是官方发布的(OK代表官方发布的)
AUTOMATED:是否自动化的
(2)查找星级多于100的centos镜像
查找,星级大于100的centos镜像
docker search centos -f stars=100
特别提示:
/:符号用于分割作者名称和镜像名称
ansible/centos7-ansible:ansible是作者名称,centos7-ansible是镜像名称
(3)多条件查找--filter
查找官方发布的,星级大于100的centos镜像
docker search centos --filter is-official=true --filter stars=100
3.2 Docker命令:pull(下载镜像)
用于从Docker Hub上下载公有镜像
docker pull nginx
docker pull richarvey/nginx-php-fpm
docker pull mysql:5.6
docker pull centos
3.3 Docker命令:images(查看本地镜像)
用于本地镜像的查看
docker images
特别说明:
REPOSITORY:镜像仓库(下边罗列的都是本地已有镜像名称)
TAG:镜像的标记(为了区分同名镜像)
IMAGES ID:镜像的ID号
CREATED:此镜像的创建时间
SIZE:此镜像的大小
3.4 Docker命令:build(自定义)
用于本地自定义镜像的构建,需要创建Dockerfile文件(只是创建,写法在后面)
创建Dockerfile文件的存储目录
mkdir -p /root/dockerfile/lib/centos/7
cd /root/dockerfile/lib/centos/7
创建docker.sh脚本
vim docker.sh
cat docker.sh
#!/bin/bash
while true
do
echo "welcome"
sleep 5
done
创建Dockerfile配置文件,文件名称必须为Dockerfile,第一个字母必须大写
vim Dockerfile
cat Dockerfile
FROM centos
LABEL MAINTATNER="Mr.sl.com"
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD docker.sh /home/test/
RUN chmod +x /home/test/docker.sh
CMD ["/home/test/docker.sh"]
配置详解
FROM centos
#从centos源镜像的基础上进行构建
LABEL MAINTATNER="Mr.sl.com"
#作者的名称
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #RUN:f是强制覆盖,v是有信息输出,在镜像构建过程中运行命令
ADD docker.sh /home/test/
#从本地系统中把docker.sh文件添加到构建中的镜像的/home/test/目录下
RUN chmod +x /home/test/docker.sh
#在镜像构建过程中运行命令
CMD ["/home/test/docker.sh"]
#构建镜像完成时,最后执行的命令
根据Dockfile配置文件构建一个自定义镜像
docker build -t Mr.sl/centos7:1 . #-t 指定镜像名称 :1 设定镜像的tag标记
docker images
3.5 Docker命令:run(运行镜像)
运行一个本地镜像
docker images
docker run -dit Mr.sl/centos7:1 /bin/bash --->/bin/bash代替配置文件里面的CMD,可以不用写
特别提示:
docker run:运行一个指定的images id或镜像名字
-d:放在后台运行
-i:可以进行命令交互
-t:制作一个伪终端用于登陆
0523fda5f122:镜像的ID,可以简写成052
docker run -dit --name centos_test Mr.sl/centos7:1 --->不指定名字系统默认自己起名字
3.6 Docker命令:ps(看容器)
查看已经运行的镜像的进程
docker ps -a #查看所有运行的镜像进程(包含退出的exit)
特别提示:
STATUS:进程的状态,UP表示正在运行中,EXIT表示已经退出了。
3.7 Docker命令:attach(切入)
从本地系统中切入到某个STATUS状态是UP的镜像进程里
docker ps -a
docker attach 25c #切入到容器号为25c5cae76baf的镜像进程里
ls #已经进入容器里了
exit #退出容器
docker ps -a
容器的进程的STATUS已经处于EXIT状态(之前是后台运行的,切入进去后执行exit就等于手动退出了)
3.8 Docker命令:stop(停止)
用于停止一个正在运行着的容器进程
docker ps -a
docker stop 7d2
3.9 Docker命令:start(启动)
用于启动一个已经停止了的容器进程
docker ps -a
docker start 7d2 25c
3.10 Docker命令:rm(删容器,需要先停止)
用于删除一个已经停止了的容器进程
docker ps -a
docker rm 093e4fb8b09c
3.11 Docker命令:rmi(删镜像,给在没有容器启动的情况下)
用于删除一个未用作容器启动的本地镜像
docker images
docker rmi -f 052 #-f 强制删除(即便被占用)
docker rmi 052 #但要注意,被用作容器启动的镜像是不能删除的(需先rm删除容器进程)
3.12 Docker命令:commit(更改并保存)
将一个更改过的容器进程的容器状态保存为一个新的镜像
docker ps -a #查看启动的容器进程
docker attach 686 #切入容器进程
mkdir yunjisuan #在容器进程里创建yunjisuan目录
ls
exit #退出容器进程
docker commit 686 mr.sl/centos7:2 #将更改后的容器进程保存为一个新的镜像
docker images
生产一个新的容器并切入查看结果
docker images
docker run -d -it 06e /bin/bash
docker ps -a #查看新镜像的容器进程
docker attach 426 #切入新镜像的容器进程
ls #我们发现之前创建的目录仍旧存在
3.13 Docker命令:exec(不切入情况下执行命令或切入容器)
用于从本地操作系统上直接向容器进程发布执行命令并返回结果
docker ps -a
docker exec 686 ls /tmp #查看容器进程里的/tmp目录下所有内容
用于从本地操作系统上切入向容器并退出不关闭方法
docker pa -a
docker exec -it 686 /bin/bash
exit
3.14 Docker命令:cp(复制)
用于在容器进程和本地系统之间复制文件
ls
touch xin
docker ps -a
docker exec 686 ls /tmp #向容器进程发布命令
docker cp xin 686:/tmp
将指定容器进程的/tmp/yum.log复制到当前目录下
docker exec 686 ls /tmp
docker cp 686:/tmp/yum.log . #将本地文件复制到容器进程里
ls
3.15 Docker命令:create(创建容器,并不启动zd)
用于创建一个容器进程,但是并不启动它
docker images
docker create -it 148 #创建一个镜像的容器进程,但不直接启动
docker ps -a
docker start 5ed #启动容器进程
docker ps -a
3.16 Docker命令:diff(做对比)
查看容器进程与源镜像做对比,发生了改变的文件或文件夹
docker ps -a
cd /yunjisuan/
touch {1..6} #在容器进程中创建文件
ls
exit #退出容器进程
docker diff 686 #查看容器进程的变化
3.17 Docker命令:events(时时监测)
时时监测容器的变化情况
docker events
前台时时监控容器的变化若要检测,需要另外再起一个窗口进行操作
3.18 Docker命令:export(导出容器)
将容器进程的文件系统导出到本地
docker ps -a
docker export ab06a9794e45 > centos.tar #将容器进程导出成一个tar包
ls
3.19 Docker命令:import(导入容器自动创建镜像)
用于将export导出的文件系统创建为一个镜像
ls
docker import centos.tar Mr.sl/centos:3
docker images
3.20 Docker命令:history(查看镜像历史记录)
用于查看一个镜像的历史修改纪录
docker images
docker history 148
3.21 Docker命令:info(查看docker运行信息)
用于查看当前操作系统的docker运行信息
docker info
Containers: 1 #容器进程1个
Running: 1 #正在运行状态的容器1个
Paused: 0
Stopped: 0
Images: 8 #一共有8个镜像
3.22 Docker命令:inspect(查看某个镜像的详细信息)
查看某个镜像的详细信息(json格式)
docker images
docker inspect 148
3.23 Docker命令:kill(强行停止容器)
强行停止一个或多个正在运行状态的容器进程
docker ps -a
docker kill ab06a9794e45
3.24 Docker命令:save(导出镜像)
用于将一个镜像的文件系统导出到本地(export导出的是容器)
docker images
docker save test:1 > nginx.tar --->用ID号和镜像名都可以
ls
3.25 Docker命令:load(导入镜像)
用于将save导出到本地的tar包,重新加载为镜像(和源镜像的名字标识完全一样)
docker images
ls
docker load < test.tar #将之前nginx这个镜像的save备份导入系统
3.26 Docker命令:logs(看容器日志)
用于输出一个容器进程内的操作日志
docker ps -a
docker logs 686
docker logs --tail 3 686 #只显示容器日志的后3行
3.27 Docker命令:pause && unpause(暂停和恢复)
用于将一个或多个容器的进程暂停和恢复
docker ps -a
docker pause 686 #暂停容器进程
docker unpause 686 #恢复容器进程
3.28 Docker命令:port(端口及协议)
用于列出一个容器的端口映射及协议
docker images
docker run -dit -p 2222:22 test:1 #启动一个镜像的容器进程 -p
docker ps -a
docker port 3b5 #查看容器进程的端口映射及协议
3.29 Docker命令:rename(容器重命名)
给容器进程重命名
docker ps -a
docker rename nginx_test nginx
3.30 Docker命令:restart(重启)
重启一个容器进程
docker ps -a
docker restart 686
3.31 Docker命令:stats(容器资源使用情况)
用于时时输出容器的资源使用情况
docker ps -a
docker stats 686 --no-stream
3.32 Docker命令:tag(克隆镜像)
用于从一个指定的镜像创建另外一个镜像
docker images
docker tag 62f test:2 #也可以指定镜像名字
3.33 Docker命令:top(查看容器进程信息)
用于显示指定容器的进程信息
docker ps -a
docker top 686
3.34 Docker命令:update(调整配置)
用于调整一个或多个容器的启动配置
docker update --help
3.35 Docker命令:version and wait
version用于显示docker的版本信息
docker version
wait用于捕捉一个或多个容器的退出状态,并返回退出状态码
docker ps -a
docker wait 6321c3a3481f #需要在开一个窗口stop这个容器进程再查看
3.36 Docker命令:login && logout && push
login用于登陆docker hub官方公有仓库
logout用于登出docker hub官方公有仓库
push用于将本地镜像提交到docker hub
由于docker hub国内已经无法注册,因此无法演示上述内容
DockerHub官方公有镜像仓库:https://hub.docker.com/
四,管理应用程序数据
4.1 Volume和Bind Mount
将Docker主机数据挂载到容器
Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs。
volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
bind mounts:可以存储在宿主机系统的任意位置
tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统
4.1.1 Volume(挂载卷)
docker volume ls
cd /var/lib/docker/volumes/
docker volume create nginx-vol
docker images
docker run -dit --name nginx-test -p 80:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker exec nginx-test ls /usr/share/nginx/html
docker exec nginx-test touch /usr/share/nginx/html/xin
cd nginx-vol/_data
ls
curl 127.0.0.1
特别说明
--name #容器的名字
--mount #挂载
src #源卷的名字
dst #挂载到容器中的路径
4.1.2 Bind Mounts(绑定目录)
mkdir -p /www/html
docker run -dit --name nginx-test1 -p 81:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx
docker ps -a
docker exec nginx-test1 ls /usr/share/nginx/html
echo "yunjisuan" > /www/html/index.html
curl 127.0.0.1:81
特别提示
bind mounts可以挂载宿主机上的任意目录(创建的目录要是没有文件绑定以后对方也会没有文件),而volume先得创建后才能挂载
4.1.3 批量删除volume
使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理
docker volume ls -qf dangling=true
docker volume rm $(docker volume ls -qf dangling=true)
4.2 实战容器部署LNMP网站平台
首先我们下载一个wordpress博客(上文有所有包)
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
4.2.1 创建MySQL数据库容器
下载MySQL5.6版本镜像
docker pull mysql:5.6
docker images --->之前下载过了这里就不重新下载了
创建一个自定义网络
docker network create lnmp
docker network ls
b02d86520223 lnmp bridge local #默认驱动为网桥
启动MySQL数据库容器
docker run -dit --name lnmp_mysql --network lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=linyaonie mysql:5.6 --character-set-server=utf8
docker ps -a
特别提示
自定义网络lnmp如果不提前创建的话,在启动容器进程时会报错
如果没有提前pull好mysql:5.6那么容器在启动时会自动下载对应镜像
如果没有提前docker volume create mysql-vol,那么容器启动时会自动创建
查看容器lnmp_mysql的日志输出
docker logs lnmp_mysql
查看容器里启动的进程
docker top lnmp_mysql
4.2.2 向容器里的Mysql创建一个库并查看
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
docker exec -it lnmp_mysql /bin/bash
mysql -uroot -plinyaonie -e 'show databases;'
4.2.4 创建nginx+PHP环境容器
创建一个网页目录
mkdir -p /app/wwwroot
ll -d /app/wwwroot
下载richarvey/nginx-php-fpm镜像
docker pull richarvey/nginx-php-fpm --->之前已经下好了
docker images
启动richarvey/nginx-php-fpm镜像的容器
docker run -dit --name lnmp_web --network lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
docker ps -a
4.2.5 解压wordpress到网页目录/app/wwwroot下
ls
tar xf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot/
ls /app/wwwroot/
echo "yunjisuan" > /app/wwwroot/index.html
cat /app/wwwroot/index.html
4.2.6 博客wordpress访问测试
通过浏览器进行docker宿主机的88端口的访问测试
http://192.168.200.70:88
http://192.168.200.70:88/wordpress
特别提示
如果出现连接不上的情况,那么请按顺序执行以下命令一遍
systemctl stop firewalld
systemctl stop iptables.service
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
如果多次连续访问同一网页,那么浏览器有可能默认去掉指定的端口
若访问不到,请查看是否指定了88端口