1、安装docker
# 1、 更新yum
yum -y update
# 2、卸载旧版本docker
yum remove docker docker-common docker-selinux docker-engine
# 3、安装yum所需的必须工具(软件包:yum-util),提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 4、设置yum阿里源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 5、查看可以安装docker版本
yum list docker-ce --showduplicates | sort -r
#6、选择一个版本进行安装
yum -y install docker-ce-18.03.1.ce
#7、启动docker
systemctl start docker
#8、查看docker版本,证明是否安装、启动成功
docker version
2、基本概念
1、镜像&容器
镜像
就相当于java中的类
就是安装的一个个的软件安装包,如Redis镜像,没有运行前的软件
容器
就相当于java中的对象,new出来的具体实例
就是运行docker run 镜像之后,实际运行起来的软件,同一个镜像,可以启动多个容器(也就是可以运行多个软件)
每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))
这是Docker 一大特点,每个容器之间环境都是隔离的!!!
我们甚至可以在一个服务器上,使用docker镜像,来跑出N个 mysql实例(尽管,他们的默认端口都是一样的,但还是那句话,容器间,环境是隔离的。A容器中的3306 与B容器的3306毫无关系,因为其不在一个世界呀!)
默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…
要做容器端口映射:详见:3.3.3.1.5
3、常见命令
1、基本命令
1、启动/关闭docker
systemctl start docker # 手动启动docker
systemctl enable docker # 设置开机自启
systemctl stop docker # 关闭docker
systemctl restart docker # 重启docker
2、查看docker版本
docker version # 查看docker版本
docker info # 查看docker信息
3、查看docker运行状态
systemctl status docker # 如果是在运行中的镜像,输入命令之后,会看到绿色的active
4、docker的帮助命令
docker --help # 忘记了某些命令便可使用此进行查看与回顾
docker pull --help # 比如忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用
2、docker镜像指令
1、查看已经安装的docker列表
docker images
2、搜索镜像
docker search 镜像名称
docker search --filter=STARS=9000 mysql # 搜索STARS=9000的mysql镜像
3、拉取镜像
docker pull 镜像名 # 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名:tag
注意:tag就是镜像的版本号,如mysql.5.7.30,这个版本号可以在docker hub中查看(https://hub.docker.com/search?q=&type=image)
4、删除镜像
注意,当前镜像没有被任何容器使用才可以删除
# 删除一个镜像
docker rmi -f 镜像名/镜像ID
# 删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
# 删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
# 强制删除镜像
docker image rm 镜像名称/镜像ID
5、运行容器(就是启动一个镜像实例,相当于new对象,3.2.5运行容器详解)
docker run 镜像名
docker run 镜像名:tag
3、容器指令
前言已经说了 docker 容器 就好比 咱java中的new出来对象(docker run 镜像 产生一个该镜像具体容器实例),docker 容器的启动需要 镜像的支持
1、查看正在运行的容器列表
docker ps
2、查看所有容器:包含正在运行的,已经停止的
docker ps -a
3、运行容器详解
就是启动一个镜像实例,相当于new 对象
注意:运行容器,相当于安装软件(docker run),一但运行成功,相当于容器创建成功,后面就很难修改容器启动参数了,除非删除容器,再重新运行容器
容易一旦运行成功(docker run),后面就只需要通过指令(docker stop/start/restart)去开启,停止容器(3.3.5)
所以容器运行的时候,一定要考虑清楚容器的运行参数,包括:端口映射、是否开机自启、数据挂载等
下面是一个完整的启动命令
如:运行一个docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -it -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
下面标红的最好是要配置
- -it 表示 与容器进行交互式启动
- -d 表示可后台运行容器 (守护式运行)
- –name 给要运行的容器 起的名字
- -p 6379:6379 端口映射 :宿主机端口:容器端口
- /bin/bash 交互路径
- -v /var/lib/redis/data/:/data 数据挂载:宿主机文件存储位置:容器内文件位置
- redis:5.0.5 镜像名称:tag
- –requirepass “password” 可以不要
- –restart=always 开机自启,跟随docker启动而启动
- –log-opt:是日志方面的
自用启动命令
注意,配置文件和数据最好挂在到宿主服务器中,防止数据丢失,方便配置等
docker run -it -d -p 9736:6379 --name redis6.2.7 -v /usr/local/config/redis6.2.7.conf:/etc/redis/redis.conf -v /usr/local/data/redis6.2.7/:/data redis:6.2.7
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
-v /usr/local/config/redis6.2.7.conf:/etc/redis/redis.conf :配置文件挂载,方便修改
-v /usr/local/data/redis6.2.7/:/data :数据挂载,防止容器被删除,数据在宿主服务器中,方便下次恢复
已经启动过的容器,再次启动
docker start 容器名称
docker run 镜像名
docker run 镜像名:tag
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
例子
1、拉取redis镜像
docker pull redis:5.0.5
2、启动命令
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
3、查看运行的容器
docker ps
问题
发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?
使用netstat 命令查看下端口占用情况
netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息
netstat -untlp
惊讶的发现,我们redis容器启动占用的 6379端口netstat 没有显示出来?什么情况?赶紧使用 redis desktop manger 连接测试一下
为什么不行呢 已经确定了 docker 中 redis 容器已经是在运行中 且占有端口 6379啊?
因为:占用的6379端口 仅仅是在容器中内部本身的端口,与宿主机的6379端口并无联系,我们通过宿主机Ip:6379访问此redis示例,那自然是找不到的哟!
默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…
如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映
端口映射
有了端口映射,我们就可以将宿主机端口与 容器端口绑定起来,比如 我们建立宿主机的6379端口与容器redis6379端口绑定起来,那么再访问宿主机Ip:6379 就可以访问到对应容器了
1、停止容器
# 先停止咱之前运行的 redis 容器
docker stop 容器名/容器ID
2、删除容器
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
3、容器端口与宿主系统端口映射
-p 宿主机端口:容器端口
还是使用前方的 redis 镜像 尝试 将6379端口 映射到服务器的8888 如果成功了的话 那么咱们访问服务器的8888端口就会访问到咱们的 docker 中 的容器 redis002
-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
在运行后 发现服务器的 8888 端口显示已被docker-proxy 所占用了 那么此时咱再用工具进行连接测试呢?
4、容器内部指令
1、进入容器内部:方式1
docker exec -it 容器名/容器ID /bin/bash
#进入 前面的 redis001容器
docker exec -it redis001 /bin/bash
可以看到 我已经从主机alibyleilei 跳到了容器ID 对应下的 /data 已经是进入到容器内部了
2、进入容器内部:方式2(不推荐)
docker attach 容器名/容器ID
3、退出容器
#-----直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
exit -d
# 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
5、容器停止,重启,启动,杀死
#停止容器
docker stop 容器ID/容器名
#重启容器
docker restart 容器ID/容器名
#启动容器
docker start 容器ID/容器名
#杀死容器
docker kill 容器ID/容器名
6、容器内部文件拷贝
—无论容器是否开启 都可以进行拷贝
#docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称:容器内路径 容器外路径
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称:容器内路径
7、查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
8、容器开机自启
启动容器时,使用docker run命令时 添加参数–restart=always 便表示,该容器随docker服务启动而自动启动
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
如果容器已经启动了,或者不想删除容器,怎没设置开机自启
修改其启动配置即可
docker update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名
9、容器数据挂载
什么是数据挂载?
简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
具体参考:https://blog.youkuaiyun.com/leilei1366615/article/details/106269231
命令:-v 宿主机文件存储位置:容器内文件位置
如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件
如:-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
# 运行一个docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
10、修改容器名称
docker rename 容器ID/容器名 新容器名
4、其他指令
1、保存镜像
# 将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
2、加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
3、镜像打标签
有的时候呢,我们需要对一个镜像进行分类或者版本迭代操作,比如我们一个微服务已经打为docker镜像,但是想根据环境进行区分为develop环境与alpha环境,这个时候呢,我们就可以使用Tag,来进对镜像做一个标签添加,从而行进区分;版本迭代逻辑也是一样,根据不同的tag进行区分
docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG
#
# 如:我们根据镜像 app-user:1.0.0 添加一个新的镜像 名为 app-user 标签Tag设置为alpha-1.0.0
docker tag app-user:1.0.0 app-user:alpha-1.0.0
5、运维指令
1、查看docker工作目录
sudo docker info | grep "Docker Root Dir"
2、查看docker磁盘占用
docker system df
3、删除无用的容器和镜像
# 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
4、清除所有无容器使用的镜像
注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
docker system prune -a
5、查看大文件
ex:我这里是查找 /var/lib/docker/overlay2/* 开头的且大于100m的文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
6、查看log
-- 此处 --since 30m 是查看此容器30分钟之内的日志情况。
docker logs --since 30m myredis