Docker基础知识:

Docker简介:

清华大学docker镜像网站:
https://mirrors.tuna.tsinghua.edu.cn
阿里云docker镜像rpm包下载:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

Docker:
1 基于go语言编写的开源pass服务
2 交付速度快,资源消耗低,C/S架构
3 Docker三大理念:构建--运输--运行
    遵从apache2.0协议

Docker的组成:
Docker客户端:客户端使用docker命令或其它工具调用docker API
Docker服务端:Docker守护进程,运行docker容器
Docker镜像:镜像可以理解为创建实例使用的模板
Docker容器:容器是从镜像生成对外提供服务的一个或一组服务
Docker仓库:保存镜像的仓库,类似于git或svm这样的版本控制系统
官方仓库http://hub.docker.com/
Docker主机:物理机或虚拟机,用于运行Docker服务器进程和容器

Docker VS 虚拟机:
资源利用率高
开销更小,不需要启动单独的虚拟机占用硬件资源
启动速度更快

Docker的优势:
1 快速部署,短时间内可以部署成百上千个应用,更快速交付
2 高效虚拟化:不需要额外的hypervisor支持,直接基于linux现实虚拟化
相比虚拟机大幅度提升性能和效率
3 节省开支:提高服务器利用,较低支出
4 简化配置:将运行环境打包保存至容器,使用时直接启动即可
5 快速迁移和扩展:可跨平台运行在物理机,虚拟机,公有云等环境
良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是
A平台迁移到B平台

Docker缺点:
隔离性:各应用之间的隔离不如虚拟机

Docker objects --对象
镜像-images
容器-containers
网络-networks
存储卷--volume
插件--plugin

docker.ee ---> 企业版
docker.ce ---> 社区版

Docker基础命令:

容器相关命令及部分用法:
1 attach  ---进入容器内部
具体用法:
attach命令 --不要用!
使用格式:
docker attach [容器名称/ID]
介绍:
类似于vnc 操作会在各个容器界面显示,所有使用此方式进入容器的操作都是
同步显示的且exit后容器将被关闭,且使用exit退出后容器关闭!
具体使用:
[root@www16:00:29~]#docker attach ae3671d0d595
[root@ae3671d0d595 /]#

2 commit --基于容器制作镜像
使用格式:
docker commit [-m (标记信息) ] [容器ID] [镜像名称]
具体使用:
docker commit -m "install vim"  aac3a80b796a centos-vim-7.5.1804.tar.gz
-c:
-c 'CMD" ["/usr/sbin/httpd","-c","-DFOREGROUND"]'
-a:指定作者信息
-p:提交为镜像时暂停容器!

3 create --创建容器
使用格式:
docker create [镜像ID]      

4 exec  --进入容器内部
使用格式:
docker exec -it [容器名称/ID] [容器支持的命令如bash等]      

5 inspect --查看容器信息
使用格式:
docker inspect [ID] 查看容器IP
实际用法:docker inspect取容器IP/网关等
[root@www15:27:29~]#docker inspect -f "{{.NetworkSettings.IPAddress}}" 9f404ba5a255 
172.17.0.2

[root@www15:27:48~]#docker inspect -f "{{.NetworkSettings.Gateway}}" 9f404ba5a255 
172.17.0.1

docker inspect 直接跟容器名称或ID会把全部变量都取出来!    

6 kill --强行杀死正在运行的容器
具体使用:
强制关闭所有正在运行的容器:
docker kill $(docker ps -a -q)
强制关闭一个正在运行的容器:
docker kill [正在运行的容器ID]
具体应用:暴力手段
[root@www15:38:41~]#docker kill 9f404ba5a255
9f404ba5a255       

7 logs --查看容器内部日志
具体用法:
docker logs [容器名称] 一次性查看
docker logs -f [容器名称] 持续查看

8 ls ---查看当前正在运行的容器
使用格式:
docker container ls
常用选项:
-a:查看所有容器

9 pause  --暂停容器
docker container pause [容器ID]

10 port --查看端口映射
使用格式:
docker port [容器ID]

11 restart  --重启容器
docker restart [容器ID]

12 rm  --删除容器
具体使用:
docker rm [容器ID]
常用选项:
-f:强行删除容器
特殊用法:
批量删除所有容器:
docker rm -vf `docker ps -q -a`

批量删除已经退出的容器:
docker rm -f `docker ps -aq -f status=exited`

13 run --创建容器并运行
常用选项:
-i --交互式启用
-t --分配终端
-d --后台运行
--rm  --仅运行一次,停止容器后自动删除 
--name --给容器起个名字
--network --容器网络
-P --随机暴露端口
-p --指定暴露端口
使用格式:
docker run [选项] [镜像ID] [执行命令]
具体用法:
docker run -i -t --rm hello-world       

14 start --启动一个容器
使用格式:
docker start [容器ID]       

15 stats --监控容器运行资源占用情况
使用格式:
docker stats 

16 stop  --停止容器 
使用格式:
docker stop [容器ID]     

17 top --监控容器资源占用
使用格式:
docker top [容器ID]        

18 unpause --恢复暂停容器
使用格式:
docker unpause [容器ID] 

特别说明:
因为兼容老版本问题这里所有命令都支持两种形式:
1 docker 命令
2 docker container 命令

所有[容器ID]都可以替换为[容器名称]:[标签]

镜像相关命令及部分使用:

1 build  --基于Dockfile制作镜像
---Dockerfile篇章中会具体使用      

2 inspect --查看镜像信息
具体使用:
docker inspect [镜像ID]     

3 load
具体使用:
docker load -i centos-vim-7.5.1804.tar.gz

4 ls --查看镜像
docker image ls = docker images

5 pull  --从hub中拉取镜像到本地
具体用法:
docker pull [镜像名称]:[标签]       

6 push --推送镜像至仓库
具体使用:
docker push [镜像名称]:[标签]       

7 rmi --删除镜像
具体用法:
docker rmi [镜像ID]
常用选项:
-f:强制删除

8 save --导出镜像
具体使用:
docker save 6308c38088d6 > /data/centos-vim-7.5.1804.tar.gz
导出后会在本地目录下生成一个压缩文件        

9 tag --给镜像打标签
具体使用:
docker tag [镜像id] [用户名]/[仓库名]:v1
删除标签:
直接执行删除镜像命令即可!
一个标签只能指向一个镜像|一个镜像可以有多个标签 

特别说明:
因为兼容老版本问题,所有命令支持两种形式:
1 docker 命令
2 docker image 命令

所有[容器ID]都可以替换为[容器名称]:[标签]

基于容器制作镜像:

docker commit [-m (标记信息) ] [容器ID] [镜像名称]
具体使用:
docker commit -m "install vim"  aac3a80b796a centos-vim-7.5.1804.tar.gz
-c:
-c 'CMD" ["/usr/sbin/httpd","-c","-DFOREGROUND"]'
-a:指定作者信息
-p:提交为镜像时暂停容器!

docker save [容器ID] > /存放镜像压缩包的路径:
具体使用:
docker save 6308c38088d6 > /data/centos-vim-7.5.1804.tar.gz

docker load -i [镜像名称]:
具体使用:
docker load -i centos-vim-7.5.1804.tar.gz

打标签:
docker tag [镜像id] [用户名]/[仓库名]:v1
删除标签:
直接执行删除镜像命令即可!
一个标签只能指向一个镜像|一个镜像可以有多个标签

推送镜像:
docker push [镜像名]
docker login -u [账号] --推送之前要登录

进入容器内部方式总结:

进入容器的方式:
attach命令 --不要用!
使用格式:
docker attach [容器名称/ID]
介绍:
类似于vnc 操作会在各个容器界面显示,所有使用此方式进入容器的操作都是
同步显示的且exit后容器将被关闭,且使用exit退出后容器关闭!
具体使用:
[root@www16:00:29~]#docker attach ae3671d0d595
[root@ae3671d0d595 /]# 

exec命令:
使用格式:
docker exec -it [容器名称/ID] [容器支持的命令如bash等]
以交互式方式进入:
docker exec -it [容器名称] /bin/bash ---进入容器内部

nsenter命令:
通过PID进入到容器内部,使用docker inspect获取到容器PID

yum install -y util-linux --安装nsenter命令

实际用法:docker inspect取容器IP/网关等
[root@www15:27:29~]#docker inspect -f "{{.NetworkSettings.IPAddress}}" 9f404ba5a255 
172.17.0.2

[root@www15:27:48~]#docker inspect -f "{{.NetworkSettings.Gateway}}" 9f404ba5a255 
172.17.0.1

docker inspect 直接跟容器名称或ID会把全部变量都取出来!

如何获取PID?
[root@www15:28:40~]#docker inspect -f "{{.State.Pid}}" 9f404ba5a255 
6369

通过PID进入容器:
nsenter -t [PID] -m -u -i -n -p 

实际应用:
nsenter -t 6369 -m -u -i -n -p

脚本进入:
docker_in() {
    NAME_ID=$1
    PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
    nsenter -t ${PID} -m -u -i -n -p
}

docker_in $1

启动docker时报错:

docker启动时遇见的报错问题:
WARNING bridge-nf-call-iptables is disabled
WARNING bridge-nf-call-ip6tables is disabled

解决方案:
可以编辑一个文件放入配置项:
vim /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1