docker容器相关基础
1 背景
微服务部署的问题:
(1)依赖关系复杂
(2)开发、测试、生产环境有差异
(3)微服务众多,部署起来比较繁琐
(4)组件众多(如:mysql、redis、nodejs等每个应用需要自己的依赖和库,好多组件的依赖和库放在一起,可能会出现问题)
(5)不能跨基于linux内核的系统(Ubuntu系统和CentOS系统都是基于linux内核)运行
2 docker介绍
docker优点
(1)docker是虚拟机的一个系统进程,启动比较快,直接与linux的内核交互,效率比较高,并且docker体积小。
docker的组成
(1)镜像:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起。(是不会被污染的,容器只能读不能往里面写,基于镜像创建容器 ,镜像可以共享)
(2)容器:镜像中的应用程序运行后形成的进程就是容器,docker对容器做隔离,对外不可见。
(3)DockerHub
DockerHub是一个Docker镜像的托管平台,国内也有类似的DockerHub的公开服务,比如:网易云镜像服务、阿里云镜像库等。
(4)Docker是一个CS架构的程序:
服务端 :Docker守护进程,负责处理Docker指令,管理镜像和容器等。
客户端:通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务端发送指令。
3 安装docker及相关命令
docker分为CE和EE2个版本,CE是社区版(免费的),EE是企业版(收费的)
(1)CentOS系统安装docker
docker CE支持64位版本的CentOS 7,并且要求内核版本不低于3.10
(2)联网下载docker
# 安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
# 卸载之前安装的docker命令
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
# 更新本地的镜像源(默认是从国外下载的,更新为阿里云,下载镜像速度会快很多·)
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
# 安装docker CE
yum install -y docker-ce
内网安装docker
不用配置yum和镜像源了 – 需要安装包 解压 – 放到指定的目录中
开启并验证验证docker安装成功
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker的版本号
docker -v
ps -ef | grep docker
查看docker的进程 — /usr/bin 中的docker 所占用的端口号pid是98015
4 镜像
镜像名称一般是由两部分组成: [repository]:[tag]
如果没有指定tag,默认是latest,代表最新版本的镜像
如:mysql:5.7 和mysql5.6不是同一个镜像
docker --help
## 镜像相关命令的帮助提示
docker images --help
# 查看本地镜像
docker images
# 输出镜像为一个压缩包
docker save -o nginx.tar(目标tar包) nginx:latest(镜像)
# 删除一个镜像
docker rmi 镜像名或者镜像的id
# 加载压缩包为镜像
docker load -i nginx.tar
镜像拉取和推送流程图:
5 容器
容器有3种状态,运行状态,暂停状态和停止状态
# 展示所有的容器(包括运行和没运行的)
docker ps -a
# 查看正在运行中的容器
docker ps
# 删除指定容器
docker rm -f 容器名字或者容器的id
# 基于镜像创建容器 -p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(因为容器是隔离的 如:nginx容器端口是80 需要映射到宿主机上的端口才可以)
# 如果不写--name 那么容器的名字和镜像的名字是一样的
docker run --name 容器名字 -p 80:80 -d 镜像名
# 停止容器
docker stop 容器名字或者容器的id
# 开启创建好的容器
docker start 容器名字
# 查看指定容器的日志
docker logs 容器名字
# 某个容器的持续输出日志(类似于tail -500f)
docker logs -f 容器名字
# 进入容器内部修改某些东西(docker exec:进入容器执行某个命令 ;-it:类似于java的打印到控制台的语句;bash:进入容器后执行的命令(如;可以输入ll ls pwd等),bash是一个linux终端交互命令)
docker exec -it 容器名字 bash(如:ls/redis-cli)
如:想要进入redis的容器,执行连接redis客户端命令
docker -exec -it redis的容器名字 redis-cli(这是进去后执行的命令) bash
6 数据卷
容器不使用数据卷的问题:
(1)每个容器的数据都在容器内部,需要进入容器修改相关文件(比较麻烦),而且修改的这个容器不能复用。(所有容器创建后,就不建议进入内部修改了)
(2)升级维护困难,升级时需要将容器删除,内部数据(如:一些日志等)自然也就删除了。 (不行)
引入数据卷概念:
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。(这样将容器与数据分离,解耦合,方便操作容器内数据(直接操作宿主机映射的目录文件就可以),保证数据安全)
相关命令
docker volume 选项参数(创建数据卷,查看数据卷)
# 查看所有的数据卷
docker volume ls
docker volume --help
# 删除数据卷
docker volume rm 数据卷名字
选项参数: