ubuntu server-容器

容器

有了新武器,并不表示旧武器没有用

题外话

容器

SDN -> 软件定义网络

容器 -> 基于操作系统内核,共享宿主机的CPU -> 操作系统的进程之间进行隔离 -> 安全性比虚拟机差一些 -> 可移植性

什么是容器 有个感性的认识即可,现在还没有明确的统一定义,根据不同产品具体理解

常见的容器技术

Docker vs LXD/LXC

不同容器的程序的pid可以相同

越狱

Docker

应用程序方面的容器

Docker引擎只可以直接运行在Linux系统上

1
利用'Boot2Docker'等适配器帮助,使用轻量级'Linux vm'可在mac和微软系统上运行

安装Docker引擎(两种方法)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uname -m    # 仅64位系统保障(但32位系统可用)

##### 第一种办法:直接从ubuntu软件包安装(比较旧), 已经有一个老版本ubuntu包名为docker,
sudo apt install docker.io
systemctl status docker

# 将当前用户加入docker组(不用sudo了)
sudo usermod -aG docker ${USER}
# 重启





##### 第二种办法:
# 安装依赖包
udo apt-get install apt-transport-https ca-certificates  curl software-properties-common
# 添加docker官方GPG key(防止伪造,供应链攻击)
url -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加docker官方库更新源
sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs) stable"
# 安装
sudo apt update
sudo apt-get install docker-ce  # 社区版本

客户端工具: docker

基本命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看信息
docker version
docker info   # 查看运行了几个容器
# Registry: 应用程序的仓库(基本linux映像,)


# 搜索镜像(有官方有个人的: 用户名/容器名) --> 建议下载官方的image然后自己打造容器
docker search apache2

# 下载镜像
docker pull hello-world
# 下载时候指定-a(会下载所有版本)
docker pull hello-world -a

# 查看镜像
docker images 

# 运行容器
docker run busybox echo "hello"

# 删除image
docker rmi busybox:1-musl

Docker基本概念

Docker 映像

  • 组成应用程序运行所需的全部文件合集
  • 只读/读写 分层结构(每次对映像的修改都通过commit形成一个新层)
  • 容器层 是基于映像可读写的顶层
  • 映像层所有的Docker映像都源自于一个基础镜像(Debian/Ubuntu) –> 只读,不可修改i
  • 其他的功能模块附加于基础影像形成最终程序
  • Docker images 是构建Docker container的基础

  • Docker 层/容器层

每个映像有唯一的ID(SHA256/ 取前6字节来显示)

1
2
3
4
5
6
docker images
# 可看到唯一的image id
# TAG:  默认是最新版本(latest)   

docker images --no-trunc
# 可以看到完整的SHA256完整的字节

Docker容器

images是只读的,在基础上创建并运行容器(可读写)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 查看运行的容器(每个容器都有唯一的id)
docker ps    # 不显示关闭的容器
docker ps -a  # 显示所有状态的容器
#显示字段: 有容器id, 基于image的名字,command, 容器创建时间, status, ports, names(随机生成的,可以改)


# 基于image运行容器(每次运行一次都产生一个新的容器!)
docker run busybox echo "hello"
docker run busybox:1-uclibc echo "hello"  # 指定标签来用哪个(如果本机没有,会自动pull)

# 
docker run -i -t busybox:ubuntu-16.04 


# 删除容器
docker stop d751d48a6d0a  # 如果运行了先stop掉
docker rm d751d48a6d0a

pull的时候,默认会去一个人url地址寻找镜像

Docker Resigtry相当于目录,Repository相当于具体文件位置

可以自建映像库

Docker使用

基本命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 运行镜像后交互登录入容器(这里基于ubuntu)
# --name  修改容器的默认名字,指定
docker run --name xxx01 -it ubuntu /bin/bash
# 退出
exit /   ctrl + D

# 退出容器终端,但退出不关闭容器
ctrl + P , ctrl + Q   # 组合

# 启动容器
docker start id_id_id

# 继续进入正在运行的容器
docker attach xxx01

# 重命名容器
docker rename 453dsdaojp test01

# 容器与镜像对比变化
docker diff 453dsdaojp test02
- C:修改了
- A:增加了
- D:删除了



### 日常管理命令
docker start 453dsdaojp
docker restart 453dsdaojp
docker stop 453dsdaojp
docker rename 453dsdaojp
docker pause 453dsdaojp    # 挂起
docker unpause 453dsdaojp  # 恢复

创建映像

1
2
3
4
5
6
docker run -it ubuntu /bin/bash    
....    # 进入容器进行一些了修改
ctrl + p, ctrl + q
docker commit test01 xps/test:0.1  # 创建了新的image
# 然后可以上传到docker Resigtry
# 后面就跟别的image一样使用可以创建容器等

后台运行容器

1
2
# 不进入交互方式的shell
docker run -d ubuntu /bin/bash -c "while true; sleep 3; do date";done  

查看日志

1
docker logs 453dsdaojp

实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 配置一个apache,并可以外部访问
docker run -dit -p 8080:80 ubuntu /bin/bash  # 端口映射(外部:容器端口)
docker attach doasdkop463fd    # 进入容器
apt update && apt install apache2  # 正常操作
/etc/init.d/apache2 start
ctrl+p, ctrl+Q
# 宿主机浏览器访问 http://宿主机ip:8080


## 服务自动启动(或者手动把下面内容输入进去)
echo '/etc/init.d/apache2 start' >> /etc/bash/rc

## 基于配置好的容器创建新的镜像
docker commit ubuntu xps/apache1:0.1  # 创建了新的image
# 打包好之后上传到hub,就可以正常下载和使用image了

Dockerfiles

前面的下载,制作,上传,再下载的方法也挺麻烦的

使用Dockerfile自动创建映像(Dockerfile文本文件,包含创建容器的指令)

这里还是以apacha2为例 1.先写配置文件

1
2
3
4
5
6
# vim Dockerfile
FROM ubuntu     # 从官方下载镜像
MAINTAINER xps <xps@admin.com>
RUN apt update; apt dist-upgrade -y
RUN apt install -y apache2 vim
RUN echo '/etc/init.d/apache2 start' >> /etc/bash/rc

2.基于dockerfile来创建容器

1
2
3
4
5
# 标签自己定义即可, 最后的点(.) 表示当前目录下的dockerfile
docker build -t test/apache-server:1.0 .

# 然后run创建启动容器
docker run -dit -p 8080:80 test/apache-server:1.0 /bin/bash

PS: 更深入的Dockerfile知识再另外学

docker-compose

**作用:**之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数,Docker-Compose可以帮助我们批量的管理容器,只需要通过一个docker-compose.yml文件去维护。

下载:https://github.com/docker/compose/releases

https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-darwin-aarch64

参考文章:https://blog.csdn.net/chenfeidi1/article/details/80866841?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-80866841-blog-122964874.pc_relevant_without_ctrlist_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-80866841-blog-122964874.pc_relevant_without_ctrlist_v3&utm_relevant_index=2

https://www.jb51.net/article/237876.htm

官方docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:

Docker-compose管理Mysql和apache容器

yml文件以key:value方式来指定配置信息,多个配置信息以换行+缩进的方式来区分,在docker-compose.yml文件中,不要使用制表符就是tab键,规则用两个空格缩进

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3.1'   # 指定了 compose file 的版本
services:
  mysql:                                                      #服务名称
    restart: always                                           #代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4                    #指定镜像路径
    container_name: mysql                                     #指定容器名称
    ports:
      - 3306:3306                                             #指定端口的映射
    environment:
      MYSQL_ROOT_PASSWORD: 123456                             #指定MySQL账号root的密码
      TZ: Asia/shanghai                                       #指定时区
    volumes:
      - /opt/docker_mysql_tomcat/mysql:/var/lib/mysql                #指定映射数据卷
  httpd:
    restart: always
    image: php:7.2-apache
    container_name: apache
    ports:
      - 80:80
    environment:
      TZ: Asia/shanghai
    volumes:
      - /opt/docker_mysql_tomcat/www:/var/www/html
      - /opt/docker_mysql_tomcat/logs:/var/log/apache2

操作命令:

1
2
3
4
5
docker-compose up -d                    基于docker-compose.yml启动管理容器
docker-compose down                     关闭并删除容器
docker-compose start|stop|restart       开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose ps                       查看由docker-compose管理的容器
docker-compose logs -f                  查看日志

docker-compose配置Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: '3.1'
services:
  ssm:
    restart: always
    build:	# build 指定构建镜像上下文、Dockerfile 文件和 ARGS 等。
      context: ../
      dockerfile: Dockerfile
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 80:80
    environment:
      TZ: Asia/Shanghai

创建Dcokerfile

1
2
from php:7.2-apache
copy wordpress /var/www/html

image-20220507153540102

依赖docker-compose.yml启动容器

1
docker-compose up -d

image-20220507153612265

LXD

特点

1
2
3
4
- lxd 新部署容器过程比Docker更容易
- 退出容器时不必以特定的方式退出
- lxd 容器中没有层的概念
- Docker中的层可以使部署更快(没有清理也可能感觉混乱)

安装

1
2
3
4
# snap适用所有发行版本
sudo snap install lxd    # sudo apt install lxd    # ubuntu官方包apt一般中不会是最新的软件包
sudo usermod -aG lxd ${USER}    # 当前用户加入lxd组,就具有管理权限了
# 重启主机

初始化

1
2
3
lxd init

# 回答问题(默认即可)

运行容器

1
2
3
4
5
6
# 创建容器
lxc launch ubuntu:18.04 C01 # C01是容器名称
# 自动从远程服务器下载映像并创建、运行容器(从国外下载,速度稍微慢)

# - lxd命令针对lxd管理层
# - 容器管理命令仍然使用lxc

常用管理命令

1
2
3
4
5
6
7
lxc list  # 列出所有的容器
lxc start c_name  # 启动容器
lxc stop c_name   # 停止容器
lxc delete c_name # 删除容器

lxc image list    # 查看镜像
lxc image delete  # 删除镜像

交互登录容器

1
2
3
4
5
6
7
8
# 执行某个容器的什么命令
lxc exec C01 bash    # root帐号登录
lxc exec C01  -- sudo --login --user ubuntu    # ubuntu镜像包含一个默认账户ubuntu
# 在本地终端直接执行容器内部的命令
lxc exec C01 -- apt update

# 退出容器(容器依然是run的状态)
ctrl+D / exit

随宿主机的启动, 自动启动某个容器

1
lxc config set C01 boot.autostart 1

远程映像存储服务器

1
2
3
4
5
6
# 列出远程映像存储服务器
lxc remote list    # 默认三个

- images         # 存储其他Linux发行版镜像
- ubuntu         # ubuntu自己正式发布的系统镜像
- ubuntu-daily   # ubuntu自己的非正式的系统镜像(每天更新的)

从远程复制映像

1
2
3
4
5
6
7
8
9
lxc launch images:debian/stretch test01
# 只下载映像到本地,不创建容器
lxc image copy ubuntu-daily:18.10 local: --alias u1910
lxc image list    # 查看本地的映像

# 从本地映像来创建容器
lxc launch u1910 c03
# 查看本地容器
lxc list

对容器进行上传下载文件

1
2
3
4
5
# 直接在宿主机器上执行
lxc file pull c01/etc/hosts . # 把文件下载到当前目录
lxc file push hosts c01/tmp/  # 上传文件到容器中路径

# 当然,也可以进入交互shell复制  lxc exec C01 bash

映像自动更新间隔(小时)

1
2
# 每隔24小时自动更新映像
lxc config set images.auto_update_interval 24

自动清除未使用的映像(天数)

1
lxc config ser images.remote_cache_expiry 5

查看配置

1
lxc config show

实例

1
2
3
4
5
# 安装apache2
lxc exec c01 bash
apt update && apt install apache2
ip addr show
curl 1.1.1.1

外部网络对容器内部访问

1
2
3
- 防火墙规则路由流量
- 创建配置我呢见DHCP 获取物理网络地址(类似VM)
- 宿主机创建桥接网卡 br0

k8s

0%