2023-06-18
docker容器cmd执行多条命令
2023-06-18 ~ 2023-06-18
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql:
    build:
      context: ./mariadb
      dockerfile: ./Dockerfile
    container_name: mariadb_yoga
    restart: on-failure
    command:
      - /bin/bash
      - -c
      - |
        mysqld --user=root
        mysql -u root -p 123456 < /db/init_db.sql
    volumes:
      - /var/lib/openstack/yoga/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime
    ports:
      - "23306:3306"  # host物理直接映射端口为13306
    environment:
      MYSQL_ROOT_PASSWORD: '123456' # root管理员用户密码
    networks:
      network:
        ipv4_address: 177.177.0.13
2023-06-18
docker容器重启策略
2023-06-18 ~ 2023-06-18

可选策略

在docker run通过 –restart 设置守护机制:

  • no: 不自动重新启动容器(默认)
  • on-failure: 容器发生error而退出(容器退出状态不为0)重启容器
  • unless-stopped: 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
  • always: 如果容器停止,总是重新启动容器。如果手动kill容器,则无法自动重启。

docker update追加命令

运行中的容器,当时没有指定restart可以通过update命令追加

2023-06-18
docker联合文件系统
2023-06-18 ~ 2023-06-18

参考:https://www.jianshu.com/p/5c1f152ac4a6

1. 前言

(Union filesystem)联合文件系统允许我们把多个文件系统逻辑上合并成一个文件系统,组成Union filesystem的文件系统不必相同(它们可以是ext2/3/4,vfat,ntfs,jffs…)。overlay是联合文件系统的一种(a ufs…),overlay文件系统构建于其他文件系统之上,overlay其实更像是个挂载系统(mount system),功能是把不同的文件系统挂载到统一的路径。

2023-06-18
hypervisor
2023-06-18 ~ 2023-06-18
Hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件. 可以将Hypervisor看做是虚拟环境中的"元"操作系统,可以协调访问服务器上的所有物理设备的虚拟机,所以又称为虚拟机监视器(virtual machine monitor). Hypervisor是所有虚拟化技术的核心,非中断的支持多工作负载迁移是Hypervisor的基本功能.
2023-06-18
修改Centos官方云镜像的root密码
2023-06-18 ~ 2023-06-18

https://developer.aliyun.com/article/799104

还可以看看这个

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
yum -y install libguestfs-tools

要设置root密码,请使用以下命令:
virt-customize -a CentOS-7-x86_64-GenericCloud.qcow2 --root-password password:123456

[   0.0] Examining the guest ...

[   1.9] Setting a random seed

[   1.9] Setting passwords

[   6.8] Finishing off

注:

CentOS-7-x86_64-GenericCloud.qcow2是要修改图像的名称。

123456是为root用户设置的密码。
2023-06-18
容器化和kvm的区别
2023-06-18 ~ 2023-06-18

容器和KVM虚拟化是两种不同的虚拟化技术,它们各有优缺点,适用于不同的场景。

容器

容器是一种轻量级的虚拟化技术,利用操作系统层面的虚拟化实现。每个容器都运行在一个独立的命名空间中,可以看作是进程的一个集合,共享主机操作系统的内核。容器可以快速启动、停止和迁移,占用的资源比KVM虚拟机少,因此更适合部署大规模的分布式应用程序。常见的容器技术包括Docker、LXC等。 优点:

2023-06-08
SaaS多租户系统数据隔离实现方案
2023-06-08 ~ 2023-06-08

参考: https://juejin.cn/post/7234763992333189175

背景

简单来说,一个租户就是一个公司的客户,多个租户共用同一个SaaS系统,一旦SaaS系统不可用,那么所有的租户都不可用,

多租户问题,其实是一种架构设计方式,就是在一台或者一组服务器上运行的SaaS系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改。

2022-11-30
docker format常用选项
2022-11-30 ~ 2022-11-30
格式化选项(–format) .ID 容器ID .Image 镜像ID .Command Quoted command .CreatedAt 创建容器的时间点. .RunningFor 从容器创建到现在过去的时间. .Ports 暴露的端口. .Status 容器状态. .Size 容器占用硬盘大小. .Names 容器名称. .Labels 容器所有的标签. .Label 指定label的值 例如’{{.Label “com.docker.swarm.cpu”}}’ .Mounts 挂载到这个容器的数据卷名称
2022-10-23
数据共享与持久化
2022-10-23 ~ 2022-10-23

在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 挂载主机目录 (Bind mounts)

数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

2022-10-19
docker run命令详解
2022-10-19 ~ 2022-10-19

命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Usage: Run a command in a new container

中文意思为:通过run命令创建一个新的容器(container)

  • 常用选项说明
    • d, --detach=false, 指定容器运行于前台还是后台,默认为false
    • i, --interactive=false, 打开STDIN,用于控制台交互
    • t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
    • u, --user="", 指定容器的用户
    • a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
    • w, --workdir="", 指定容器的工作目录
    • c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
    • e, --env=[], 指定环境变量,容器中可以使用该环境变量
    • m, --memory="", 指定容器的内存上限
    • P, --publish-all=false, 指定容器暴露的端口
    • p, --publish=[], 指定容器暴露的端口
    • h, --hostname="", 指定容器的主机名
    • v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
    • -volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
    • -cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    • -cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    • -cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    • -cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
    • -device=[], 添加主机设备给容器,相当于设备直通
    • -dns=[], 指定容器的dns服务器
    • -dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
    • -entrypoint="", 覆盖image的入口点
    • -env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
    • -expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
    • -link=[], 指定容器间的关联,使用其他容器的IP、env等信息
    • -lxc-conf=[], 指定容器的配置文件,只有在指定–exec-driver=lxc时使用
    • -name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
    • -net="bridge", 容器网络设置:
      • bridge 使用docker daemon指定的网桥
      • host //容器使用主机的网络
      • container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
      • none 容器使用自己的网络(类似–net=bridge),但是不进行配置
    • -privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
    • -restart="no", 指定容器停止后的重启策略:
      • no:容器退出时不重启
      • on-failure:容器故障退出(返回值非零)时重启
      • always:容器退出时总是重启
    • -rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    • -sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

示例

  • 运行一个在后台执行的容器,同时,还能用控制台管理:docker run -i -t -d ubuntu:latest
  • 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:docker run -d ubuntu:latest ping www.docker.com
  • 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,docker run -d --restart=always ubuntu:latest ping www.docker.com
  • 为容器指定一个名字,docker run -d --name=ubuntu_server ubuntu:latest
  • 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
  • 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
2022-10-19
docker启动命令逆向输出
2022-10-19 ~ 2022-10-19

主要依靠的一个开源软件runlike

See runlike-github

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

yum clean all
yum makecache

yum install python-pip python-setuptools -y

pip install runlike

# 若此时正在运行的一个容器为`redis`
# 则
runlike redis > redis_start.sh
# 此时redis_start.sh即为docker启动redis容器的命令
2022-10-19
docker网络
2022-10-19 ~ 2022-10-19

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P-p参数来指定端口映射。

当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口。

2022-10-19
docker网络模式
2022-10-19 ~ 2022-10-19

Bridge模式

Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过brctl show命令查看。