dave-wind / blog

native javascript blog
0 stars 0 forks source link

Docker #24

Open dave-wind opened 1 year ago

dave-wind commented 1 year ago

Docker

https://docker.easydoc.net

下载 docker-desktop

https://www.docker.com/products/docker-desktop/

注意
1. mac: docker 下载版本 分intel芯片 和 mac芯片 要区分
2. macOS 版本至少要 10.14.6

配置

1. 设置-Resources  基础配置
2.Docker Engine:
// 可配置阿里云镜像加速器地址
"registry-mirrors": [
    "https://n59cfvlj.mirror.aliyuncs.com", // 通过阿里云镜像加速器得来,一个账户一个
    "https://registry.docker-cn.com"
 ]
3.阿里云容器镜像加速器:https://cr.console.aliyun.com/cn-shanghai/instances/mirrors

概念

打包:
    就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包
分发:
    你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装
部署:
    拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一模一样的运行环境,不管是在 Windows/Mac/Linux。
镜像:
    可以理解为软件安装包,可以方便的进行传播和安装。(含有启动Docker容器所需的文件系统结构及其内容的安装包)
容器:
    软件安装后的状态,每个软件运行环境都是独立的、隔离的,称之为容器。

Docker的操作参数:

http://www.51niux.com/?id=185

守护进程:它是运行在后台的一种特殊进程。 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.

用户在使用Docker时,需要使用Docker命令行工具docker与Docker daemon建立通信。Docker daemon是Docker守护进程,负责接收并分发执行Docker命令。

文档

https://docs.docker.com/
http://www.51niux.com/?id=185

docker 容器

docker ps -a //查看容器 ID 状态 

命令

docker run文档:https://docs.docker.com/engine/reference/commandline/run/

0.docker search 镜像名 // 搜索镜像
1.docker images // 查看镜像
2.docker image rm xxx // 删除镜像
eg: docker image rm REPOSITORY:TAG
3.docker run --rm -it REPOSITORY:TAG
4.共享文件夹:
docker run --rm -v xxxx/路径文件夹名:/工作目录 -it 镜像名:TAG

操作

安装Redis:
docker run -d -p 6379:6379 --name redis redis:latest

node demo

1.在目标项目目录, 新建一个dockerfile文件
2.docker build 把其变成 镜像;docker build -t 镜像名称:版本号 .表示在(当前目录)
    docker build -t koa-test:v1 .
指定dockerfile:
docker build -f Dockfile -t xxx:version

3.通过镜像 run 会生成一个容器:--name 容器名称; 镜像名称:版本
docker run -p 8080:8080 --name koa-demo koa-test:v1
# 如果想重新启动容器:
docker start 容器ID
# 后台重新启动镜像: 会生成一个新的容器,在后台运行项目
docker run -itd -p 8080:8080 koa-test:v1
// 第二个8080是容器端口, 把容器8080端口暴露到宿主机上的8080

4.浏览器输入:
http://localhost:8080/hello/demo
http://localhost:8080/index

docker 挂载

问题:
1.使用Docker运行后,改了项目+代码不会生效,需要重新build和run 很麻烦(不能热更新)
2.容器产生的数据,log 备份文件, 容器删除就丢失了

三种方式:
1.bind mount:
    直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上
    (宿主机目录映射到容器内,相当于我运行一个web项目,把代码挂在容器上 )
2.volume:
    由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上
3.tmps

demo:
docker run -p 9000:8080 --name test-mount -v /Users/dave/learn-docker/test-docker:/app -d koa-test:v1 
解析:
// 运行docker 把容器8080暴露到宿主机9000上, 
// 容器名称:test-mount; 
// -v挂载;把宿主机目录挂载容器app文件上,容器里的代码就会替换为你本机的代码了. -d为后台执行;
// 这样就可以改本地代码,重新reset docker; 跑代码了,注意的是,宿主机最好也要提前install,因为本地代码会被容器替换,运行的时候需要 node_modules

多容器通信

想多容器之间互通,只需要几个镜像放到同个网络中
1.创建网络:
docker network create test-net
2.运行目标容器demo:(运行 Redis 在 test-net 网络中,别名redis)
docker run -d --name redis --network test-net --network-alias redis redis:latest
3.运行Web项目,使用同个网络:
docker run -p 8080:8080 --name test -v /Users/dave/learn-docker/test-docker:/app --network test-net -d test:v1

弊端:麻烦, 不方便

docker-compose

命令:
// 关闭 删除的内容是: Compose 文件中定义的服务容器
docker-compose down
// Remove containers for services not defined in the Compose file.
docker-compose up --remove-orphans      

如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。
这节,我们使用 docker-compose 把项目的多个服务集合到一起,一键运行。

命令参考:https://docs.docker.com/compose/reference/up/
在后台运行只需要加一个 -d 参数docker-compose up -d
查看运行状态:docker-compose ps
停止运行:docker-compose stop
重启:docker-compose restart
重启单个服务:docker-compose restart service-name
进入容器命令行:docker-compose exec service-name sh
查看容器运行log:docker-compose logs [service-name]

# 多服务 比如 redis,mb,mysql等
要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml文件,描述依赖哪些服务:
参考文档: https://docs.docker.com/compose/

version: "1.29.2"

services:
  app:
    build: ./  // 在当前目录build
    ports:
      - 80:8080 // 把容器的8080端口暴露到宿主机80端口
    volumes:
      - ./:/app      //卷的映射 容器的app 映射到宿主机当前目录
    environment:
      - TZ=Asia/Shanghai   // 环境变量 代表时间
  redis:
    image: redis:5.0.13   // redis 镜像 从Docker Engine设置里 他会去镜像仓库下载
    volumes:
      - redis:/data
    environment:
      - TZ=Asia/Shanghai

volumes: 
  redis:

/*
volumes理解:
首先镜像可以理解为文件系统的只读层叠加;
Docker volume底层原理上,会对读写层文件进行读取,那么这些volumes 就是一种共享的状态,UFS原理会对未修改的文件降低消耗
(只对镜像里,文件读写层进行读写, volumes的数据卷, 会进行共享,减少对未修改文件复制到读写层的消耗)
*/

发布 部署

以阿里云为例;
1.首先需要购买服务器 创建实例,并配置 Docker Engine,镜像文件:
"registry-mirrors": [
    "https://n59cfvlj.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
2.在你当前文件 通过 docker build 生成一个新的镜像

3.阿里云->工作台->容器镜像服务 去创建一个实例

4.通过登陆阿里云Docker Registry 进行tag 上传:
举个例子:(如 kr-test项目为例)
    a.首先在当前项目,创建好需要的项目,注:可以新建dockerignore 去忽略一些文件
    b.创建tag:
    // 创建tag, tag 填写 dokcer镜像里的imageId, 后接 阿里云docker名称:版本号
    docker tag kr-test:v1 registry.cn-shanghai.aliyuncs.com/davewind/test:v1
    c.Push镜像:
    docker push registry.cn-shanghai.aliyuncs.com/davewind/test:v1
    d.以线上镜像启动验证:
    docker run -dp 8090:8080 registry.cn-shanghai.aliyuncs.com/davewind/test:v1

5.组合:
这时候我们就可以修改docker-compose里的代码了:
把build: ./ 改为 线上的阿里云镜像: image: registry.cn-shanghai.aliyuncs.com/davewind/test:v1

6.重新 docker-compose up -d 运行

问题

1.node项目,docker 用bind mount目录挂载,为什么本地代码也要重新install

ECS云服务器 搭建Docker CE 环境 (社区版本)

1. 可以通过访问 https://ecs.console.aliyun.com/ 访问应用实例
2.通过 Workbench 远程连接 输入 ECS 账号:root 密码
3.执行如下命令,安装Docker的依赖库:
yum update -y
yum install -y yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
4.执行如下命令,添加Docker CE的软件源信息 设置仓库为阿里源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
或者
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

5.执行如下命令,清理缓存 新生成Yum缓存
yum clean all && yum makecache fast
安装docker ce
yum install -y docker-ce docker-ce-cli containerd.io

6.执行如下命令,启动Docker服务:
systemctl start docker

6.1 设置开启自启动 docker
sudo systemctl enable docker

7.执行镜像加速器操作: 镜像来自于 阿里云 容器镜像服务 镜像加速器
vi /etc/docker/daemon.json
{
  "registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
7.1 设置网络代理
// 默认没有这些文件 要先创建
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

[Service]
Environment="HTTP_PROXY=http://proxy.nioint.com:8080/"
Environment="HTTPS_PROXY=http://proxy.nioint.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1"

8.重新加载服务配置文件。
systemctl daemon-reload
9.重启docker
systemctl restart docker

# 以拉取nginx 为例:
10.查看 nginx 版本:
docker search nginx
11.拉取最新镜像:
docker pull nginx:latest
12.运行容器:
docker run --name nginx-test -p 8080:80 -d nginx
--name nginx-test:容器名称。
-p 8080:80: 端口进行映射,将本地8080端口映射到容器内部的80端口。
-d nginx: 设置容器在后台一直运行。

13.访问 外网ip:8080  // 查看网站
dave-wind commented 1 year ago

Docker 启动 superset

1. docker search superset // 搜索镜像
2. docker pull amancevice/superset // 这里下载的 amancevice/superset 这个镜像
3.密钥配置
  openssl rand -base64 42
4. 创建文件  /data/superset/superset_config.py
5.编辑 superset_config.py
  SECRET-KEY = '密钥'
6.启动容器
  docker run -d -p 8088:8088 -v /data/superset/superset_config.py:/home/superset/superset_config.py amancevice/superset
// 挂载数据 使用 /data/superset/superset_config 去覆盖 容器里的 py文件

7.查看 容器 id
docker ps -a
8.初始化superset
  docker exec -it your_container_name_or_id superset-init
// 初始化所有 superset 环境 以及 设置密码和用户 
eg:root 123456
dave-wind commented 1 year ago

Dokcer 启动 grafana (centos7)

sudo

1. 查询镜像
docker search grafana
2.下载镜像
docker pull grafana-enterprise // 企业版
3. mkdir /data/grafana

4.创建compose touch docker-compose.yaml

version: '3.8'
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
# if you are running as root then set it to 0
# else find the right id with the id -u command
user: '0'
ports:
- '8086:3000'
# adding the mount volume point which we create earlier
volumes:
- './data:/var/lib/grafana'

5.grafana 目录下文件:
data  docker-compose.yaml 俩文件; 

6.默认容器内grafana 端口为3000; 我们需要修改端口 这里为 8086

  1. volumes 卷积文件 为相对路径 当前docker-compose 同级目录下的 data文件 用来存储grafana数据

8.在docker-compose 根文件下 启动: docker compose up -d

9.关闭服务 docker compose down

10.密码 初始化的时候 都为 admin admin 访问 页面 可以在界面上修改密码 eg: admin nioadmin

11.官方文档: https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/

dave-wind commented 12 months ago

基本操作


1.理解镜像和容器:
镜像就是静态的应用容器,容器就是动态的应用镜像
Build once, Run anywhere
镜像包含完整的
  1. docker pull 明细: docker pull alpine:3.15 // 镜像:纯版本号(TAG) docker pull ubuntu:jammy // 镜像:是项目代号(TAG)

docker pull nginx:1.21-alpine // 镜像:版本号-操作系统名等等 docker pull nginx:alpine docker pull redis

2.删除 docker rmi 镜像名|[IMAGE ID] // 镜像ID 十六进制形式且唯一

  1. docker run 命令

是最复杂的一个容器操作命令,有非常多的额外参数用来调整容器的运行状态,你可以加上 --help 来看它的帮助信息,今天我只说几个最常用的参数。

-it 表示开启一个交互式操作的 Shell,这样可以直接进入容器内部,就好像是登录虚拟机一样。(它实际上是“-i”和“-t”两个参数的组合形式)

-d 表示让容器在后台运行,这在我们启动 Nginx、Redis 等服务器程序的时候非常有用。

--name 可以为容器起一个名字,方便我们查看,不过它不是必须的,如果不用这个参数,Docker 会分配一个随机的名字。

--rm: 不保存容器 运行完毕自动删除清除:

docker run -d --rm redis

docker run -d nginx:alpine # 后台运行Nginx docker run -d --name red_srv redis # 后台运行Redis docker run -it --name ubuntu 2e6 sh # 使用IMAGE ID,登录Ubuntu18.04 (2e6 为ImageID前三位)

4.进入容器内部

docker run -it --rm your_image_name sh // 运行且进入容器内部

docker exec -it【镜像ID】 sh // 进入内部 在执行 shell脚本 可查看内部情况

// 从宿主机拷贝文件到虚拟机 docker cp a.txt 【镜像ID】:/文件名

ls

// 查看文件目录

5.docker run 和 docker exec 区别

docker run是用命令启动一个容器,而docker exec是在已有容器里执行命令

6.docker build

docker build -t [name:version] . // -t 给镜像打标签 .代表当前目录

7.docker save/load

然后我们还可以用 docker save/load 命令把它导出成压缩包,方便保存和传输: docker save ngx-app:1.0 -o ngx.tar docker load -i ngx.tar

8.docker publish (内网)

docker login -u [username] artifactory.nioint.com // 登陆 输入密码

docker build -t [name:version] .

docker publish artifactory.nioint.com/ml-iiot-docker-local/[镜像名]:[版本号]

//eg: 比如 现在有一个 镜像叫 hello-world docker tag hello-world nodejs/hello-world:v1

docker push node-hello-world:v1 artifactory.nioint.com/ml-iiot-docker-local/node-hello-world:v1

9.docker inspect docker inspect [镜像名]|[镜像ID] // 查看镜像分层

10.docker exec // 进入容器内 执行一些脚本 eg: //查看ip ip addr # 本机查看网卡 docker exec【镜像】 ip addr # 容器查看网卡

// 执行shell // 查看文件列表 docker exec -it 【镜像ID】 sh ls

  1. 挂载 -v // 拉镜像 docker pull python:alpine // run 镜像 挂载 当前目录 为动态运行目录; 这样本地改代码 服务docker运行也会变 // 适用于:开发测试工作 docker run -it --rm -v pwd:/tmp python:alpine sh

12.删除 docker rmi 镜像名:版本号

dave-wind commented 3 months ago

Rocky8 安装docker + Node-Red

yum install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce

# 配置

7.执行镜像加速器操作: 镜像来自于 阿里云 容器镜像服务 镜像加速器
vi /etc/docker/daemon.json
{
  "registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
# 设置网络代理
# 默认没有这些文件 要先创建
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
vi /etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.nioint.com:8080/"
Environment="HTTPS_PROXY=http://proxy.nioint.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1"

systemctl start docker.service
systemctl enable docker.service

#  安装node-red

// 拉取镜像
docker pull nodered/node-red

// 查看镜像列表
docker images

// 想查看所有容器
docker ps -a

// 增加权限 更改宿主机上数据卷的权限:

chmod -R 777 /node-red

// 运行 镜像 将宿主机 目录 /node-red 映射到 容器的 /data目录
docker run -it --network host -v /node-red:/data -d --name node-red-f2 nodered/node-red:latest

// 进入容器设置npm 代理
docker exec -it【镜像ID】 sh

# 设置代理
1.设置npm镜像源
npm config set registry https://npmmirror.nioint.com/

// npm config set registry https://registry.npm.taobao.org/

2. 设置npm 代理
npm config set proxy http://proxy.nioint.com:8080
npm config set https-proxy http://proxy.nioint.com:8080

export http_proxy=http://proxy.nioint.com:8080

export https_proxy=http://proxy.nioint.com:8080

3 npm install 依赖项目

npm install xx --registory=https://registry.npm.taobao.org/

node-red-contrib-influxdb

node-red-contrib-aedes // mqtt server
// 如果安装报错 是签名错误
//手动关闭 签名:
npm config set strict-ssl false
// 安装依赖 成功后 再手动开启
npm config set strict-ssl true

//项目管理
https://nodered.org/docs/user-guide/projects/

1880

4.防止服务挂 重启
docker run -d --restart=always 【容器ID】

5.在已经run的服务设置自动重启
docker update --restart=always 【容器ID】

6.电脑重启 跑 docker:
systemctl enable docker.service