文章目录
- 1.简介
- 1.1 与KVM对比
- 2 安装docker
- 3 Docker的操作命令
- 3.1 查找镜像:search
- 3.2 下载镜像:pull
- 3.3 查看本地镜像:images
- 3.4 本地构建自定义镜像:build
- 3.5 运行本地镜像:run
- 3.6 查看已有容器:ps
- 3.7 切入到容器进程:attach
- 3.8 停止运行中的容器:stop
- 3.9 启动exit状态的容器:start
- 3.10 删除exit状态容器:rm
- 3.11 删除未使用的镜像:rmi
- 3.12 保存新镜像:commit
- 3.13 指定容器执行命令:exec
- 3.14 本地与容器之间复制文件:cp
- 3.15 创建容器但不启动:create
- 3.16 查看变化:diff
- 3.17 实时监控容器变化:events
- 3.18 将容器导出为本地文件:export
- 3.19 将export导出的文件创建为镜像:import
- 3.20 查看镜像历史修改记录:history
- 3.21 查看当前操作系统docker运行信息:info
- 3.22 查看镜像详细信息:inspect
- 3.23 强行停止运行中的容器:kill
- 3.24 将镜像导出为本地文件:save
- 3.25 将save导出的文件重新加载为镜像:load
- 3.26 查看某容器进程的操作日志:logs
- 3.27 暂停|恢复容器进程:pause|unpause
- 3.28 列出容器的端口映射及协议:port
- 3.29 容器重命名:rename
- 3.30 重启容器进程:restart
- 3.31 时时输出容器的资源使用情况:stats
- 3.32 指定镜像创建另一个镜像:tag
- 3.33 显示容器的进程信息:top
- 3.34 调整容器的启动配置
- 3.35 其他一些辅助命令:
- 4 管理应用程序数据
- 5 部署LNMP+wordpress个人博客
1.简介
docker是一个开源的应用容器引擎,可以将应用及其依赖包,一起打包成一个镜像,在容器中使用的时候,也是进程隔离,相互之间没有任何借口
- 一个完整的Docker由以下几个部分组成:
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
-
Docker功能特性
隔离环境(系统,网络,文件系统)与应用;解决依赖与版本问题;易于开发,开箱即用;节点与容器快速扩容;镜像制作简单,管理方便 -
应用场景
- web应用的自动化打包和发布;
- 自动化测试和持续集成,发布;
- 应用服务,如mysql,redis等;
- k8s私有云
1.1 与KVM对比
- KVM简介
在支持虚拟化的硬件基础上,在硬件的Hapervisor层进行硬件虚拟化,在这些V硬件上,需要安装新的操作系统,然后再安装服务
对比 | KVM | Docker |
---|---|---|
安全性 | 高,各个虚拟化之间,安装操作系统完全隔离,硬件隔离,相互连接需要通过TCP三次握手 | 低,多个容器运行在同个沙盒中,虽然完全隔离,但是一个容器中毒,其他容器就存在危险 |
稳定性 | 高,通过硬件虚拟化,稳定性很高,除非硬件损坏 | 低,通过进程虚拟,进程存在宕机可能,且docker本身也存在宕机可能 |
资源占用 | 高,新的系统所需磁盘,CPU,内存,网络带宽都较大,近似真是服务器 | 低,一个操作系统上虚拟多个进程,相较于安装多个系统,占用的资源少得多 |
运行速度 | 慢,创建,启动缓慢,需要安装系统 | 快,容器启动极快,同个镜像支持同时启动多个镜像 |
2 安装docker
- 基础环境:
centos 7.5 - 选择版本:
Docker CE(社区版)
Docker EE(企业版,收费)
centos 7直接yum安装的docker版本太低,选择新建yum配置文件,安装最新的社区版
#安装依赖包
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
#安装ce版,配置开机启动
yum -y install docker-ce
systemctl start docker
systemctl enable docker
#查看版本
docker version
3 Docker的操作命令
添加docker国内镜像源
vim /etc/docker/daemon.json
#内容为
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
#重新加载systemctl缓存,重启docker
systemctl daemon-reload
systemctl restart docker
3.1 查找镜像:search
docker search centos
#name:镜像名,*/*,作者/镜像名
#description:描述
#stars:星级
#official:是否官方
#automated:是否自动化
#查找星级多于100的centos镜像
docker search centos -f stars=100
#多条件查找使用参数--filter,查找官方发布,星级大于100的centos镜像
docker search centos --filter is-official=true --filter stars=100
3.2 下载镜像:pull
#可以先查找需要的镜像
docker pull centos:7
#centos:7 镜像名:版本
3.3 查看本地镜像:images
docker images
#respository:镜像仓库,下面罗列出本地已有镜像名
#tag:镜像标记(版本?区分同名镜像)
#images id:镜像ID号
#created:该镜像创建时间
#size:该镜像大小
3.4 本地构建自定义镜像:build
需要创建Dockerfile文件,另解
3.5 运行本地镜像:run
docker run -dit --name *** -p 2222:22 镜像ID
#-d:后台启动
#-i:可以进行命令交互
#-t:制作伪终端用于登录
#--name ***:指定容器的别称
#-p 2222:22:将本地2222端口映射到容器中 的22端口
#-e:启动时,设置环境变量
3.6 查看已有容器:ps
docker ps -a
#-a:查看所有的容器
#container id:容器ID
#status状态,up为正在运行,exit表示未运行
#不加-a参数只能查看已运行的容器
3.7 切入到容器进程:attach
docker attach ***
#指定容器ID切入一个status为up的容器
#输入exit退出容器,status会变成exit
3.8 停止运行中的容器:stop
docker stop ***
#指定容器ID停止
3.9 启动exit状态的容器:start
docker start 容器ID
3.10 删除exit状态容器:rm
docker rm 容器ID
3.11 删除未使用的镜像:rmi
docker rmi -f 镜像ID
#作容器启动的镜像是不能占用的,-f参数强制删除
3.12 保存新镜像:commit
将一个更改过的容器进程的容器状态保存为一个新的镜像
#切入到容器,修改内容,然后退出
docker attach 容器ID
mkdir yunjisuan
exit
#将更改后的容器进程保存为新镜像
docker commit 容器ID 作者/新镜像名(名称:版本)
#若成功保存,则以此新镜像为基础启动的容器中,也该存在刚才创建的目录
3.13 指定容器执行命令:exec
用于从本地操作系统上直接向容器进程发布执行命令返回结果
docker exec 容器ID ls /tmp
docker exec 容器ID 命令
docker exec -it 容器ID /bin/bash
#指定某容器启动一个bash交互界面,exit为退出,这种方式不会改变容器运行状态
3.14 本地与容器之间复制文件:cp
#将指定容器的文件或目录里复制到当前目录
docker cp 容器ID:/tmp/yun.txt
#复制本地文件到容器中
docker cp /tmp/yun.txt 容器ID:/tmp/
3.15 创建容器但不启动:create
docker create -it 镜像ID
#容器状态应该是EXIT
3.16 查看变化:diff
查看容器进程与源镜像的差别,作对比
docker
3.17 实时监控容器变化:events
docker events
#需要另起窗口进行操作
3.18 将容器导出为本地文件:export
docker export 容器ID > test.tar
#将容器进程导出成一个tar包
3.19 将export导出的文件创建为镜像:import
用于将export导出的文件系统创建为一个镜像
docker import test.tar jc/centos:3
3.20 查看镜像历史修改记录:history
docker history 镜像ID
3.21 查看当前操作系统docker运行信息:info
docker info
#containers:容器进程数
#runnig:正在运行的容器数
#images:总镜像数
...等等
3.22 查看镜像详细信息:inspect
docker inspect 镜像ID
3.23 强行停止运行中的容器:kill
docker kill 容器ID
3.24 将镜像导出为本地文件:save
docker save 镜像名/ID > 文件名.tar
#把一个镜像压缩为一个文件
3.25 将save导出的文件重新加载为镜像:load
docker load < test.tar
#恢复时,镜像名和之前导出的时候保持一致
3.26 查看某容器进程的操作日志:logs
docker logs 容器ID
docker logs --tail 5 容器ID
#查看最后5行
3.27 暂停|恢复容器进程:pause|unpause
docker pause 容器ID #暂停
docker unpause 容器ID #恢复
3.28 列出容器的端口映射及协议:port
docker port 容器ID
#查看容器进程的端口映射及协议
3.29 容器重命名:rename
docker rename 容器原名称 容器新名称
3.30 重启容器进程:restart
docker restart 容器ID
3.31 时时输出容器的资源使用情况:stats
docker stats 容器ID
#保持输出页面,ctrl+c退出
docker stats 容器ID --no-stream
#--no-stream 只输出一次
3.32 指定镜像创建另一个镜像:tag
#例子:
docker tag test:1 test:2
#源镜像也可以指定镜像ID
3.33 显示容器的进程信息:top
docker top 容器ID
3.34 调整容器的启动配置
#查看命令帮助
docker update --help
#可以调整cpu,mem等
3.35 其他一些辅助命令:
#查看版本
docker version
#监听容器的退出状态并返回状态码,但是需要另起状态
docker wait 容器ID
#login 用于登陆docker hub官方共有仓库
#logut 登出
#push 将本地镜像提交到docker hub
#docker hub国内不能注册
dockerhub官方公有镜像仓库:https://hub.docker.com/
4 管理应用程序数据
4.1 分类
- volumes:卷管理,docker管理宿主机文件系统的一部分,默认的目录是/var/lib/docker/volumes/
- bind mounts:绑定挂载,指定本地目录挂载到容器中的目录,使得容器产生的数据能保存在本地目录
- tmpfs:挂载存储在宿主机系统的内存中个,而不会写入磁盘
4.2 volume卷管理
创建卷,查看卷信息
#创建一个卷,默认创建到默认目录
docker volume create nginx-vol
#查看已有volume卷
docker volume ls
#查看详细信息
docker volume inspect nginx-vol
volume的挂载方式
#在运行镜像的时候挂载
#例如启动一个nginx镜像
docker run -dit --name nginx-test -p 80:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
#--mount:代表启用挂载
#src:卷的名字,自动去默认目录找
#dst:挂载到容器中的路径
#验证,先在容器中创建一个文件
docker exec nginx-test touch /usr/share/nginx/html/test.txt
docker exec nginx-test ls /usr/share/nginx/html/
#再查看本地是否写入
ls /var/lib/docker/volumes/nginx-vol/_data/
#成功挂载时,容器进程产生的数据就写入磁盘了,实现持续化存储
4.3 bind mount 绑定挂载
#这种方式可以创建一个目录用来挂载
mkdir /data/nginx
docker run -dit --name nginx-test2 -p82:80 --mount type=bind,src=/data/nginx,dst=/usr/share/nginx/html nginx
#若想挂载volumes卷中的目录,启动镜像时需要指定卷下的_data目录:
docker run -dit --name nginx-test2 -p81:80 --mount type=bind,src=/var/lib/docker/volumes/nginx-vol/_data,dst=/usr/share/nginx/html nginx
#type:指定挂载种类为bind
#-p 81:80:启动多个nginx容器时,注意本地端口不要冲突
#--name nginx-test2:容器名也不要冲突
#多个容器可以挂载同个卷(目录)
5 部署LNMP+wordpress个人博客
5.1 部署mysql容器
下载一个wordpress博客
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
#先创建一个自定义网络,驱动为bridge
docker network create lnmp
#查看创建的docker网络
docker network ls
#下载mysql 5.6镜像
docker pull mysql:5.6
docker run -dit --name lnmp_mysql --network lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 --character-set-server=urf8
#不指定type,则适用volumes挂载,会若无此卷,会子弟用创建
#-e:在启动镜像时,设置环境变量
#在lnmp_mysql容器中创建一个库
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "create database wp"'
#sh -c:让bash将一个字符串作为完整的命令来执行
5.2 部署nginx+php环境容器
#创建一个目录,作为挂载的网页目录
mkdir -p /data/nginx/
#将下载的wordpress解压到此目录下
tar xf wordpress-4.7.4-zh_CN.tar.gz -C /data/nginx/
mv /data/nginx/wordpress/* /data/nginx/
rm -rf /data/nginx/wordpress
#下载richarvey/nginx-php-fpm镜像,然后启动
docker pull richarvey/nginx-php-fpm
docker run -dit --name lnmp_web --network lnmp -p 88:80 --mount type=bind,src=/data/nginx,dst=/var/www/html richarvey/nginx-php-fpm
#最后使用浏览器访问IP:88端口,访问成功,安装好博客就搭建好了
#需要注意的是此处的mysql主机需要指定本地IP