综合实战一:Mysql 容器化安装
- 进入 mysql 的镜像网站,查找 mysql 的镜像
mysql docker hub 官网
可以看到有这么多的 tag
- 我们选择使用最多的 5.7 版本,拉取镜像
root@139-159-150-152:/data/myworkdir/container# docker pull mysql:5.7
5.7: Pulling from library/mysql
2ec521688c56: Pull complete
f911f9b90db6: Pull complete
38eb4fe7ed26: Pull complete
01f772a6b25f: Pull complete
499456357ebf: Pull complete
274f3ad0dcec: Pull complete
3e6a5b12e1de: Pull complete
de0c5c82dbbc: Pull complete
c9bd281f4600: Pull complete
3289c4277a83: Pull complete
8b66f10a11fa: Pull complete
Digest:
sha256:1780318bdabc0edd36907bf91b47632eb912e8ea91258eca3590f8aca6f54836
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
- 我们知道 msyql 的默认端口是 3306,而且有密码,查看官网的启动用例 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 指定了 mysql 的密码信息
#启动一个 msyql,并指定密码和端口开放
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 8200:3306 -d mysql:5.7
- 我们进入容器登录,可以看到我们已经可以正常登录 msyql 了
root@139-159-150-152:/data/myworkdir/container# docker exec -it mysql bash
bash-4.2# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.41 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current
input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
- 如果我们对外开放了 8200 端口,没有防火墙的话,我们可以通过 GUI 工具远程登录到界面上。以 mysql workbench 为例。
- 释放空间
docker stop mysql
docker rm mysql
综合实战二:Redis 容器化安装
Redis 简介
Redis 出现的原因
在 Web 应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候 Web 站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的 Web 站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的 I/O 上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下几个方面:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用 PB 级别的数据和能应对百万级的流量
为了克服这一问题,NoSQL 应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。
Redis 是什么
Redis 全称 Remote Dictionary Server,中文名为远程字典服务器。
Redis 是现在最受欢迎的 NoSQL 数据库之一,Redis 是一个使用 ANSI C 编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
• 基于内存运行,性能高效
• 支持分布式,理论上可以无限扩展
• key-value 存储系统
• 开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API
Redis 的应用场景
几乎所有的大厂都在使用 Redis。Redis 提供了多种数据类型,String 类型、哈希类型、列表类型、集合类型和顺序集合类型,借助这些类型可以方便的实现多种应用,如缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、实时排行榜、社交网络。
Redis 生活案例
Redis 就像一个新华字典,可以根据某个字符可以很快的找到字典对应的字。
Redis 容器创建
- 下载 redis 镜像
root@139-159-150-152:/data/myworkdir/container# docker pull redis:7.0
7.0: Pulling from library/redis
f1f26f570256: Pull complete
8a1809b0503d: Pull complete
d792b14d05f9: Pull complete
ad29eaf93bf6: Pull complete
7cda84ccdb33: Pull complete
95f837a5984d: Pull complete
Digest: sha256:ac8ff440c1098a1fbb1b977fb51bb3c8a65ec557978fb1d50488dc9d6af11693
Status: Downloaded newer image for redis:7.0
docker.io/library/redis:7.0
- 启动 redis 容器
docker run --name redis -p 8300:6379 -d redis:7.0
- 进入容器,设置一个 key
root@139-159-150-152:/data/myworkdir/container# docker exec -it redis bash
root@c0b3c4ae457e:/data# redis-cli
127.0.0.1:6379> set mykey 1
OK
127.0.0.1:6379> get mykey
"1"
127.0.0.1:6379>
- 如果开通了防火墙,我们可以通过可视化工具连接上,可视化工具下载地址
AnotherRedisDesktopManager
- 配置链接
- 查看 key
7. 退出容器,然后释放空间
docker stop redis
docker rm redis
综合实战三、C++容器制作
源是什么
源就是来源。
就是你安装软件时,程序从哪里获取软件包(安装程序在你的机器上,但需要安装的东西却在软件源服务器上)。
源,在 Ubuntu 下,它相当于软件库,需要什么软件,只要记得正确的软件名就可以用命令抄安装:
其实你可以把他称为软件仓库。安装软件时,就是从仓库里面调取数据放在你的机器上。
sudo apt-get install 软件名
例如:你要安装 gcc 软件,那么你就可以再终端中输入 sudo apt-get install gcc,这样就能帮你装好 gcc 软件,如果源里没有这个软件时,此命令就没法完成。
什么是镜像
镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
常见的镜像文件格式有 ISO、BIN、IMG、TAO、DAO、CIF、FCD。
所谓镜像文件其实和 ZIP 压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。(安装过操作系统的人应该对 xxx.iso 不陌生)
镜像文件不仅具有 ZIP 压缩包的“合成”功能,它最重要的特点是可以被特定的软件识别并可直接刻录到光盘上。
镜像源
镜像源就是把官方的源做一个镜像,你可以在这下载软件。
比如 ubuntu 官方源在国外,下载软件可能会很慢,这时候就需要换成国内的镜像源。
我们基于 ubuntu 来制作 C++容器,运行输出 HelloWorld
可以把镜像源当做一个代理商,比如买车本来要去车厂,但是设置了一个个 4s 店以后,我去 4s 店就好了,不用跑到车厂。
中科大源
https://mirrors.ustc.edu.cn/help/
可以在该网址上查看镜像源的配置操作
制作 c++容器
- 下载 Ubuntu 镜像
root@139-159-150-152:/data/myworkdir/container# docker pull ubuntu:22.04
22.04: Pulling from library/ubuntu
2ab09b027e7f: Pull complete
Digest: sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04
- 启动容器
root@139-159-150-152:/data/myworkdir/container# docker run --name mygcc -it ubuntu:22.04 bash
root@50d527b8343e:/#
- 配置国内镜像源加速
root@50d527b8343e:/# sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
root@50d527b8343e:/#
- 安装 gcc vim
apt update
apt install gcc vim -y
- 编辑代码
root@50d527b8343e:/# mkdir src
root@50d527b8343e:/# cd src
root@50d527b8343e:/src# vim demo.c
#输入以下内容
#include <stdio.h>
int main()
{printf("hello docker!\n");return 0;
}
- 编译代码
root@50d527b8343e:/src# gcc demo.c -o demo
- 在容器中运行
root@50d527b8343e:/src# ./demo
hello docker!
- 退出容器
root@50d527b8343e:/src# exit
exit
- 这个时候可以看到我们的容器已经退出了,如果想再次进入使用 docker restart 就可以恢复容器
- 清理容器释放空间
docker stop mygcc
docker rm mygcc
综合实战四、SpringBoot 容器制作
编写 demo
使用 Spring Boot 创建一个简单的 demo, 在浏览器输出 hello docker!。
- 创建 maven 项目,选择 Spring Boot 2.x 的第一个发布版本 2.0.2.RELEASE 进行实操, 如下在 pom.xml 中添加 spring-boot 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>springboot-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!-- 项目的 pom 定义继承自 SpringBoot 的父 pom --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.2.RELEASE</version></parent><!-- Web 项目,添加 spring-boot-starter-web 依赖即可,版本号由父
pom 已经定义好了,此处省略 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!-- 添加 spring boot 项目构建插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
- 编写主函数构建 Spring 容器
package com.bittech.boot;
import org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExampleApplication {public static void main(String[] args) {SpringApplication.run(ExampleApplication.class, args);}
}
- 编写控制器
package com.bittech.boot;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/hello")
public class ExampleController {@RequestMapping(value = "")public String index() {return "Hello Spring Boot for Docker World!";}
}
- 使用 maven 打包生成 jar 包
生成的 jar 包位于项目根路径下的 target 目录
- 测试 jar 包是否可用
# 在 cmd 中执行命令测试 jar 包是否可用
java -jar D:\code\java_relearn\springboot-demo\target\springbootdemo-1.0-SNAPSHOT.jar
启动容器后, 访问 localhost:8080/hello 查看运行结果, 确认 jar 包可用。
6. 上传到 Linux 服务器备用
[zsc@VM-8-12-centos spring_demo]$ pwd
/home/zsc/dockerfile/spring_demo
[zsc@VM-8-12-centos spring_demo]$ ls
Dockerfile springboot-demo-1.0-SNAPSHOT.jar
制作容器
- 下载 Ubuntu 镜像
root@139-159-150-152:/data/myworkdir/container# docker pull
ubuntu:22.04
22.04: Pulling from library/ubuntu
2ab09b027e7f: Pull complete
Digest:
sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428
a6d21
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04
- 启动容器
root@139-159-150-152:/data/myworkdir/container# docker run -p
8080:8080 --name myjava -it ubuntu:22.04 bash
root@50d527b8343e:/#
- 配置国内镜像源加速
root@50d527b8343e:/# sed -i
's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g'
/etc/apt/sources.list
root@50d527b8343e:/#
- 安装 jdk
apt update
apt install -y openjdk-8-jdk
- 打开新的 shell 窗口,将 jar 拷贝到容器里面
docker cp ./springboot-demo-1.0-SNAPSHOT.jar myjava:/app.jar
- 查看容器中文件
root@071ceaad511a:/# ll
total 15824
drwxr-xr-x 1 root root 4096 Mar 24 10:28 ./
drwxr-xr-x 1 root root 4096 Mar 24 10:28 ../
-rwxr-xr-x 1 root root 0 Mar 24 10:24 .dockerenv*
-rw-r--r-- 1 root root 16125993 Mar 24 10:23 app.jar
lrwxrwxrwx 1 root root 7 Mar 8 02:05 bin -> usr/bin/
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot/
drwxr-xr-x 5 root root 360 Mar 24 10:24 dev/
drwxr-xr-x 1 root root 4096 Mar 24 10:27 etc/
drwxr-xr-x 2 root root 4096 Apr 18 2022 home/
lrwxrwxrwx 1 root root 7 Mar 8 02:05 lib -> usr/lib/
lrwxrwxrwx 1 root root 9 Mar 8 02:05 lib32 -> usr/lib32/
lrwxrwxrwx 1 root root 9 Mar 8 02:05 lib64 -> usr/lib64/
lrwxrwxrwx 1 root root 10 Mar 8 02:05 libx32 -> usr/libx32/
drwxr-xr-x 2 root root 4096 Mar 8 02:05 media/
drwxr-xr-x 2 root root 4096 Mar 8 02:05 mnt/
drwxr-xr-x 2 root root 4096 Mar 8 02:05 opt/
dr-xr-xr-x 206 root root 0 Mar 24 10:24 proc/
drwx------ 2 root root 4096 Mar 8 02:08 root/
drwxr-xr-x 1 root root 4096 Mar 24 10:27 run/
lrwxrwxrwx 1 root root 8 Mar 8 02:05 sbin -> usr/sbin/
drwxr-xr-x 2 root root 4096 Mar 8 02:05 srv/
dr-xr-xr-x 13 root root 0 Mar 24 10:24 sys/
drwxrwxrwt 1 root root 4096 Mar 24 10:27 tmp/
drwxr-xr-x 1 root root 4096 Mar 8 02:05 usr/
drwxr-xr-x 1 root root 4096 Mar 8 02:08 var/
- 启动 java 服务
java -jar ./app.jar
- 通过浏览器访问页面,注意确保防火墙打开
- ctrl+c 退出服务,exit 退出容器
- 释放资源
docker stop myjava
docker rm myjava
综合实战五、容器资源更新
- 我们运行一个 nginx
docker run -d --name mynginx5 -p 80:80 nginx:1.22.1
- 我们可以通过 docker top 查看容器中有哪些进程,添加 aux,可以看到占用的内存和 CPU 信息
root@139-159-150-152:~# docker top mynginx5 aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 227456 0.0 0.3 8916 6236 ? Ss 17:12 0:00 nginx: master process nginx -g daemon off;
systemd+ 227489 0.0 0.1 9304 2548 ? S 17:12 0:00 nginx: worker process
- 通过 docker stats 可以看到资源的动态变化
root@139-159-150-152:~# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d1f5c5990c95 mynginx5 0.00% 2.648MiB / 1.936GiB 0.13% 6.99kB / 2.57kB 2.29MB / 4.1kB 2
- 我们通过 docker update 更新 docker 的最大内存
root@139-159-150-152:~# docker update -m 300m --memory-swap 600m mynginx5
mynginx5
- 我们通过 docker stats 再次查看可以看到内存已经被限制到 300m 了
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d1f5c5990c95 mynginx5 0.00% 2.648MiB / 300MiB 0.88% 7.06kB / 2.57kB 2.29MB / 4.1kB 2
- 我们在容器中执行一个命令,打满 cpu
for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`
dodd if=/dev/zero of=/dev/null &
done
#说明:
#cat /proc/cpuinfo |grep “physical id” | wc -l 可以获得 CPU 的个数,我们将其表示为 N
#seq 1 N 用来生成1到N之间的数字
#for i in seq 1 N; 就是循环执行命令,从1到N
#dd if=/dev/zero of=/dev/null 执行 dd 命令, 输出到/dev/null, 实际上只占用 CPU, 没有 IO 操作
#由于连续执行N个(N是 CPU 个数)的 dd 命令, 且使用率为 100%, 这时调度器会调度每个 dd 命令在不同的 CPU 上处理,最终就实现所有CPU占用率 100%
- 执行命令配置只能使用 10%的 cpu
docker update --cpu-period=100000 --cpu-quota=10000 mynginx5
- 可以看到 cpu 已经只能到 10%左右了
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
NET I/O BLOCK I/O PIDS
d1f5c5990c95 mynginx5 9.80% 2.648MiB / 300MiB 0.88%
7.06kB / 2.57kB 2.29MB / 4.1kB 2
- 停止容器,释放资源
docker stop mynginx5
docker rm mynginx5