目录
介绍
Docker架构
Docker安装(已完成)
命令
进程
镜像
容器
部署程序
部署MySQL编辑
部署Redis
Compose
安装【已完成】
使用
案例
数据库迁移
将本地数据导出成sql文件
连接服务器上的数据库
修改字符
将sql文件导入服务器中的数据库
数据卷
后端程序部署
安装jdk
打包
上传jar包
运行程序
前端程序部署
镜像制作
使用Dockerfile制作镜像
使用容器制作镜像
镜像导入导出
介绍
Docker是一个开源的应用容器
引擎,主要作用是方便我们快速安装部署软件和程序
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上
Docker架构
运行程序----> 运行在容器中----> 镜像创建出来的-----> 镜像仓库下载过来的
仓库(Repository):仓库是集中存放镜像文件的场所
镜像(Image):镜像是用来创建容器的模版,就像是Java中的类和对象一样
容器(Container):容器是从镜像创建的运行实例,它可以被启动、停止、 删除,每个容器都是相互隔离的、保证安全的平台
Docker安装(已完成)
本课程基于CentOS 7安装Docker:
# 1、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2# 2、设置yum源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 3、安装docker,出现输入的界面都按 y yum install -y docker-ce# 4、查看docker版本,验证是否验证成功docker -v# 5、启动docker环境systemctl start docker# 6、设置开机自启动systemctl enable docker
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:
创建或修改
/etc/docker/daemon.json
文件,修改为如下形式:
{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerproxy.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn","https://mirror.baidubce.com"]}
# 重启dockersystemctl restart docker# 查看是否成功docker info
命令
进程
# 启动服务systemctl start docker # 停止服务 systemctl stop docker# 重启服务 systemctl restart docker# 查看服务的状态 systemctl status docker # 设置开机自启动 systemctl enable docker
镜像
# 查看本地镜像 docker images# 搜索镜像仓库,推荐:https://hub.docker.com/docker search 镜像名称 # 下载(拉取)镜像,镜像名称格式为 名称:版本号docker pull 镜像名称# 删除镜像(慎重)docker rmi 镜像名称
想要在当前虚拟机运行一个nginx程序
1. 搜索docker仓库中有哪些版本的nginx镜像2. 从docker的镜像仓库中拉取到nginx 1.18.0的镜像文件 3. 查看本地的镜像 4. 从本地删除nginx的镜像
容器
# 查看本地容器docker ps # 能查看正在运行docker ps -a # 能查看所有的容器(运行的和停止的)# 创建一个新的容器并运行(-d 后台运行容器,并返回容器ID -p 主机端口:容器端口 指定映射关系)docker run -d -p 80:80 --name=容器名 镜像名称# 进入容器内部docker exec -it 容器名称 /bin/bash# 启动容器docker start 容器名称# 停止容器docker stop 容器名称# 删除容器docker rm 容器名称
场景: 使用nginx镜像运行出一个nginx容器(就是一个可以对外提供服务的nginx程序)
如果服务器提示你
说明你的linux服务关闭了请求转发功能, docker容器访问一般是需要做转发的,怎么开启呢?
修改文件vim /usr/lib/sysctl.d/00-system.conf
,在最后追加一行net.ipv4.ip_forward=1
改完之后需要重启网络服务systemctl restart network
部署程序
部署MySQL
# 拉取mysql镜像 docker pull mysql:5.7# 创建并启动容器 docker run -d -p 3306:3306 --name=mysql5.7 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 \ --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
部署Redis
# 拉取redis镜像 docker pull redis:5.0# 创建并启动容器 docker run -d --name=redis5.0 -p 6379:6379 redis:5.0
Compose
服务编排 docker-compose k8s
在以后的开发中,可能存在同一环境中出现多个程序的情况,这些程序都会单独的作为容器启动,比如说:
-
container-order 订单程序
-
container-user 用户程序
-
container-redis redis
-
container-mysql mysql
这些容器需要同时启动,同时停止,如果我们一个个的去操作,就会变的很麻烦,这时候我们就需要一个批量操作容器的工具
Compose是Docker的服务编排
工具,主要用来构建基于Docker的复杂应用
Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景
安装【已完成】
# 安装docekr compose 工具 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose# 设置权限 chmod +x /usr/local/bin/docker-compose# 查看版本 docker-compose -version
使用
docker-compose主要是通过一个配置文件和几个命令来管理多个容器的
配置文件用于配置多个容器信息,命令用于控制多个容器的行为
注意: 上面两条命令执行位置必须跟docker-compose.yml位于同一个目录
案例
通过docker compose进行容器批量管理:一次性启动两个容器(mysql,redis)
1) 创建docker-compose目录
mkdir ~/a/docker-compose -pv cd ~/a/docker-compose
2) 创建docker-compose.yml文件,内容如下
version: '3' services: mysql:container_name: my_mysqlimage: mysql:5.7ports:- 3306:3306environment:MYSQL_ROOT_PASSWORD: rootcollation-server: utf8mb4_unicode_cicharacter-set-server: utf8mb4 redis:container_name: my_redisimage: redis:5.0ports:- 6379:6379
3) 启动容器
# 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器 docker stop $(docker ps -q) docker rm $(docker ps -aq)# 执行命令,启动容器 # 执行此命令的时候,需要和配置文件在同一个目录下 docker-compose up -d
4) 停止并删除容器
# 执行此命令的时候,需要和配置文件在同一个目录下 docker-compose down
数据库迁移
将本地数据导出成sql文件
连接服务器上的数据库
修改字符
utf8mb4_0900_ai_ci 替换为 utf8_general_ci
utf8mb4 替换为utf8
将sql文件导入服务器中的数据库
数据卷
思考这样两问题:
-
Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?
-
容器之间可不可以实现文件的共享呢?
数据卷:
-
数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上
-
一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载
-
将数据库的data目录映射到Linux宿主机上
2) 停止mysql
docker-compose down
2) 准备一个空目录存储数据库信息
mkdir -p ~/a/data
3) 修改docker-compose.yml添加数据卷
version: '3' services: tomcat:container_name: my_mysqlimage: mysql:5.7ports:- 3306:3306 environment:MYSQL_ROOT_PASSWORD: rootcollation-server: utf8mb4_unicode_cicharacter-set-server: utf8mb4volumes:- /root/a/data:/var/lib/mysqlredis:container_name: my_redisimage: redis:5.0ports:- 6379:6379
4) 重启容器
docker-compose up -d
5) 重新导入一遍数据库
后端程序部署
安装jdk
#1 解压tar -zxvf /root/a/jdk-11.0.18_linux-x64_bin.tar.gz -C /usr/local/ #2 配置环境变量vim /etc/profileexport JAVA_HOME=/usr/local/jdk-11.0.18export PATH=$PATH:$JAVA_HOME/bin #3 更新配置文件source /etc/profile #4 测试java -version
打包
修改配置文件中mysql和redis的连接信息,然后使用maven插件打出jar包
上传jar包
将得到的web.jar包上传到服务器上
运行程序
java -jar /root/web.jar --server.port=9090上面方式会占据控制台运行,下面是后台运行
nohup java -jar /root/web.jar --server.port=9090 > /root/web/9090.log &查看日志
tail -f /usr/local/9090.log
前端程序部署
Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师伊戈尔·西索夫所开发。
Nginx性能非常优秀,官方测试 nginx 能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
Nginx的作用有很多,我们经常使用的是用它来做静态资源服务器、负载均衡服务器和反向代理服务器。
负载均衡配置
upstream a{server 192.168.150.3:9090;server 192.168.150.3:9091;}server {listen 8077;server_name localhost;# 反向代理,处理管理端发送的请求location /api/ {proxy_pass http://a;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;}}
镜像制作
使用Dockerfile制作镜像
Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响
案例:基于jdk1.8环境运行springboot项目,打包为镜像
1) 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux
2) 创建一个springboot-dockerfile文件,内容如下
# 定义基础镜像(从哪个镜像的基础上开始做) FROM java:8 # 定义作者信息(可以省略) MAINTAINER itheima <a@a.cn> # 将jar包添加到容器,并改名为app.jar ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar # 镜像启动容器的时候,执行的命令 CMD java -jar app.jar
3) 通过dockerfile构建镜像
# -f :指定要使用的Dockerfile路径 -t :指定生成的镜像名称 . 镜像构建过程中的上下文环境的目录 docker build -f ./springboot-dockerfile -t app-a.
4) 查看生成的镜像,并运行为容器
[root@a~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE app-a latest 663f3e3e33fb 35 minutes ago 661MB[root@itcast ~]# docker run -d -p 18080:8080 app-itheima:latest 5ea166a3dbec4c091d7a70f84b75703f55a9ccd93f3a45466e4eeb9ac56fdb17[root@a~]# [root@a~]# docker ps CONTAINER ID IMAGE COMMAND CREATED PORTS NAMES 5ea166a3dbec app-a:latest "/bin/sh -c 'java -j…" 7 seconds ago 0.0.0.0:18080->8080/tcp serene_antonelli
使用容器制作镜像
docker允许将一个容器直接转化为镜像,使用的命令如下:
docker commit 容器id 镜像名称:版本号
案例:修改当前的nginx容器中的index.html文件内容为hehe,然后将修改后的容器做成一个名为mynginx:hehe的镜像
#1. 查看当前正在运行的容器[root@a~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0ce0bf14399d nginx "/docker-entrypoint.…" 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp nginx#2. 进入nginx容器,然后向主页面覆盖写入"hehe",然后退出容器[root@a~]# docker exec -it nginx /bin/bashroot@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.htmlroot@0ce0bf14399d:/# exit#3. 将修改之后的容器生成为mynginx:hehe镜像[root@a~]# docker commit nginx mynginx:hehesha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e#4. 查看镜像[root@a~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmynginx hehe 139a9ea6a600 8 seconds ago 133MB
镜像导入导出
需求:将
mynginx:hehe
镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中
# 将镜像保存成tar包: docker save -o 包名 镜像:版本[root@a ~]# docker save -o mynginx.tar mynginx:hehe[root@a ~]# lsmynginx.tar# 接下来删除我们本地的mynginx:hehe镜像[root@a ~]# docker rmi mynginx:heheUntagged: mynginx:heheDeleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd# 然后再从tar包中将镜像导入到本机[root@a ~]# docker load -i mynginx.tarLoaded image: mynginx:hehe