docker
1. 什么是Docker
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 中的 类和对象,类就是镜像,容器就是对象!
镜像里面包含了该容器运行所需的环境、配置、系统函数库等。Docker会在运行镜像时创建一个隔离环境,称为容器。
3.2 什么是容器(container)
Docker 利用容器独立运行的一个或一组应用。
容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
3.3 什么是仓库(repository)
仓库 是集中存放镜像文件的场所。
4. Docker常用命令
4.1 帮助命令
docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。。
docker --help # 帮助
docker images --help
4.2 镜像命令
- docker images
列出本地主机上的镜像
[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 | 镜像大小 |
可选项:
| 可选项 | 意义 |
|---|---|
| -a | 列出本地所有镜像,包括那些被标记为 |
| 不加a | 只会显示本地主机上的活跃镜像。也就是没有被标记为 |
| -q | 只显示镜像id |
| --digests | 显示镜像的摘要信息 |
- docker search
搜索镜像
[root@kuangshen ~]# docker search mysql
NAME DESCRIPTION STARS(点赞) OFFICIAL(是否官方)
mysql MySQL is a widely used, open-source relation… 9484 [OK]
- docker pull
下载镜像
[root@kuangshen ~]# docker pull mysql
# docker pull 镜像名称:版本
[root@kuangshen ~]# docker pull mysql:5.7
注意:若不指定tag,默认是latest(最新)
- docker rmi
删除镜像
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个空格隔开
docker rmi -f $(docker images -qa) # 删除全部
注意:删除镜像 -f 表示强制【若不加 -f 也可以删除,但是如果该镜像正在运行,会提示因为正在运行,所以不可删除】
4.3 容器命令
1.docker create
新建容器
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] # 新建容器
# 如:要创建一个名为mycontainer的容器,使用tomcat的镜像,并将容器内部的8080端口映射到主机的8080端口
docker create --name mycontainer -p 8080:80 tomcat
- docker run
docker run [OPTIONS] IMAGE [COMMAND][ARG...] # 新建容器并启动

OPTIONS常用参数说明:
| 参数 | 说明 |
|---|---|
| --name | 给容器指定一个名字 |
| -d | 后台方式运行容器,并返回容器的id! |
| -i | 以交互模式运行容器,通过和 -t 一起使用 |
| -t | 给容器重新分配一个伪终端,通常和 -i 一起使用【即:容器启动后会进入其内部命令行】 |
| -e | 指定环境变量 |
| -p(小写) | 随机端口映射 |
| -P(大写) | 指定端口映射 |
如:docker run -d --name tomcat1 -p 8088(主机[对外]):8080(容器) tomcat
注意:若你运行时,同时要以 -i -t 交互模式进入容器时,需要注意,你可能需要执行/bin/bash命令,否则你进去之后就是一片空白,什么命令你都执行不了。所以我们一般以交互模式进入容器时,在执行命令的时候在后面加上 /bin/bash ,表示进入容器并开启/bin/bash。
交互模式进入容器
[root@kuangshen ~]# docker run -it centos /bin/bash
- 进入正在运行的容器
docker exec -it 容器id /bin/bash #-it:表示在容器中打开新的终端
- exit
退出容器
[root@dc8f24dd06d0 /]# exit
- 退出容器[不让其停止运行]
ctrl+P+Q # 容器不停止退出 注意按键顺序 P按了之后再按Q
- docker ps
列举出正在运行的容器
docker ps [OPTIONS] # 列举出正在运行的容器
常用参数说明:
| 参数 | 说明 |
|---|---|
| -a | 列出当前所有正在运行的容器 + 历史运行过的容器 |
| -l | 显示最近创建的容器 |
| -n=? | 显示最近n个创建的容器 |
| -q | 静默模式,只显示容器编号 |
- 启动停止容器
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器 # 停止所有容器docker stop $(docker ps -a -q)
docker kill (容器id or 容器名) # 强制停止容器
- docker rm
-f 强制:强制删除一个正在运行的容器可能会导致数据丢失或者其他问题,建议先停止再删除
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -a -q) # 强制删除所有容器
5. 开放防火墙端口
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端口号
6. 其他命令
#1. 查看日志=============================================
docker logs -f -t --tail 容器id
# --since 指定输出日志开始时间,即只输出指定日期后的日志
# --tail 数字 显示多少条!
# -t 显示时间戳
# -f 打印最新的日志
[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容器产生的数据保存下来,我们就要用到数据卷技术,简单来说,数据卷就好比redis中的持久化性质一样。
好处2:数据卷可以在容器之间共享和重用。
比如你要启动多个项目集群,但是每个都用一些公共的数据需要修改, 那么就可以将这些数据作为数据卷放在宿主机上。 通过修改宿主机上的数据从而达到修改各个容器的数据。
因为在容器里面,通常大部分容器并没有vim命令。因为容器内存很小,存的就是该容器相关的命令,如vim、cat等属于linux命令。
如果遇到需要频繁修改的文件, 只有在宿主机改了再复制粘贴到容器里面。就很麻烦,而且如果多个容器都要改某个文件,很麻烦
将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,对容器内的操作也会影响宿主机。
当容器被删除时,宿主机的内容也不会被删除。多个容器挂载同一个目录,当其中一个容器被删除,其他容器也不会受影响。
5.1 数据卷常用命令

5.2 创建数据卷
方式一:针对某个文件进行数据卷创建
# 命令
docker run -it -v 数据卷名称:容器内目录 镜像名/镜像id
[root@kuangshen ~]# docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html ngix
# 查看数据卷详情
docker volume inspet 数据卷名
[root@kuangshen ~]# docker volume inspect html
方式二:针对某个文件目录进行数据卷创建
# 命令
docker run -it -v 本地目录:容器内目录 镜像名/镜像id
[root@kuangshen ~]# docker run -d --name nginx -p 80:80 -v /var/lib/ngix:/usr/share/nginx ngix
注意:本地目录比如以“/”或“./”开头,如果直接以名称开头,则会被识别会针对某个文件做数据卷,而不是目录。
浙公网安备 33010602011771号