01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker基础

https://docs.docker.com/desktop/

支持在mac windows linux上安装

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

ubuntu上安装
https://docs.docker.com/engine/install/ubuntu/

centos安装:
https://docs.docker.com/engine/install/centos/#install-using-the-repository

测试安装:
设置存储库:安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定存储库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker 引擎:安装最新版本的 Docker Engine
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
docker run hello-world

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

运行原理

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

image 概念

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

image获取方式:

dockerfile

vim dockerfile

FROM ubuntu:14.04
LABEL maintainer="lijiahao@163.com"
RUN apt-get update && apt-get install -y redis-server
EXPOSE 6379
ENTERPOINT [ "/usr/bin/redis-server" ]

docker build -t my-redis:latest .

练习:模拟编译制作一个gcc的hello word
制作可执行文件:
vi hello.c

#include<stdio.h>

int main()
{
        printf("hello docker\n");
}

yum -y install gcc glibc-static
gcc -static hello.c -o hello

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

vim Dockerfile

FROM scratch
ADD hello /
CMD ["/hello"]

docker build -t lijiahao/my-helloword:latest .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker和可执行文件大小相当:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

查看构建过程:
docker history lijiahao/my-helloword

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

执行docker image

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

仓库:
官方:
docker pull ubuntu:20.04
docker pull ubuntu
个人或组织:
docker pull bitnami/wordpress

container概念:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

container的运行方式:
docker默认非交互式运行,运行完成便会退出

交互式运行,同时进入docker:
docker run -it centos

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

打开一个新的终端查看:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker run 参数:
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY

直接分配一个tty并不进入,以后台方式运行:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker命令:

镜像:
docker build -t lijiahao/hello-word .
docker images
docker rmi
docker commit 容器ID my-centos:v1.0

容器:
docker rm $(docker ps -aq)
docker ps -aq
docker -it 交互式终端
docker exec -it 容器名/ID /bin/bash 进入到container的bash环境下
docker stop
docker start
删除运行完的容器:
docker rm $(docker ps -f "status=exited" -q)
显示容器详细信息:
docker inspect 容器
显示容器运行时的输出:
docker logs

制作自己想要的images:

根据一个容器制作成自己的image(例如:根据一个centos运行一个自己想要的container):

运行并进入centos container
docker run -it centos

安装一个vim:
yum -y install vim

commit 一个新的image
docker commit 7ba22b272612 lijiahao/centos-vim

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker history查看层数:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

新层可以覆盖或者叠加旧层

根据dockerfile制作自己想要的image

mkdir docker-centio-vim && cd docker-centio-vim
vim Dockerfile

FROM centos
RUN yum install -y vim

docker build -t lijiahao/centos-vim-dockerfile/latest .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

Dockerfile详解

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

想在哪个base-image上制作我们的images,为了安全,尽量使用官方的image:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

LABEL:类似于注释

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

RUN:在安装软件时,每运行一次命令,都会使镜像增加一层,所以尽量使用&&

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

WORKDIR:设定工作目录并进入,如果没有次目录会自动创建目录

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

ADD && COPY:add适合添加压缩文件到目录,copy适合将配置文件到目录,本地压缩文件才适合用add

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

ENV:注入环境变量,主要用于引用常量,在制作Dockerfile时利于更新版本,增强Dockerfile可维护性

VOLUME:共享逻辑卷,数据持久存储。格式:外面目录:容器内目录

EXPOSE:端口映射:格式:宿主机端口:容器内部端口

CMD && ENTERPOINT:

三种参数对比:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

CMD

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker run -it image /bin/bash 将会不输出 “hello Docker”,bin/bash覆盖了CMD

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

ENTRYPOINT:使用较多,不是简单的一个命令去执行而是以应用程序的形式运行

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

两种格式探究:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

EXEC格式命令使用绝对路径,类似于python列表'[]' 配合 ""

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建第一种Dockerfile输出:
docker build -t lijiahao/centos-entrypoint-shell .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建第二种docker输出:
docker build -t lijiahao/centos-entrypoint-exec .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

修改第二种docker,在bash中执行命令,通过"-c"指明后面都是参数

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker build -t lijiahao/centos-entrypoint-exec-new .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

镜像仓库:

官方镜像仓库:dockerhub

使用dockerhub推送镜像:
在https://hub.docker.com/注册一个账号
创建一个镜像仓库叫做hello-word
登陆:
docker login
输入用户和密码:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

推送镜像到公有镜像仓库;
用法:
Usage: docker push [OPTIONS] NAME[:TAG]
-a, --all-tags Push all tagged images in the repository

查看:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

拉取镜像:docker pull lijiahao0302/hello-word

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

官方私有镜像仓库dockerhub

参考文档:
https://hub.docker.com/_/registry

使用另外一台可以和本台虚拟机互通的虚拟机做docker私有仓库(本人选择192.168.1.10作为本地操作系统,192.168.1.11作为镜像仓库地址):

11构建仓库
建议先配置个人的镜像加速器,阿里云上都有,使用加速器可以提升获取Docker官方镜像的速度
https://cr.console.aliyun.com/cn-beijing/instances/mirrors

docker run -d -p 5000:5000 --restart always --name registry registry:2

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

在本地web界面查看:
http://192.168.1.11:5000/v2/_catalog

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

10制作镜像

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

10客户端需要配置11为信任的仓库:
vim /etc/docker/daemon.json

{
"insecure-registries": ["192.168.1.11:5000"]
}

vim /lib/systemd/system/docker.service

10推送镜像

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

11查看:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

也可以这样查看:curl -XGET http://192.168.1.11:5000/v2/_catalog

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

10尝试拉取镜像:
docker pull 192.168.1.11:5000/hello-word

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker harbor

Harbor - 企业级 Docker 私有仓库
安装底层需求:
Python应该是2.7或更高版本
Docker引擎应为1.10或更高版本
Docker Compose需要为1.6.0或更高版本

docker-compose 安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装:Harbor ,官方地址
https://github.com/vmware/harbor/releases

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建 https 证书以及配置相关目录权限
创建一个2048位的加密私钥:
openssl genrsa -des3 -out server.key 2048
输入两次私钥密码即可

创建证书请求认证证书:
openssl req -new -key server.key -out server.csr

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

备份一下私钥:
cp server.key server.key.org

因为nginx开启需要输入密钥,所以我们需要退密钥,这样nginx开启就不需要密钥了
openssl rsa -in server.key.org -out server.key

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建自签证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

将证书文件创建到/data目录下:
mkdir -p /data/cert
mv server.* /data/cert/
chmod -R 777 /data/cert

安装:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

tar xvf harbor-offline-installer-v2.3.5.tgz
mv harbor /usr/local/
cd /usr/local/harbor/ && ls

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

cp harbor.yml.tmpl harbor.yml

vim harbor.yml

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

./install.sh

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker ps -a 

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

访问测试

先修改宿主机hosts文件:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

浏览器:https://hub.ljh.com/

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

登陆时的用户和密码:
admin / Harbor12345

镜像进行上传测试
可以看到一个library公开仓库

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建两个用户(系统管理员、用户1)

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

退出admin,登陆系统管理员用户,可以看到这个公有仓库:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

使用系统管理员用户创建一个私有仓库和一个公开仓库

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

推送镜像命令:
docker tag SOURCE_IMAGE[:TAG] hub.ljh.com/public_library/REPOSITORY[:TAG]
docker push hub.ljh.com/public_library/REPOSITORY[:TAG]

退出重新登陆用户1

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

可以看到public_library

使用服务器10指定镜像仓库地址(真正去供应商购买的话不需要这一段),推送项目:

vim /etc/docker/daemon.json
{
        "insecure-registries": ["hub.ljh.com"]
}
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

systemctl daemon-reload
systemctl restart docker

修改推送服务器(10)的hosts
vim /etc/hosts
192.168.1.11 hub.ljh.com

推送一个ubuntu的镜像到公开仓库:
系统管理员账户将用户1加入维护人员

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

此时登陆用户1,可以推送了
docker tag SOURCE_IMAGE[:TAG] hub.ljh.com/private_library/REPOSITORY[:TAG]
docker push hub.ljh.com/private_library/REPOSITORY[:TAG]

命令:
先登陆用户1:
docker login hub.ljh.com
docker tag centos:latest hub.ljh.com/private_library/myhub-centos:v1.1
docker push hub.ljh.com/private_library/myhub-centos:v1.1

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)
01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

拉取命令:docker pull hub.ljh.com/private_library/myhub-centos:v1.1

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

Dockerfile实战

实战1安装一个python小项目:

1、制作一个python程序制作成image并运行成container

安装python3依赖的安装包

安装包:https://www.python.org/downloads/

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

解包,编译安装
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
tar -xzvf Python-3.9.0.tgz -C /usr/local/src/
cd /usr/local/src/Python-3.9.0
./configure --prefix=/usr/local/python3
make && make install

添加环境变量
cd /etc/profile.d/
vim python3.sh
export PATH="$PATH:/usr/local/python3/bin"
source ../profile
echo $PATH

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

正式制作:

环境准备:
pip3 install flask

app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello()
	return "hello docker"
if __name__ == '__main__'
	app.run()

目录结构:

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

先拉一个python镜像环境
docker pull python
docker run -itd python:latest bash
docker exec -it 01ce8524a4cb bash

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

vim Dockerfile

FROM python
LABEL maintainer="Jiahao li<ljh19960302@163.com>"
RUN pip3 install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python3","app.py"]

docker build -t lijiahao0302/flask-hello-word .

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

运行容器:
docker run -d lijiahao0302/flask-hello-word

实战,制作传参docker2:

将命令stress打包到docker中,实现容器CPU、内存等限制

安装并了解一个stress 压测工具
docker run -it unbuntu
apt-get update && apt-get install -y stress

stress参数

     --version      show version statement
 -v, --verbose      be verbose
 -q, --quiet        be quiet
 -n, --dry-run      show what would have been done
 -t, --timeout N    timeout after N seconds
     --backoff N    wait factor of N microseconds before work starts
 -c, --cpu N        spawn N workers spinning on sqrt()
 -i, --io N         spawn N workers spinning on sync()
 -d, --hdd N        spawn N workers spinning on write()/unlink()
     --hdd-bytes B  write B bytes per hdd worker (default is 1GB)
 -m, --vm N         spawn N workers spinning on malloc()/free()(分配N个workers)
     --vm-bytes B   malloc B bytes per vm worker (default is 256MB)(指定为每个worker分配的内存,默认256M)
     --vm-stride B  touch a byte every B bytes (default is 4096)
     --vm-hang N    sleep N secs before free (default none, 0 is inf)
     --vm-keep      redirty memory instead of freeing and reallocating

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

verbose 一个进程分配256M内存
stress --vm 1 -v

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

创建stress docker
mkdir stress && cd stress

vim Dockerfile

FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD []

docker build -t lijiahao/ubuntu-stress .
docker run -it lijiahao/ubuntu-stress --vm 1 --verbose

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

资源限制:

cgroup

cgroup(control group,控制组) 是 Linux 内核的一个功能,可以用来限制、控制与分离一个进程组。Docker 就是通过 cgroup 来控制容器的 CPU、内存、磁盘输入输出等资源

在默认情况下,Docker 容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资源进行限制,容器之间就会相互影响,一些占用硬件资源较高的容器会吞噬掉所有的硬件资源,从而导致其它容器无硬件资源可用,发生停服。

Docker 提供了限制内存,CPU 或磁盘 IO 的方法, 在 docker create 或者 docker run 的时候可以对容器所占用的硬件资源大小以及多少进行限制。

限制CPU

相对限制

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

-c 或 --cpu-shares:用于多个容器运行时设置容器对于 CPU 的使用权重比例(共享权值)
Docker 默认每个容器的权值为 1024。如果不指定或将其设置为 0,都将使用默认值。

当系统上运行了两容器,第一个权重是 1024,第二个权重是 512。第二个启动后没运行任何进程,第一个的进程很多。此时,第一个完全可以占用第二个的 CPU 空闲资源,这就是共享式 CPU 资源。如果第二个也跑了进程,那么就会把自己的 512 给要回来,按照正常权重1024:512 划分

CPU 共享式证明了 CPU 为可压缩性资源。

例:指定权重:docker container run -it --rm -c 1024 --name demo01 nginx

--cpus:用于限制容器运行的核数。
从 1.13 版本之后开始支持限定容器能使用的 CPU 核数,属于常用的限制手段之一。
例子:指定核数,可以是 1.5 之类的小数:docker container run -it --rm --cpus=2 --name demo02 busybox /bin/sh

--cpuset-cpus:用于限制容器运行的 CPU 核心
例如,主机有 4 个 CPU 核心,CPU 核心标识为 0-3,可以指定容器只在标识 0 和 3 的两个 CPU 核心上运行。
指定容器在 CPU-0、CPU-1 及 CPU-2 上执行:docker container run -it --cpuset-cpus="0-2" --name demo04 busybox /bin/sh
指定容器在 CPU-1 和 CPU-3 上执行:docker container run -it --cpuset-cpus="1,3" --name demo03 busybox /bin/sh

实验:开三个终端:
终端1:启动一个docker
docker run --cpu-shares=5 --name=test1 lijiahao/ubuntu-stress --cpu 1

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

终端2:启动一个docker
docker run --cpu-shares=10 --name=test2 lijiahao/ubuntu-stress --cpu 1

终端3:观察

绝对限制
Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms。
我们可以通过设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间来达到限制 CPU 的目的。具体参数如下:

--cpu-period:设置每个容器进程的调度周期,单位 us。
--cpu-quota:设置在每个周期内容器能使用的 CPU 时间,单位 us。

示例 1:
# 将 CFS 调度周期设为 50000,将每个周期内的 CPU 配额设置为 25000
docker run -it --cpu-period=50000 --cpu-quota=25000 busybox /bin/sh
该配置表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。

示例 2:
# 将容器的 CPU 配额设置为 CFS 周期的两倍
docker run -it --cpu-period=10000 --cpu-quota=20000 busybox /bin/sh
CPU 使用时间是周期的两倍,意味着给容器分配了两个 CPU。容器可以在每个周期内使用两个 CPU 的 100% 时间。

注:
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。
容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

内存限制
对memory和 memeory-swap的限制

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

-m,--memory:设置内存使用限额,例如:100MB,1GB。
允许容器使用 100M 内存
docker container run -d -m 100m --name demo01 nginx

--memory-swap:设置内存 + Swap 的是使用限额。
允许容器使用 100M 内存和 200M Swap
docker container run -d -m 100m --memory-swap 300m --name demo02 nginx

实验:
限制docker使用为400M之内(200M memory+200M memory-swap),现在启动一个stress-docker分配给worker 500M的memory

先分配100M
docker run -it --memory=200M lijiahao/ubuntu-stress --vm 1 --verbose --vm-bytes 100M

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

docker run -it --memory=200M lijiahao/ubuntu-stress --vm 1 --verbose -vm-bytes 500M

启动失败,因为内存不够

01-docker基础概念(安装,命令,镜像制作,仓库,资源限制)

磁盘 IO 限制
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。
bps: byte per second,表示每秒读写的数据量。
iops :io per second,表示每秒的输入输出量(或读写次数)。

目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。
支持如下参数:
--blkio-weight:用于改变容器的权重,类似于 CPU 限制的 -c 参数,默认值为 500。
--device-read-bps:限制读某个设备的 bps。
--device-write-bps:限制写某个设备的 bps。
--device-read-iops:限制读某个设备的 iops。
--device-write-iops:限制写某个设备的 iops。

示例:
# 限制读写权重
docker container run -d --blkio-weight 500 --name demo01 nginx
docker container run -d --blkio-weight 250 --name demo02 nginx
# 限制磁盘 /dev/sda 写带宽为 30M
docker container run -d --device-write-bps /dev/sda:30MB --name demo03 nginx

发布者:LJH,转发请注明出处:https://www.ljh.cool/6877.html

(0)
上一篇 2021年10月1日 上午12:57
下一篇 2022年3月10日 下午8:42

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注