云原生

云原生

Docker

docker.png

安装 docker

官网教程:https://docs.docker.com/engine/install/

Ubuntu(Debian 类似):

  1. 卸载旧版 Docker
1
2
3
4
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Debian
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
  1. 更新本地包的索引,安装 Docker 所需的依赖
1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
  1. 下载 Docker 的 GPG 密钥并设置权限
1
2
3
4
5
6
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Debian
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. 将 Docker 的官方 APT 源添加到 Ubuntu 系统中
1
2
3
4
5
6
7
8
9
10
11
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# Debian
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装 Docker
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

CentOS(7):

  1. 卸载旧版本以及关联的依赖项
1
2
3
4
5
6
7
8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
  1. 安装必要的软件包
1
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 添加 Docker 的 GPG 密钥
1
2
3
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装最新版本的 Docker 引擎及其所有依赖项
1
2
3
4
5
yum install -y docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin

启动与自启

1
2
3
4
5
6
systemctl enable docker --now # 相当下面2个命令
systemctl start docker #启动
systemctl enable docker #开机自启
systemctl stop docker #停止
systemctl restart docker #重启
systemctl status docker #查看状态

配置镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://cg6pt9r4.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

基础命令

1
2
3
docker version # 检查版本
docker info #查看系统信息,镜像和容器数量
docker system df # 容器、数据卷、镜像等空间查看

镜像管理:

1
2
3
4
5
6
7
8
9
10
11
12
# 拉取最新版镜像(nginx:latest 不写默认是 latest)
docker pull nginx
# 拉取指定版本镜像
docker pull nginx:1.20.1

# 查看所有本地镜像,-a 含历史镜像
docker images

# 删除镜像,-f 强制删除
docker rmi 镜像名:版本号/镜像id
docker rmi -f 镜像 镜像 # 删除多个镜像
docker rmi -f $(docker images -aq) #删除所有镜像

容器管理:

  • docker run 创建并运行容器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run --name mynginx -d --restart always -p 88:80 nginx
# --name :容器名称
# -d :后台运行
# --restart always: 开机自启
# -p 本机端口:容器端口: 端口映射(本机有多个 ip 时可指定)
# -p 8080-8090:8080-8090:映射一个端口范围,前后必须对应

docker run -it --rm --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 \
-d mysql mysql -uroot -p
# -it:进入 Docker 容器的交互式终端,通常与 /bin/bash 或 /bin/sh 等 shell 命令一起使用
# --rm :在容器停止后自动删除
# -e :设置环境变量(这里设置 mysql 密码)
# 镜像名后跟着的命令,表示启动容器后会自动执行的命令


docker ps # 查看正在运行的容器
docker ps -a # 查看所有
docker ps -n=5 #显示最近创建的5个容器
# 查看所有停止的容器
docker ps -a -f status=exited
  • 管理容器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 停止容器
docker stop 容器
# 停止所有容器
docker stop $(dokcer ps -aq)

# 启动容器
docker start 容器
# 重启容器
docker restart 容器

# 删除停止的容器
docker rm 容器
# 强制删除正在运行中的容器
docker rm -f 容器
#全部删除
docker rm -f $(docker ps -aq)

# 动态地更新容器的配置
docker update 容器 --restart always

# 创建容器
docker create 镜像
  • 容器信息:
1
2
3
4
5
6
7
8
docker stats # 运行状态
docker logs 容器 # 查看日志(-f 跟踪日志)
docker top 容器 # 进程信息
docker inspect 容器 # 查看容器元数据

# 查看容器 ip
docker inspect \
--format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器

交互方式

交互模式:

1
2
3
4
5
6
7
8
9
10
11
# 进入容器,开启一个新的终端
docker exec -it 容器 /bin/bash
#进入正在运行的终端,不会启动新进程
docker attach 容器

# 用一个 mysql 容器进入交互模式控制另一个 mysql 容器,并在退出容器时删除
docker run -it --rm mysql:5.7 mysql -h容器ip -uroot -p
docker run -it centos /bin/bash # 交互式启动并进入容器

exit # 退出交互模式
Ctrl+P+Q #退出不停止

挂载数据:

1
2
3
4
# 将主机的 /data/html 挂载到容器 /usr/share/nginx/html 中
docker run --name=mynginx -d -p 88:80 \
-v /data/html:/usr/share/nginx/html:ro nginx
# ro 只读,rw 可读写(默认)

数据拷贝:

1
2
3
4
# 将 容器 内文件复制至 主机 中
docker cp 容器:/etc/nginx/nginx.conf /data/conf/nginx.conf
# 将 主机 中文件复制至 容器 内
docker cp /data/conf/nginx.conf 容器:/etc/nginx/nginx.conf

自定义网络:

1
2
3
4
5
6
7
# 创建用户自定义网络
docker network create my-net

# 将已有容器连接到此网络
docker network connect my-net db-mysql
# 创建容器时指定网络(容器之间可以通过容器名进行访问)
docker run -it --rm --network my-net mysql:5.7 mysql -hdb-mysql -uroot -p

镜像制作与保存

生成镜像:

1
2
# 将一个 容器 保存为一个新的镜像(参数可省略)
docker commit -a "作者" -m "信息" 容器名/id 新镜像名[:版本]

tar 保存镜像:

1
2
3
4
5
6
# 将 镜像 保存成压缩包
docker save -o 压缩包名.tar 镜像名[:版本]/id
# 通过压缩包加载 镜像
docker load -i 压缩包名.tar

# export 与 import 导出和导入镜像快照

镜像推送:

  1. 为本地的一个镜像添加一个新的标签:
1
2
3
# 注意这个标签名应为你要上传的仓库的 命名空间(用户名)/厂库名
docker tag 镜像[:版本]/id 新镜像名即标签名[:版本]
docker tag mynginx:1.0 ruoxijun/main:v1.0
  1. 登录并推送到云端仓库:
1
2
3
4
5
6
7
8
9
10
11
# 登录到 DockerHub
docker login
# 登录阿里云镜像仓库
docker login --username=ruoxijun registry.cn-chengdu.aliyuncs.com

# 推送
docker push 镜像名即标签名[:版本]
docker push ruoxijun/main:v1.0

# 推送完镜像后建议退出
docker logout
  1. 拉取镜像
1
2
3
4
5
6
7
# 拉取上传的镜像(私有镜像需要登录后才能拉取)
docker pull ruoxijun/main:v1.0

# 搜索公共仓库(非公共要特殊方法)
docker search ruoxijun/main

docker search --limit 5 镜像名称 # 搜索前5个(默认前20)

Dockerfile

1
2
3
4
5
# 创建一个名为 Dockerfile 的文件内容如下:
FROM openjdk:8-jdk-slim # 使用 openjdk:8-jdk-slim 镜像作为基础镜像
LABEL maintainer=leifengyang # 作者
COPY target/*.jar /app.jar # target 下所有 .jar 文件复制到容器中的 / 目录下,改为 app.jar
ENTRYPOINT ["java","-jar","/app.jar"] # 容器启动后运行特定命令
1
2
3
4
5
6
# 从 Dockerfile 构建镜像(最后的点是构建目录)
docker build -t java-demo:v1.0 .
# 指定文件构建镜像
docker build -f /path/to/a/Dockerfile -t <image-name>:<tag> .
# 查看构建过程的历史记录
docker history java-demo:v1.0

docker-compose

1
2
3
4
5
6
7
8
# 基本操作
docker-compose up -d
# 关闭并删除容器
docker-compose down
# 开启|关闭|重启已经存在的由 docker-compose 维护的容器
docker-compose start|stop|restart
# 运行当前内容,并重新构建
docker-compose up -d --build