docker

介绍

Docker是一个开源的应用容器引擎,主要作用是方便我们快速安装部署软件和程序

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上

Docker架构

运行程序----> 运行在容器中----> 镜像创建出来的-----> 镜像仓库下载过来的

仓库(Repository):仓库是集中存放镜像文件的场所

镜像(Image):镜像是用来创建容器的模版,就像是Java中的类和对象一样

容器(Container):容器是从镜像创建的运行实例,它可以被启动、停止、 删除,每个容器都是相互隔离的、保证安全的平台

Docker安装(已完成)

本课程基于CentOS 7安装Docker:

shell 复制代码
# 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 文件,修改为如下形式:

shell 复制代码
{
	"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"
  ]
}
shell 复制代码
# 重启docker
systemctl restart docker

# 查看是否成功
docker info

命令

进程

shell 复制代码
# 启动服务
systemctl start docker 

# 停止服务 
systemctl stop docker

# 重启服务	
systemctl restart docker

# 查看服务的状态	
systemctl status docker 

# 设置开机自启动 
systemctl enable docker

镜像

shell 复制代码
# 查看本地镜像 
docker images

# 搜索镜像仓库,推荐:https://hub.docker.com/
docker search 镜像名称 

# 下载(拉取)镜像,镜像名称格式为 名称:版本号
docker pull 镜像名称

# 删除镜像(慎重)
docker rmi 镜像名称

想要在当前虚拟机运行一个nginx程序

markdown 复制代码
1. 搜索docker仓库中有哪些版本的nginx镜像

2. 从docker的镜像仓库中拉取到nginx 1.18.0的镜像文件        

3. 查看本地的镜像   

4. 从本地删除nginx的镜像 

容器

shell 复制代码
# 查看本地容器
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程序)

markdown 复制代码
1. 查看容器:

2. 运行容器: 

3. 停止容器: 

4. 启动容器: 

5. 进入容器: 

6. 删除容器:

如果服务器提示你

说明你的linux服务关闭了请求转发功能, docker容器访问一般是需要做转发的,怎么开启呢?

修改文件vim /usr/lib/sysctl.d/00-system.conf,在最后追加一行net.ipv4.ip_forward=1

改完之后需要重启网络服务systemctl restart network

部署程序

部署MySQL

shell 复制代码
# 拉取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

shell 复制代码
# 拉取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容器,非常适合组合使用多个容器进行开发的场景

安装【已完成】

shell 复制代码
# 安装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目录

shell 复制代码
mkdir ~/zzyl/docker-compose -pv
cd ~/zzyl/docker-compose

2) 创建docker-compose.yml文件,内容如下

yaml 复制代码
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) 启动容器

powershell 复制代码
# 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器
docker stop $(docker ps -q)
docker rm $(docker ps -aq)

# 执行命令,启动容器
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose up -d
  1. 停止并删除容器
powershell 复制代码
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose down 

数据库迁移

将本地数据导出成sql文件

连接服务器上的数据库

修改字符

utf8mb4_0900_ai_ci 替换为 utf8_general_ci

utf8mb4 替换为utf8

将sql文件导入服务器中的数据库

数据卷

思考这样两问题:

  • Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?
  • 容器之间可不可以实现文件的共享呢?

数据卷:

  • 数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上
  • 一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载

将数据库的data目录映射到Linux宿主机上

  1. 停止mysql
shell 复制代码
docker-compose down
  1. 准备一个空目录存储数据库信息
shell 复制代码
mkdir -p ~/zzyl/data
  1. 修改docker-compose.yml添加数据卷
yaml 复制代码
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/zzyl/data:/var/lib/mysql
  redis:
   container_name: my_redis
   image: redis:5.0
   ports:
    - 6379:6379
  1. 重启容器
shell 复制代码
docker-compose up -d
  1. 重新导入一遍数据库

后端程序部署

安装jdk

shell 复制代码
#1 解压
	tar -zxvf /root/zzyl/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包

将得到的zzyl-web.jar包上传到服务器上

运行程序

shell 复制代码
java -jar /root/zzyl/zzyl-web.jar --server.port=9090

上面方式会占据控制台运行,下面是后台运行

shell 复制代码
nohup java -jar /root/zzyl/zzyl-web.jar --server.port=9090 > /root/zzyl/9090.log &

查看日志

shell 复制代码
tail -f /usr/local/9090.log

测试

192.168.150.3:9090/security/login

{
    "username":"username",
    "password":"888itcast.CN764%..."
}

前端程序部署

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师伊戈尔·西索夫所开发。

Nginx性能非常优秀,官方测试 nginx 能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

Nginx的作用有很多,我们经常使用的是用它来做静态资源服务器、负载均衡服务器和反向代理服务器。

负载均衡配置

markdown 复制代码
	upstream zz {
        server 192.168.150.3:9090;
        server 192.168.150.3:9091;
    }
        
     server {
        listen       8077;
        server_name  localhost;

		# 反向代理,处理管理端发送的请求
		location /api/ {
			proxy_pass http://zz;
			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
  1. 创建一个springboot-dockerfile文件,内容如下
dockerfile 复制代码
# 定义基础镜像(从哪个镜像的基础上开始做)
FROM java:8 
# 定义作者信息(可以省略)
MAINTAINER  itheima <itheima@itcast.cn>
# 将jar包添加到容器,并改名为app.jar
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
# 镜像启动容器的时候,执行的命令
CMD java -jar app.jar
  1. 通过dockerfile构建镜像
shell 复制代码
# -f :指定要使用的Dockerfile路径   -t :指定生成的镜像名称   .  镜像构建过程中的上下文环境的目录 	
docker build -f ./springboot-dockerfile -t app-itheima .
  1. 查看生成的镜像,并运行为容器
powershell 复制代码
[root@itcast ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app-itheima         latest              663f3e3e33fb        35 minutes ago      661MB

[root@itcast ~]# docker run -d -p 18080:8080 app-itheima:latest
5ea166a3dbec4c091d7a70f84b75703f55a9ccd93f3a45466e4eeb9ac56fdb17

[root@itcast ~]#
[root@itcast ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED            PORTS                         NAMES
5ea166a3dbec        app-itheima:latest   "/bin/sh -c 'java -j..."   7 seconds ago      0.0.0.0:18080->8080/tcp       serene_antonelli

5)访问测试

使用容器制作镜像

docker允许将一个容器直接转化为镜像,使用的命令如下:

docker commit 容器id 镜像名称:版本号
案例:修改当前的nginx容器中的index.html文件内容为hehe,然后将修改后的容器做成一个名为mynginx:hehe的镜像

powershell 复制代码
#1. 查看当前正在运行的容器
[root@itcast ~]# 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@itcast ~]# docker exec -it nginx /bin/bash
root@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.html
root@0ce0bf14399d:/# exit

#3. 将修改之后的容器生成为mynginx:hehe镜像
[root@itcast ~]# docker commit nginx mynginx:hehe
sha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e

#4. 查看镜像
[root@itcast ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mynginx             hehe                139a9ea6a600        8 seconds ago       133MB

镜像导入导出

需求:将mynginx:hehe镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中

powershell 复制代码
# 将镜像保存成tar包: docker save -o 包名 镜像:版本
[root@itcast ~]# docker save -o mynginx.tar mynginx:hehe
[root@itcast ~]# ls
mynginx.tar

# 接下来删除我们本地的mynginx:hehe镜像
[root@itcast ~]# docker rmi mynginx:hehe
Untagged: mynginx:hehe
Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd

# 然后再从tar包中将镜像导入到本机
[root@itcast ~]# docker load -i  mynginx.tar
Loaded image: mynginx:hehe

a600 8 seconds ago 133MB

[外链图片转存中...(img-szIgF7wh-1725175323664)] 



## 镜像导入导出

>需求:将`mynginx:hehe`镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中

~~~powershell
# 将镜像保存成tar包: docker save -o 包名 镜像:版本
[root@itcast ~]# docker save -o mynginx.tar mynginx:hehe
[root@itcast ~]# ls
mynginx.tar

# 接下来删除我们本地的mynginx:hehe镜像
[root@itcast ~]# docker rmi mynginx:hehe
Untagged: mynginx:hehe
Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd

# 然后再从tar包中将镜像导入到本机
[root@itcast ~]# docker load -i  mynginx.tar
Loaded image: mynginx:hehe
相关推荐
m0_7417688537 分钟前
使用docker的小例子
运维·docker·容器
学习3人组1 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神2 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen012 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦2 小时前
linux 解压缩
linux·运维·服务器
最新小梦3 小时前
Docker日志管理
运维·docker·容器
鸡鸭扣4 小时前
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
linux·运维·ubuntu
友友马5 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http
千禧年@5 小时前
微服务以及注册中心
java·运维·微服务