初始Docker
简介
- Docker是一个开源的应用容器引擎
- 可以让开发者打包到他们的应用以及依赖包到一个轻量级,可移植的容器中,发布到服务器上
- 容器采用了沙箱机制,相互隔离
- 容器性能开销低
- 解决了软件迁移引起的环境问题
安装Docker
- 下载依赖包(如果已安装建议更新 yum update)
yum install -y yum-utils
- 设置镜像仓库(国内)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum makecache fast
- 安装docker docker-ce 社区 :docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
- 验证
docker -v
docker架构
概念
- 镜像(image): Docker镜像,就相当于是一个root系统
- 容器(Container): 镜像和容器的关系,容器是镜像运行时的实体,容器可以被创建,启动,停止,暂停
- 仓库(Repository): 仓库就是用来保存镜像的,相当于代码控制中心
配置Docker容器加速器
- 执行linux命令(阿里云的)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://bn5pwokm.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
- 中科大
直接修改大括号里面的地址即可
Docker命令
服务相关的
- 启动
systemctl start docker
- 查看状态
systemctl status docker
- 停止
systemctl stop docker
- 重启
systemctl restart docker
- 开机自启动docker
systemctl enable docker.service
- 关闭自启动docker
systemctl disable docker.service
镜像相关操作
-
查看镜像:查看所有本地镜像
docker images docker images -q 查看所有镜像的id
-
搜索镜像:从网络中搜索镜像
docker search 镜像名称
-
拉取镜像:从docker仓库拉取镜像到本地,镜像名称格式:镜像名:版本号,如果不加版本号,则拉取最新版本,如果不知道版本号,可以去 https://hub.docker.com/查
docker pull 镜像名称
-
删除镜像:删除本地镜像
docker rmi 镜像id 删除指定镜像 docker rmi `docker images -q` 删除本地所有镜像
容器相关命令
-
查看容器
docker ps #查看正在运行的容器 docker ps -a # 查看所有容器
-
创建并启动容器
docker run 参数 docker run -it --name=cl centos:7 /bin/bash
参数说明
- -i:保持容器运行。通常与-t同时使用。容器创建后自动进入容器中,退出容器,容器自动关机
- -t:为容器重新分配一个为输入终端通。
- -d:以守护模式运行容器,即使退出容器,容器也不会关机,但需要docker exec进入容器
docker exec -it 容器Id /bin/bash 例:docker exec -it e71da0e85618 /bin/bash
- –name: 为创建的容器命名
- -it 创建的容器为交互是容器 -id创建的容器一般为守护容器
-
进入容器
docker exec -it 容器Id /bin/bash exit 退出容器
-
停止容器
docker stop 容器名称
-
删除容器
docker rm 容器名称
-
查看容器信息
docker inspect 容器名称
-
设置开机自启
docker update 容器名称或id --restart=always 开启自启
- 重启容器即可
docker restart 容器id
Docker容器的数据卷
概念
数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以挂载多个数据卷
数据卷作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间交换数据
配置数据卷
- 创建启动容器时,使用-v设置数据卷
docker run ..... -v 宿主机目录(文件):容器内目录文件... # 多个数据卷的话多个-v就行了
注意:docker run -it -v /root/data:/root/data_container centos:7 /bin/bash
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
- 多个容器挂在一个数据卷上只需要写相同的宿主的目录即可
数据卷容器
数据卷容器![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fe102f3079951fc5798937249e2651d1.png)
多容器进行数据交换
- 多个容器挂载到同一个数据卷上
- 数据卷容器
配置数据卷容器
- 启动创建容器数据卷
docker run -id --name=c3 -v /文件名称 centos:7 /bin/bash
- 创建 容器,使用–volumes-from参数设置数据卷
docker run -it --name=c2 --volumes-from 数据卷容器名称 centos:7 /bin/bash
- 查看容器中目录映射到宿主机的目录
docker inspect 容器id | grep Mounts -A 20
应用部署
端口映射
- 容器内部的网络服务和外部机机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器需要外部机器访问时,可以将容器中提供的服务的端口映射到宿主机的端口上,外部机器访问宿主机的改端口,从而间接访问容器中的服务
Mysql部署
步骤:
- 搜索镜像
docker search mysql
- 镜像下拉
docker pull mysql:5.6
- 创建容器,设置端口映射,目录映射
# 在/root目录下创建mysql目录用于存储mysql 数据信息 mkdir ~/mysql cd ~/mysql
参数说明:docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
* -p 3307:3306 :将容器的3306端口映射到宿主机的3307端口
* -v $PWD/conf:/etc/mysql/conf.d \ :将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf。配置目录
* -v $PWD/logs:/logs :将主机当前目录下的logs目录挂载到容器的/logs。日志目录
* -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的/var/lib/mysql 。数据目录
* -e MYSQL_ROOT_PASSWORD=123456 :初始化root用户密码
redis部署
步骤
- 搜索镜像
docker search redis
- 下拉镜像
docker pull redis:5.0
- 创建容器
docker run -it --name=redis -p 6379:6379 redis:5.0
DockerFile
原理
- Docker镜像是有特殊的文件系统叠加而成
- 最低层是bootfs,并使用宿主机的bootfs
- 第二层root文件系统rootfs,称为base image
- 然后往上叠加其他镜像文件
- 同一文件系统(union File System)技术可以整合不同层为一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于面的镜像称为父镜像,最底部的镜像成为基础镜像
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
镜像制作
- 容器转为镜像
docker commit 容器id 镜像名称:版本号 docker save -o 压缩文件名称 镜像名称:版本号 docker load -i 压缩文件名称
概念
- dockerfile是一个文件
- 包含了一条条指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
详细参考:
https://docs.docker.com/engine/reference/builder/#label
案例
自定义centos7镜像。要求
- 默认登陆路径为/usr
- 可以使用vim
步骤
vim dockerfile名称
在文件中写入
FROM centos:7
MAINTAINER ljk <dddddd>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
执行命令:
docker build -f ./dockerfile名称 -t 镜像名称:镜像版本 .
Docker服务编排
概念
微服务架构的应用系统中一般包含若干个微服务,每一个微服务一般都会部署多个实例,每一个微服务都要手动启停操作,维护工作量十分大
- 要从Dockerfile build image 或dockerhub拉去image
- 要创建多个容器
- 要管理这些容器(启动暂停删除)
**服务编排:**按照一定的业务员规则批量管理容器
Docker Compose
Docker Compose是一个服务编排多容器部署的工具,提供命令集管理容器化应用的完整开发周期,包含服务构建,启动和停止
使用步骤
- 利用dockerfile定义运行环境镜像
- 使用docker-compose.yml定义组成应用的服务
- 运行 docker-compose up 启动应用
安装Docker Compose
- 下载Docker Compose二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 对刚刚下载的二进制文件添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 通过命令检查是否安装成功
docker-compose --version
- 卸载
rm /usr/local/bin/docker-compose
基本命令
#构建启动nignx容器
docker-compose up -d nginx
#进入nginx容器中
docker-compose exec nginx bash
#将会停止UP命令启动的容器,并删除容器
docker-compose down
#显示所有容器
docker-compose ps
#重新启动nginx容器
docker-compose restart nginx
#构建nginx镜像
docker-compose build nginx
#不带缓存的构建nginx镜像
docker-compose build --no-cache nginx
#查看nginx的日志
docker-compose logs nginx
#查看nginx的实时日志
docker-compose logs -f nginx
#验证(docker-compose.yml)文件配置,
#当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
docker-compose config -q
#以json的形式输出nginx的docker日志
docker-compose events --json nginx
#暂停nignx容器
docker-compose pause nginx
#恢复ningx容器
docker-compose unpause nginx
#删除nginx容器
docker-compose rm nginx
#停止nignx容器
docker-compose stop nginx
#启动nignx容器
docker-compose start nginx
使用Docker Compose编排nginx+springboot项目
-
创建Docker-Compose目录
mkdir docker-composecd docker-compose
-
编写docker-compose.yml文件
version: '3' services: nginx: image: nginx ports: - 80:80 links: - app volumes: - ./nginx/conf.d:/etc/nginx/conf.d app: image: app expose: - "8080"
-
创建./nginx/conf.d
mkdir -p ./nginx/conf.d
-
在./nginx/conf.d目录下编写sss.conf配置文件
server{ listen 80; access_log off; location / { proxy_pass http://app:8080;
}
}
````
- 使用命令启动 docker-compose up
私有仓库
私有仓库的搭建
- 拉取私有仓库镜像
docker pull registry
- 启动私有仓库
docker run -id --name=registry -p 5000:5000 registry
- 打开浏览器验证(http://ip:端口号/v2/_catalog)
- 修改配置文件
vim /etc/docker/daemon.json { "registry-mirrors": ["https://bn5pwokm.mirror.aliyuncs.com"], "insecure-registries": ["http://ip:端口"] }
- 重启docker
systemctl restart docker docker start registry
将镜像上传私有仓库
- 对镜像打标记为私有仓库镜像
docker tag centos:7 ip:端口/centos:7
- 上传标记镜像
docker push ip:端口号/centos:7
拉取私有镜像
docker pull ip:端口号/centos:7
Docker Vs 虚拟机
相同点:
1. 容器和虚拟机具有相似的资源隔离和分配优势
不同点:
1. 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
2. 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统