目录
介绍
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" ] }
# 重启docker systemctl 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_mysql image: mysql:5.7 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root collation-server: utf8mb4_unicode_ci character-set-server: utf8mb4 redis: container_name: my_redis image: redis:5.0 ports: - 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_mysql image: mysql:5.7 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root collation-server: utf8mb4_unicode_ci character-set-server: utf8mb4 volumes: - /root/a/data:/var/lib/mysql redis: container_name: my_redis image: redis:5.0 ports: - 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/profile export JAVA_HOME=/usr/local/jdk-11.0.18 export 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 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ce0bf14399d 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/bash root@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.html root@0ce0bf14399d:/# exit #3. 将修改之后的容器生成为mynginx:hehe镜像 [root@a~]# docker commit nginx mynginx:hehe sha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e #4. 查看镜像 [root@a~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mynginx hehe 139a9ea6a600 8 seconds ago 133MB
镜像导入导出
需求:将
mynginx:hehe
镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中
# 将镜像保存成tar包: docker save -o 包名 镜像:版本 [root@a ~]# docker save -o mynginx.tar mynginx:hehe [root@a ~]# ls mynginx.tar # 接下来删除我们本地的mynginx:hehe镜像 [root@a ~]# docker rmi mynginx:hehe Untagged: mynginx:hehe Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd # 然后再从tar包中将镜像导入到本机 [root@a ~]# docker load -i mynginx.tar Loaded image: mynginx:hehe