docker
1. 什么是Docker
讲得很好的视频链接:https://www.bilibili.com/video/BV1ug411j71W?p=28
Docker是基于Go语言实现的云开源项目。通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
2. Docker安装
Docker 要求运行在 CentOS 7 以上,要求系统为64位、系统内核版本为 3.10 以上。
### 查看自己的内核
[root@lihao ~]# uname -r
3.10.0-1062.12.1.el7.x86_64
2.1 安装gcc相关环境
yum -y install gcc-c++
2.2 安装docker所需软件包
yum install -y yum-utils
2.3 设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4 更新yum软件包索引
yum makecache fast
#如果出现 failure: repodata/repomd.xml from mirrors.aliyun.com_docker-: [Errno 256] No
#请看该网址:https://blog.csdn.net/nyasm/article/details/116704921
2.5 安装Docker CE(CE是免费版)
yum install docker-ce docker-ce-cli containerd.io
2.6 Docker启动/停止/重启/开机启动/查看状态
systemctl start docker # 启动docker
systemctl stop docker # 停止docker
systemctl restart docker # 重启docker
systemctl status docker # 查看docker状态
systemctl enable docker # 开机启动
2.7 测试Docker
docker version #查看docker版本
2.8 配置阿里云镜像加速(加速下载镜像,否则默认会去dockerhub网站下载镜像,速度会比较慢)
1、介绍:https://www.aliyun.com/product/acr
2、注册一个属于自己的阿里云账户(可复用淘宝账号)
3、进入管理控制台设置密码,开通
4、查看镜像加速器自己的
2.9 配置镜像加速
# sudo mkdir -p /etc/docker
# cd /etc/docker
# vim daemon.json
{
"registry-mirrors": ["https://qiyb9988.mirror.aliyuncs.com"]
}
# sudo systemctl daemon-reload
# sudo systemctl restart docker
3. Docker必知概念
3.1 什么是镜像(image)
Docker 镜像就是一个只读的模板。
镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 就好似 Java 中的 类和对象,类就是镜像,容器就是对象!
3.2 什么是容器(container)
Docker 利用容器独立运行的一个或一组应用。
容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
3.3 什么是仓库(repository)
仓库 是集中存放镜像文件的场所。
4. Docker常用命令
4.1 帮助命令
docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。。
docker --help # 帮助
4.2 镜像命令
#1. 列出本地主机上的镜像=============================================
[root@kuangshen ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
# 上述内容解释:
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像创建时间
SIZE 镜像大小
# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同
的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
# 可选项
-a: 列出本地所有镜像,包括那些被标记为 <none> 或者 <none> <none> 的镜像。
不加a: 只会显示本地主机上的活跃镜像。也就是没有被标记为 <none> 或者 <none> <none> 的镜像
-q: 只显示镜像id
--digests: 显示镜像的摘要信息
===================
#2. 搜索镜像=============================================
# docker search 某个镜像的名称 对应DockerHub仓库(网址:https://registry.hub.docker.com/)中的镜像
# docker search 某个镜像的名称-----> 相当于就是在DockerHub仓库网址中在搜索栏搜索某个镜像在页面上展示的结果一样
[root@kuangshen ~]# docker search mysql
NAME DESCRIPTION STARS(点赞) OFFICIAL(是否官方)
mysql MySQL is a widely used, open-source relation… 9484 [OK]
# 可选项
--filter=stars=50 : 列出收藏数不小于指定值的镜像。
===================
#3. 下载镜像=============================================
# docker pull 镜像名称
# 若不指定tag,默认是latest(最新)
[root@kuangshen ~]# docker pull mysql
# docker pull 镜像名称:版本
[root@kuangshen ~]# docker pull mysql:5.7
===================
#4. 删除镜像=============================================
# 删除镜像 -f 表示强制【若不加 -f 也可以删除,但是如果该镜像正在运行,会提示因为正在运行,所以不可删除】
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个空格隔开
docker rmi -f $(docker images -qa) # 删除全部
4.3 容器命令
有镜像才能创建容器,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !
#0. 新建容器=============================================
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] # 新建容器
# 如:要创建一个名为mycontainer的容器,使用tomcat的镜像,并将容器内部的80端口映射到主机的8080端口
docker create --name mycontainer -p 8080:80 tomcat
#1. 新建容器并启动=============================================
docker run [OPTIONS] IMAGE [COMMAND][ARG...] # 新建容器并启动
# OPTIONS常用参数说明
--name="Name" # 给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个伪终端,通常和 -i 一起使用【即:容器启动后会进入其内部命令行】
-P # 随机端口映射(大写的P)
-p # 指定端口映射(小写的p),一般可以有四种写法
ip:主机端口:容器端口
ip::容器端口
主机端口:容器端口 (常用)
容器端口
如:docker run -d --name tomcat1 -p 8088(主机[对外]):8080(容器) tomcat
# 测试
[root@kuangshen ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 3 months ago 237MB
################ 若你要以 -i -t 交互模式进入容器,需要注意,你可能需要执行/bin/bash命令,否则你进去之后就是一片空白,什么命令你都执行不了。################
################ 所以我们一般以交互模式进入容器时,在执行命令的时候在后面加上 /bin/bash ,表示进入容器并开启/bin/bash职迟################
# 使用centos进行用交互模式启动容器[即:你一启动容器,就进入容器,并处于交互模式],在容器内执行/bin/bash命令!
# /bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill。
[root@kuangshen ~]# docker run -it centos /bin/bash
# 使用centos进行用守护模式启动容器,会返回容器id,不会进入容器,它是以守护式方式在运行容器
[root@kuangshen ~]# docker run centos
===================
#2. 退出容器=============================================
[root@dc8f24dd06d0 /]# exit # 使用 exit 退出容器
===================
#3. 退出容器[不让其停止运行]=============================================
ctrl+P+Q # 容器不停止退出 注意按键顺序 P按了之后再按Q
===================
#4. 列举出正在运行的容器=============================================
docker ps [OPTIONS] # 列举出正在运行的容器
# 常用参数说明
-a # 列出当前所有正在运行的容器 + 历史运行过的容器
-l # 显示最近创建的容器
-n=? # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号
===================
#5. 启动停止容器=============================================
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器 # 停止所有容器docker stop $(docker ps -a -q)
docker kill (容器id or 容器名) # 强制停止容器
===================
#6. 删除容器 -f 强制========强制删除一个正在运行的容器可能会导致数据丢失或者其他问题,建议先停止再删除========================
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -a -q) # 删除所有容器
===================
#7. 进入容器
docker exec -it 容器id /bin/bash #-it:在容器中打开新的终端,并且可以启动新的进程【/bin/bash不能少】
4.3.1 开放防火墙端口
firewall-cmd --list-ports # 查看防火墙开放的端口号
netstat -ntlp #查看当前所有tcp端口号
firewall-cmd --zone=public --add-port=8080/tcp --permanent # 开放端口 --zone #作用域 --add-port=1935/tcp #添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效
firewall-cmd --permanent --zone=public --remove-port=8080/tcp # 关闭端口
systemctl start/stop/disable/enable firewalld # 开启/关闭/禁用/启用防火墙 本质是操作的防火墙服务
firewall-cmd --reload # 重启防火墙
systemctl status firewalld # 查看防火墙状态
netstat -naop|grep 端口号 # 查看端口占用情况 netstat -anp | grep mysqld #查询mysql端口号
4.4 其他命令
#1. 查看日志=============================================
docker logs -f -t --tail 容器id
# --since 指定输出日志开始时间,即只输出指定日期后的日志
# -t 显示时间戳
# -f 打印最新的日志
# --tail 数字 显示多少条!
[root@kuangshen ~]# docker logs -tf --tail 10 c8530dbbe3b4
2020-05-11T08:46:40.656901941Z kuangshen
2020-05-11T08:46:41.658765018Z kuangshen
2020-05-11T08:46:42.661015375Z kuangshen
===================
#2. 查看容器中运行的进程=============================================
docker top 容器id
# 测试
[root@kuangshen ~]# docker top c8530dbbe3b4
UID PID PPID C STIME TTY TIME CMD
root 27437 27421 0 16:43 ? 00:00:00 /bin/sh -c ....
===================
#3. 查看容器/镜像的元数据(详细信息)=============================================
docker inspect 容器id
===================
#4. 进入正在运行的容器=============================================
docker exec -it 容器id /bin/bash #-it:在容器中打开新的终端,并且可以启动新的进程【/bin/bash不能少】这个命令最常用,下面那个不怎么用!!!
或者
docker attach 容器id #直接进入容器启动命令的终端,不会启动新的进程。进去之后好像无法操作!!!!
===================
#5. 文件复制[从容器内拷贝文件到主机上,该命令一定要在宿主机执行]=============================================
docker cp 容器id:容器内路径 主机路径
# 从主机上拷贝文件到容器内
docker cp 主机路径 容器id:容器内路径
# 测试
# 容器内执行,创建一个文件测试
[root@c8530dbbe3b4 /]# cd /home
[root@c8530dbbe3b4 home]# touch f1
[root@c8530dbbe3b4 home]# ls
f1
[root@c8530dbbe3b4 home]# exit
exit
# linux复制查看,是否复制成功
[root@kuangshen ~]# docker cp c8530dbbe3b4:/home/f1 /home
[root@kuangshen ~]# cd /home
[root@kuangshen home]# ls
f1
5. 容器数据卷
数据卷:Docker容器产生的数据,当容器删除后,该数据也就没了。数据卷就是来解决这个问题的。
作用1
:为了能将docker容器产生的数据保存数据在docker中,我们就要用到数据卷技术,简单来说,数据卷就好比redis中的持久化性质一样。
作用2
:数据卷可以在容器之间共享和重用。
比如你要启动多个项目集群,但是每个都用一些公共的数据需要修改,
那么就可以将这些数据作为数据卷放在宿主机上。
通过修改宿主机上的数据从而达到修改各个容器的数据。
【在容器里面,通常大部分容器并没有vim命令。如果遇到需要频繁修改的文件,
只有在宿主机改了再复制粘贴到容器里面。就很麻烦,而且如果多个容器都要改某个文件,也很麻烦】
实现
:将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,对容器内的操作也会影响宿主机。
当容器被删除时,宿主机的内容也不会被删除。多个容器挂载同一个目录,当其中一个容器被删除,其他容器也不会受影响。
5.1 方式一:直接使用数据卷
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名/镜像id
# 测试
[root@kuangshen ~]# docker run -it -v /home/ceshi:/home centos /bin/bash(可不要、bin/bash)