【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
文章目录
- 一、Docker的安装与配置
- 1、docker概述
- 2、安装docker
- 3、docker架构
- 4、配置镜像加速器
- 二、Docker命令
- 1、服务相关命令
- 2、镜像相关命令
- 3、容器相关命令
- 三、Docker容器数据卷
- 1、数据卷概念及作用
- 2、配置数据卷
- 3、配置数据卷容器
- 四、Docker应用部署实战
- 1、部署MySQL
- 2、部署Tomcat
- 3、部署Nginx
- 4、部署Redis
- 五、Dockerfile
- 1、docker镜像原理
- 2、容器转为镜像
- 3、dockerfile概述及关键字
- 4、dockerfile实战案例
- (1)使用dockerfile构建自定义CentOS镜像
- (2)使用dockerfile部署springboot项目
- 六、Docker服务编排
- 1、服务编排概念
- 2、docker compose安装与使用
- 3、案例:使用docker compose编排nginx+springboot项目
- 七、Docker私有仓库
- 1、搭建私有仓库
- 2、上传镜像到私有仓库
- 3、从私有仓库拉取镜像
- 八、Docker容器虚拟化与传统虚拟机比较
一、Docker的安装与配置
1、docker概述
- Docker是一个开源的应用容器引擎
- 诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名Docker Inc)
- Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低
Docker可以运行在Windows、MAC、CentOS、UBUNTU等操作系统上
官网:https://www.docker.com
总结:Docker是一种容器技术,解决软件跨环境迁移的问题。
2、安装docker
在CentOS上安装Docker引擎:https://docs.docker.com/engine/install/centos/
- yum包更新到最新
yum update
# 更新yum软件包索引
yum makecache fast
- 安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils
# 或
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum源
# 默认国外的镜像源(不推荐,十分慢)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内阿里云的镜像源(推荐,下载速度快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 或
yum install -y docker-ce docker-ce-cli containerd.io
- 查看docker版本,验证是否成功
# 查看docker服务状态
systemctl status docker
# 如未开启,需要启动docker服务
systemctl start docker
# 查看docker版本
docker version
docker -v
如果执行 yum install -y docker-ce 报错:
failure: repodata/repomd.xml from docker-ce-stable: 【Errno 256】 No more mirrors to try.
解决办法:
执行 vim /etc/yum.repos.d/docker-ce.repo,把第一个baseurl中的$releasever改成7,然后保存退出重新安装即可。
3、docker架构
- 镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像 ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。
4、配置镜像加速器
默认情况下,将从docker hub(https://hub.docker.com/)上下载docker镜像,速度太慢。一般都会配置国内的镜像加速器:
- USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
- 阿里云
- 网易云
- 腾讯云
在这里我们用阿里云镜像加速器,登陆阿里云查看个人加速地址
注意:用阿里云加速地址时,每个人的加速器地址不同,然后在终端输入下面指令
加速器地址:https://26mtmn3n.mirror.aliyuncs.com(每个人不一样,必须登录后获取镜像加速器)
您可以通过修改daemon配置文件/etc/docker/daemon.json
来配置使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://26mtmn3n.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker# 上面操作完成后查看是否配置成功
cat /etc/docker/daemon.json
二、Docker命令
可配合菜鸟教程的Docker进行学习:https://www.runoob.com/docker/docker-command-manual.html
1、服务相关命令
- 启动docker 服务:
systemctl start docker
- 停止docker 服务:
systemctl stop docker
- 重启docker 服务:
systemctl restart docker
- 查看docker服务状态:
systemctl status docker
- 设置开机启动docker服务:
systemctl enable docker
2、镜像相关命令
- 查看镜像:查看本地所有的镜像
docker images
docker images -q #查看所有镜像的id
- 搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
- 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看
docker pull 镜像名称
- 删除镜像:删除本地镜像
docker rmi 镜像id/名称号:版本号 # 删除指定本地镜像
docker rmi `docker images -q` # 删除所有本地镜像
去docker官方查看维护可供下载的镜像版本号:https://hub.docker.com/
docker支持redis的版本
3、容器相关命令
- 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
- 创建并启动容器
# /bin/bash可加可不加,默认为/bin/bash(针对CentOS 7 镜像而言,非redis)。--name与容器名 用=或空格连接
docker run 参数 --name=容器名 版本:版本号 /bin/bash
参数说明:
-i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭
-it创建的容器一般称为交互式容器;-id创建的容器一般称为守护式容器
–name:为创建的容器命名
注意:如果想要启动已关闭退出的容器,需要先docker start 容器名,之后再exec。
- 进入容器
docker exec 参数 # 退出容器,容器不会关闭
docker exec -it c2 /bin/bash # 例
- 停止容器
docker stop 容器名称
- 启动容器
docker start 容器名称
- 删除容器:如果容器是运行状态,则删除失败,需要停止容器才能删除
docker rm 容器名称
- 查看容器信息
docker inspect 容器名称
三、Docker容器数据卷
1、数据卷概念及作用
思考:
(1)Docker 容器删除后,在容器中产生的数据还在吗?
答案:不存在,当容器被删除后,容器中产生的数据将一并被删除。
(2)Docker 容器和外部机器可以直接交换文件吗?
答案:外部机器可以与宿主机进行文件交换,但不能直接和宿主机内的容器进行交互。
(3)容器之间想要进行数据交互?
答案:将容器中的目录挂载到宿主机的数据卷目录,可以实现容器目录数据与宿主机数据卷目录数据同步。如果多个容器之间想要实现数据交互,只需将多个容器挂载同一个目录,实现多个容器的通信。
数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部计价器和容器间接通信
- 容器之间数据交换
2、配置数据卷
- 创建启动容器时,使用-v参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
将宿主机data目录与容器内的data_container进行绑定挂载
宿主机内/root/data目录会被创建
容器内/root/data_container目录也会自动创建
注:容器内部出现权限问题 在创建容器时添加 --privileged=true就可以了
复制一个宿主机Session,模拟多端操作
宿主机data创建文件,容器data_container同步创建
容器data_container创建并写入文件,宿主机data同步创建并已写入
删除容器c1,data_container随之删除,但宿主机data目录及里面的数据仍存在
重新创建容器并挂载宿主机的data目录,data_container重新获取data里面的数据,实现了容器数据持久化
一个容器可以挂载多个目录
案例:两个容器挂载同一个目录,实现两个容器的通信
宿主机的data目录和c3容器的data_c3目录进行挂载
复制一个宿主机Session,模拟多端操作
第二个会话中创建c4容器,将容器内的data_c4目录同样挂载到宿主机的data目录,并且写入数据到itcast.txt文件中
在第一个会话中,c3容器的data_c3同步过来了c4容器创建的文件和数据,实现了两个容器之间的数据交互。
3、配置数据卷容器
数据卷容器,方便挂载,例如有10个目录要挂载到多个容器,建立一个数据卷容器,把10个目录挂载后,其它容器就直接挂载到数据卷容器即可,不用每个容器重新写10条挂载的命令了。
多容器进行数据交换:
- 多个容器挂载同一个数据卷
- 数据卷容器
c1、c2、c3 都和宿主机设置了数据卷,其中 c3 是一个数据卷容器节点
配置数据卷容器:
- 创建启动c3数据卷容器,使用-v参数 设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
- 创建启动c1 c2容器,使用–volumes-from参数,后面加上要设置挂载的数据卷容器
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
HostConfig的Binds下可查看数据卷挂载配置
Mounts下可以查看具体的挂载情况,比如源目录(宿主机目录)和目的目录(容器内目录)
设置c3为数据卷容器,容器数据卷目录为/volume(名字随意)
克隆会话
查看c3挂载细节
设置c1挂载的数据卷容器为c3,此时c1容器中也创建了volume
克隆会话
设置c2挂载的数据卷容器为c3,此时c2容器中也创建了volume
此时c1、c2、c3已经相互通了,在c3中创建文件
c1中的volume文件夹中也创建了该文件
c2中的volume文件夹中也创建了该文件,同理,它们其中任意一个对其进行了更新,其他都会进行同样的修改更新
查看c1,c2的挂载细节,和数据卷容器c3的挂载目录一样,相当于在c3创建了宿主机目录的快捷方式,然后把快捷方式复制到了c1和c2,所以c3挂了也没影响,c1,c2仍可以通过数据卷和宿主机进行数据交换
数据卷小结
- 数据卷概念
- 宿主机的一个目录或文件
- 数据卷作用
- 容器数据持久化
- 客户端和容器数据交换
- 容器间数据交换
- 数据卷容器
- 创建一个容器,挂载一个目录,让其他容器继承自该容器(–volume-from)。
- 通过简单方式实现数据卷配置
四、Docker应用部署实战
1、部署MySQL
案例:在Docker 容器中部署MySQL,并通过外部MySQL客户端操作MySQL Server
问题及解决方案
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务
- 这种操作称为:端口映射
实现步骤:
- 搜索mysql镜像
docker search mysql
- 拉取mysql镜像
docker pull mysql:5.7
- 创建容器,设置端口映射、目录映射
# 在/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.7
参数说明:
- -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 用户密码
- 使用外部机器访问并操作容器中的MySQL
可以看到宿主机的conf、data、logs目录全部挂载成功并自动创建,由于宿主机的data目录挂载到了容器的/var/lib/mysql数据目录,因此访问data可以看到容器内部/var/lib/mysql的数据目录情况,包含了刚刚创建的db1数据库。
2、部署Tomcat
案例:在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。
实现步骤:
- 搜索tomcat镜像
docker search tomcat
- 拉取tomcat镜像
docker pull tomcat
- 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存放tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat# 创建容器,并设置端口映射、目录映射
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
参数说明:
- -p 8080:8080:将容器的8080端口映射到主机的8080端口
- -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps
- 部署项目
- 使用外部机器访问Tomcat
3、部署Nginx
案例:在Docker容器中部署Nginx,并通过外部机器访问Nginx。
实现步骤:
- 搜索Nginx 镜像
docker search nginx
- 拉取Nginx镜像
docker pull nginx
- 创建容器,设置端口映射、目录映射
#在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容
vim nginx.conf
在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;
}
配置完之后继续设置端口映射和目录映射
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
参数说明:
- -p 80:80:将容器的80端口映射到宿主机的80端口
- -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的/conf/nginx.conf挂载到容器的:/etc/nginx/nginx.conf配置目录
- -v $PWD/html:/usr/share/nginx/html:将主机当前目录挂载到容器的/val/log/nginx日志目录
- 使用外部机器访问nginx
4、部署Redis
需求:在Docker容器中部署Redis,并通过外部机器访问Redis。
实现步骤:
- 搜索Redis 镜像
docker search redis
- 拉取Redis 镜像
docker pull redis:5.0
- 创建容器,设置端口映射、目录映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
- 使用外部机器连接redis(Windows的redis-cli.exe客户端)
# redis-server 启动服务 ------>redis-cli 开启客户端 ctrl+c退出客户端
redis-cli.exe -h 192.168.8.100 -p 6379
五、Dockerfile
1、docker镜像原理
Docker 镜像原理:
操作系统组成部分:
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统
Linux文件系统由bootfs 和rootfs 两部分组成
bootfs:包含bootloader(引导加载程序)和 kernel(内核)
rootfs:root文件系统,包含的就是典型的Linux 系统中的/dev、/proc、/bin等标准目录和文件
不同的Linux 发行版,bootfs 基本一样,而rootfs 不同,如Ubuntu,CentOS等
- Docker 镜像是由特殊的文件系统叠加而成
- 最低端是bootfs,并使用宿主机的bootfs
- 第二层是root 文件系统rootfs ,称为base iamge
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
思考:
- Docker 镜像的本质是什么?
- 是一个分层的文件系统
- Docker 中一个CentOS 镜像为什么只有200MB,而一个CentOS 操作系统的iso 文件要几个G?
- CentOS的iso镜像文件包含bootfs和rootfs,而Docker的CentOS镜像复用操作系统的bootfs,只有rootfs和其他镜像层
- Docker 中一个Tomcat 镜像为什么有500MB,而一个Tomcat 安装包只有70多MB?
- 由于Docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多MB
2、容器转为镜像
Docker镜像如何制作?
镜像制作:
- 容器转为镜像
docker commit 容器id 镜像名称:版本号
- 将镜像打包成压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
- 将镜像的压缩文件解压,还原成镜像
docker load -i 压缩文件名称
将id为9fd38d开头的tomcat容器转为镜像itheima_tomcat:1.0
commit后部分文件生效:在容器中自己添加的文件改变生效 但是在容器中挂载的目录文件不改变生效
将镜像打包成压缩文件
将镜像的压缩文件itheima_tomcat.tar
解压,还原成镜像new_itheima_tomcat
启动镜像
3、dockerfile概述及关键字
Dockerfile 概念
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员,可以为开发团队提供一个完全一致的开发环境
- 对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员,在部署时,可以实现应用的无缝移植
Dockerfile 关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于哪个images构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile 谁写的 |
LABEL | 标签 | 用来指明dockerfile 的标签,可以使用Label代替Maintainer 最终都是在docker image基本信息中嗯可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式:RUN command 或者 RUN [“command”,“param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令和ENTRYPOINT配合使用。格式:CMD command param1 param2或者CMD [“command”,“param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build 的时候复制文件到image中 |
ADD | 添加文件 | build 的时候添加文件到iamge 中,不仅仅局限于当前build 上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build 时候的环境变量 可以在启动容器的时候 通过-e覆盖 格式:ENV name = value |
ARG | 构建参数 | 构建参数 只在构建的时候使用参时 如果有ENV 那么ENV 的相同名字的值始终覆盖ARG 的值 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build 的image 那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用-v绑定 格式:VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式:EXPOSE 8080或者EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/使用是绝对地址 如果不是/开头那么实在上一条workdir 的路径的相对路径 |
USER | 指定执行用户 | 指定build 或者启动的时候 用户 在RUN CMD ENTRYPOINT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康测试的命令 基本上没有 因为很多时候 应用本身由健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD 关键字的镜像作为基础镜像的时候 当执行FROM 完成之后 会执行ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信息量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
4、dockerfile实战案例
(1)使用dockerfile构建自定义CentOS镜像
案例一:自定义CentOS 7镜像。
要求:
默认登录路径为/usr
可以使用vim
实现步骤:
- 定义父镜像:FROM centos:7
- 定义作者信息:MAINTAINER itheima itheima@itcast.cn
- 执行安装vim命令:RUN yum install -y vim
- 定义默认的工作目录:WORKDIR /usr
- 定义容器启动执行的命令:CMD /bin/bash
- 创建使用dockerfile的镜像:
docker build -f ./centos_dockerfile -t itheima_centos:1 .
创建一个docker-files文件夹,用来存放dockerfile文件
编辑dockerfile中的脚本信息
yum install是centos上的,ubuntu用 apt install
创建dockerfile中定义的镜像
(2)使用dockerfile部署springboot项目
在Win10本机编写完代码后,将项目打成jar包。
在本机上部署项目的jar包
测试运行没问题
将jar包从target目录下拷贝到外面
将jar包文件传输到Linux服务器
将项目jar包移动到docker-files目录下,完成准备工作
案例二:定义dockerfile,发布springboot项目
实现步骤:
- 定义父镜像:FROM java:8
- 定义作者信息:MAINTAINER itheima itheima@itcast.cn
- 将jar包添加到容器:ADD springboot.jar app.jar
- 定义容器启动执行的命令:CMD java -jar app.jar
- 通过dockerfile 构建镜像:docker build -f dockerfile文件路径 -t 镜像名称:版本
FROM:引用的父镜像
MAINTAINER:作者信息
ADD:添加文件
CMD:执行命令
如果这里出现java:8找不到的错误,把java:8改为java:8-jdk
通过dockerfile构建镜像,将SpringBoot项目构建成可部署jar包的镜像
查看并运行该镜像的容器,端口映射为:服务器的9000端口映射容器内部的8080端口
由于没有指定容器name参数,系统自动分配容器名称
测试访问Linux服务器中docker部署的springboot项目容器。
六、Docker服务编排
1、服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务都会部署多个实例,如果每个微服务都要手动启动停止,维护工作量会很大。
- 要从Dockerfile build image 或者去 dockerhub 拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
服务编排: 按照一定的业务规则批量管理容器
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用
2、docker compose安装与使用
注意这里安装的compose是1.x版本,如果参照官方文档安装的docker,应该已经安装过2.x版本的compose。2.x版本的compose验证版本号的命令为:docker compose --version
安装Docker Compose
# Compose 目前已经完全支持Linux、MAC OS、Windows,在安装Compose之前,需要先安装Docker。下面以编译好的二进制包方式安装在Linux中
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose# 要安装其他版本的 Compose,请替换 v2.2.2。
# Docker Compose 存放在 GitHub,不太稳定。你可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 设置文件可执行权限,将可执行权限应用于二进制文件:
chmod +x /usr/local/bin/docker-compose# 创建软链:(可选非必须)
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose# 查看版本信息
docker-compose -version
卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3、案例:使用docker compose编排nginx+springboot项目
- 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
- 编写docker-compose.yml文件
version: '3'
services:nginx:iamge: nginxports:- 80:80links:- appvolumes:- ./nginx/conf.d:/etc/nginx/conf.dapp:image: appexpose:- "8080"
- 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
- 在./nginx/conf.d目录下编写itheima.conf文件
server {listen 80;acess_log off;location / {proxy_pass https://app:8080;}}
在~/docker-compose目录下 使用dockers-compose 启动容器
docker-compose up
测试访问:http://192.168.149.135/hello
七、Docker私有仓库
1、搭建私有仓库
Docker 私有仓库
Docker 官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
私有仓库搭建
拉取私有仓库镜像
docker pull registry
启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
打开浏览器,输入地址http://私有仓库服务器ip:5000/v2/_catalog看到{“repositories”:[]}表示私有仓库搭建成功
http://192.168.8.100:5000/v2/_catalog
修改deamon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。
# 此步用于让docker信任私有仓库地址
# 注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}
重启docker 服务
systemctl restart docker
docker start registry
vim /etc/docker/daemon.json
2、上传镜像到私有仓库
- 标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
- 上传标记的镜像
docker push 私有仓库服务器ip:5000/centos:7
3、从私有仓库拉取镜像
#拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
八、Docker容器虚拟化与传统虚拟机比较
Docker容器虚拟化 与 传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量级的、可执行的独立软件包,包含软件运行所需要的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
相同:
- 容器和虚拟机具有相似的资源隔离和分配优势。
不同:
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
- 传统的虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
磁盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
相关文章:

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…...

Python模拟A卷实操题
1.某机械公司生产两种产品。A的单件利润分别是100元,B的单件利润是150元。 每种产品由三种材料构成,现给出每种材料的库存(库存小于100000),求利润最大的生产方案。输入说明:第一行给出生产每件A产品所需要…...
Leetcode 检测相邻递增子数组
3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums ,请你找出 k 的 最大值,使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满…...

rockylinux 8安装 gcc11.2
方法 1:从源代码编译安装最新版本的 GCC 下载 GCC 源代码: 访问 GCC 官方网站下载最新版本的源代码,例如: wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz tar -xf gcc-11.2.0.tar.gz cd gcc-11.2.0安装依赖项&a…...

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-奇数序列排序
C L13 奇数序列排序 给定一个长度为N的正整数序列, 请将其中的所有奇数取出,并按增序(从小到大)输出。 输入: 共2行 第1行是一个正整数 N(不大于500); 第2行有 N 个正整数&#x…...

【AI】好用的AI记录
好用的AI 一、国内 KIMI通义 二、国外 GPT4Cursorv0...

linux安装boost.python
前言 boost.python库被用于C与Python代码间的交互,提供了两者间大部分数据类型的转换 相关环境 操作系统:Ubuntu 20.04 python版本:Python 3.8 boost版本:boost 1.78.0 安装 1.boost.python检查与卸载 在安装boost之前需要检…...

AI 扩展开发者思维方式:以 SQL 查询优化为例
在现代软件开发中,AI 技术的兴起让开发者的思维方式发生了显著变化。尤其是在 SQL 查询优化、代码重构以及算法设计等领域,AI 提供的建议不仅扩展了开发者的思考路径,还帮助他们发现以往没有意识到的潜在解决方案。 1. 传统思维模式下的 SQL…...

自定义面板,高效的游戏性能分析利器
为了更有效地聚焦并解决性能问题,UWA报告采用了分模块监控策略,确保每个模块独立成章,各司其职。然而,随着对性能分析需求的不断升级,我们已经意识到,在深入分析某些跨模块的性能瓶颈或优化点时,…...

【Linux进程特别篇】深度理解辨识僵尸进程和孤儿进程
--------------------------------------------------------------------------------------------------------------------------------- 每日鸡汤:每一份坚持都是成功的积累,只要相信自己,总会遇到惊喜。 -----------------------------…...

喜报|超维机器人荣获昇腾AI创新大赛铜奖
近日,在备受瞩目的昇腾AI创新大赛中,超维机器人凭借扎实的技术实力和创新产品,荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破,也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…...

从五种架构风格推导出HTTP的REST架构
在分布式系统中,架构风格(Architectural Style)决定了系统组件如何交互、通信、存储和管理数据。每种架构风格都有其独特的特性和适用场景。本文将从五种典型的架构风格出发,逐步探讨它们如何影响了REST(Representational State Transfer,表述性状态转移)架构风格的设计…...

vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框
方案1:排出来照片太糊了,效果不好 1.基础功能 参考: https://blog.csdn.net/weixin_45148022/article/details/135696629 https://juejin.cn/post/7327353533618978842?searchId20241101133433B2BB37A081FD6A02DA60 https://www.freesio…...

免费HTML模板和CSS样式网站汇总
HTML模板:(注意版权,部分不可商用) 1、Tooplate,免费HTML模板下载 Download 60 Free HTML Templates for your websitesDownload 60 free HTML website templates or responsive Bootstrap templates instantly from T…...

Mac打开time machine(时间机器)备份特殊文件
Mac 打开time machine(时间机器)备份特殊文件 设置“时间机器”的作用具体操作办法 前言:今天在使用Nas同步文件时发现有部分重要文件没有同步,为了省事手动拖拽复制文件,导致其中一份非常重要的文件丢失,尝…...

Qt 学习第十六天:文件和事件
一、创建widget对象(文件) 二、设计ui界面 放一个label标签上去,设置成box就可以显示边框了 三、新建Mylabel类 四、提升ui界面的label标签为Mylabel 五、修改mylabel.h,mylabel.cpp #ifndef MYLABEL_H #define MYLABEL_H#incl…...

nvm 切换 Node.js 版本
nvm 切换 Node.js 版本 0. nvm 安装1. 查看装了哪些 Node.js 版本2. 安装 Node.js 版本安装最新稳定版本.安装个18 3. 切换 Node.js 版本4. 设置默认 Node.js 版本5. 卸载 Node.js 版本6.与项目的配合使用参考资料 0. nvm 安装 安装教程就不写了,直接看别人的。 脚…...

AI绘图最强软件stable diffusion,一文带你迅速了解!
有需要stable diffusion整合包可以扫描下方,免费获取 01 — 什么是 SD Stable Difusion(简称 SD) 其三种概念。 1.用来指代稳定扩散(Stable Diffusion) 技术,如 Midjourney是基于Stable Difusion技术实现的就是指它运用了 Stable Diffusion 的技术原理。 …...

VMware重磅官宣!Workstation和Fusion彻底全部免费:支持商用
VMware 官网宣布:VMware Workstation Pro: Now Available Free for Personal Use 别问,问就是正版用户!!! VMware宣布,其桌面虚拟化产品VMware Workstation和VMware Fusion将对所有用户彻底免费࿰…...

CCS 学习记录
1.导入项目 在CCS菜单中选择Project->Import Existing CCS Eclipse Project,点击Browse找到CCS workspace所在文件夹,点击OK,CCS会自动将所选文件夹及其子文件夹下所有的CCS Projects列出。从列表中找到所要导入的项目文件夹,…...

241112.学习日志——[CSDIY] Cpp零基础速成 [01]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删
目录 1.双向链表 2.结构体的定义 3.示意图 3.代码示例 1.双向链表的尾插 示意图 代码 main.c List.h List.c 详细分析代码的执行过程 双向链表的初始化 2.双向链表的打印 代码 3.双向链表的尾删 1.双向链表 以一种典型的双向链表为例:带头双向循环链表(带头:带…...

learn-F12 Performance(性能)前端性能分析(LCP,CLS,INP)
1.前言 在浏览器开发者工具(F12)中,本地指标(Local Metrics)包括LCP( Largest Contentful Paint)、CLS( Cumulative Layout Shift)和INP( Interaction to Nex…...

XCZU47DR-2FSVE1156
XCZU47DR-2FSVE1156 芯片概述 XCZU47DR-2FSVE1156 是一款由 Xilinx 公司生产的 Zynq UltraScale™ RFSoC 芯片。该芯片集成了多种高性能组件,包括四核 ARM Cortex-A53 MPCore™ 和双核 ARM Cortex™-R5,提供了强大的计算能力和灵活性。它还具备丰富的连…...

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案
一、LoRa的优势以及与其他无线通信技术对比 (一)LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…...

【LeetCode】【算法】23. 合并K个升序链表
LeetCode 23. 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 思路 思路:用小根堆解,很强 创建一个小根堆,排序规则为小根堆排序…...

python3的基本数据类型:Dictionary(字典)的创建
一. 简介 本文开始简单学习一下 python3中的一种基本数据类型:Dictionary(字典)。 字典(dictionary)是Python中另一个非常有用的内置数据类型。 二. python3的基本数据类型:Dictionary(字典&…...

【C++】string模拟实现
各位读者老爷好,俺最近在学习string的一些知识。为了更好的了解string的结构,俺模拟实现了一个丐版string,有兴趣的老爷不妨垂阅!!! 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…...

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件
Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录:★★★★尤其注意:引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录: 【Springboot 使用EasyExcel导出Excel文件】 【Springb…...

技术分享:《越南语翻译通》App高效学习越南语的智能助手,是怎么实现高精度语音识别翻译功能的呢?
在数字化时代,语言学习和跨文化交流变得日益重要。对于那些计划前往越南工作、旅游或学习的人来说,掌握越南语无疑是一个巨大的优势。然而,对于非越南语母语者来说,语言障碍可能会成为一大难题。幸运的是,《越南语翻译…...