目录
介绍
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
- 停止并删除容器
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose down
数据库迁移
将本地数据导出成sql文件
连接服务器上的数据库
修改字符
utf8mb4_0900_ai_ci 替换为 utf8_general_ci
utf8mb4 替换为utf8
将sql文件导入服务器中的数据库
数据卷
思考这样两问题:
-
Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?
-
容器之间可不可以实现文件的共享呢?
数据卷:
-
数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上
-
一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载
将数据库的data目录映射到Linux宿主机上
- 停止mysql
docker-compose down
- 准备一个空目录存储数据库信息
mkdir -p ~/a/data
- 修改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
- 重启容器
docker-compose up -d
- 重新导入一遍数据库
后端程序部署
安装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项目,打包为镜像
-
将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux
-
创建一个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
- 通过dockerfile构建镜像
# -f :指定要使用的Dockerfile路径 -t :指定生成的镜像名称 . 镜像构建过程中的上下文环境的目录
docker build -f ./springboot-dockerfile -t app-a.
- 查看生成的镜像,并运行为容器
[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