docker基础
https://docs.docker.com/desktop/
支持在mac windows linux上安装
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
运行原理
image 概念
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
vim Dockerfile
FROM scratch
ADD hello /
CMD ["/hello"]
docker build -t lijiahao/my-helloword:latest .
docker和可执行文件大小相当:
查看构建过程:
docker history lijiahao/my-helloword
执行docker image
仓库:
官方:
docker pull ubuntu:20.04
docker pull ubuntu
个人或组织:
docker pull bitnami/wordpress
container概念:
container的运行方式:
docker默认非交互式运行,运行完成便会退出
交互式运行,同时进入docker:
docker run -it centos
打开一个新的终端查看:
docker run 参数:
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
直接分配一个tty并不进入,以后台方式运行:
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
docker history查看层数:
新层可以覆盖或者叠加旧层
根据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 .
Dockerfile详解
想在哪个base-image上制作我们的images,为了安全,尽量使用官方的image:
LABEL:类似于注释
RUN:在安装软件时,每运行一次命令,都会使镜像增加一层,所以尽量使用&&
WORKDIR:设定工作目录并进入,如果没有次目录会自动创建目录
ADD && COPY:add适合添加压缩文件到目录,copy适合将配置文件到目录,本地压缩文件才适合用add
ENV:注入环境变量,主要用于引用常量,在制作Dockerfile时利于更新版本,增强Dockerfile可维护性
VOLUME:共享逻辑卷,数据持久存储。格式:外面目录:容器内目录
EXPOSE:端口映射:格式:宿主机端口:容器内部端口
CMD && ENTERPOINT:
三种参数对比:
CMD
docker run -it image /bin/bash 将会不输出 “hello Docker”,bin/bash覆盖了CMD
ENTRYPOINT:使用较多,不是简单的一个命令去执行而是以应用程序的形式运行
两种格式探究:
EXEC格式命令使用绝对路径,类似于python列表'[]' 配合 ""
创建第一种Dockerfile输出:
docker build -t lijiahao/centos-entrypoint-shell .
创建第二种docker输出:
docker build -t lijiahao/centos-entrypoint-exec .
修改第二种docker,在bash中执行命令,通过"-c"指明后面都是参数
docker build -t lijiahao/centos-entrypoint-exec-new .
镜像仓库:
官方镜像仓库:dockerhub
使用dockerhub推送镜像:
在https://hub.docker.com/注册一个账号
创建一个镜像仓库叫做hello-word
登陆:
docker login
输入用户和密码:
推送镜像到公有镜像仓库;
用法:
Usage: docker push [OPTIONS] NAME[:TAG]
-a, --all-tags Push all tagged images in the repository
查看:
拉取镜像:docker pull lijiahao0302/hello-word
官方私有镜像仓库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
在本地web界面查看:
http://192.168.1.11:5000/v2/_catalog
10制作镜像
10客户端需要配置11为信任的仓库:
vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.11:5000"]
}
vim /lib/systemd/system/docker.service
10推送镜像
11查看:
也可以这样查看:curl -XGET http://192.168.1.11:5000/v2/_catalog
10尝试拉取镜像:
docker pull 192.168.1.11:5000/hello-word
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
创建 https 证书以及配置相关目录权限
创建一个2048位的加密私钥:
openssl genrsa -des3 -out server.key 2048
输入两次私钥密码即可
创建证书请求认证证书:
openssl req -new -key server.key -out server.csr
备份一下私钥:
cp server.key server.key.org
因为nginx开启需要输入密钥,所以我们需要退密钥,这样nginx开启就不需要密钥了
openssl rsa -in server.key.org -out server.key
创建自签证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将证书文件创建到/data目录下:
mkdir -p /data/cert
mv server.* /data/cert/
chmod -R 777 /data/cert
安装:
tar xvf harbor-offline-installer-v2.3.5.tgz
mv harbor /usr/local/
cd /usr/local/harbor/ && ls
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
./install.sh
docker ps -a
访问测试
先修改宿主机hosts文件:
浏览器:https://hub.ljh.com/
登陆时的用户和密码:
admin / Harbor12345
镜像进行上传测试
可以看到一个library公开仓库
创建两个用户(系统管理员、用户1)
退出admin,登陆系统管理员用户,可以看到这个公有仓库:
使用系统管理员用户创建一个私有仓库和一个公开仓库
推送镜像命令:
docker tag SOURCE_IMAGE[:TAG] hub.ljh.com/public_library/REPOSITORY[:TAG]
docker push hub.ljh.com/public_library/REPOSITORY[:TAG]
退出重新登陆用户1
可以看到public_library
使用服务器10指定镜像仓库地址(真正去供应商购买的话不需要这一段),推送项目:
vim /etc/docker/daemon.json
{
"insecure-registries": ["hub.ljh.com"]
}
systemctl daemon-reload
systemctl restart docker
修改推送服务器(10)的hosts
vim /etc/hosts
192.168.1.11 hub.ljh.com
推送一个ubuntu的镜像到公开仓库:
系统管理员账户将用户1加入维护人员
此时登陆用户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
拉取命令:docker pull hub.ljh.com/private_library/myhub-centos:v1.1
Dockerfile实战
实战1安装一个python小项目:
1、制作一个python程序制作成image并运行成container
安装python3依赖的安装包
安装包:https://www.python.org/downloads/
解包,编译安装
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
正式制作:
环境准备:
pip3 install flask
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello()
return "hello docker"
if __name__ == '__main__'
app.run()
目录结构:
先拉一个python镜像环境
docker pull python
docker run -itd python:latest bash
docker exec -it 01ce8524a4cb bash
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 .
运行容器:
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
创建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
资源限制:
cgroup
cgroup(control group,控制组) 是 Linux 内核的一个功能,可以用来限制、控制与分离一个进程组。Docker 就是通过 cgroup 来控制容器的 CPU、内存、磁盘输入输出等资源
在默认情况下,Docker 容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资源进行限制,容器之间就会相互影响,一些占用硬件资源较高的容器会吞噬掉所有的硬件资源,从而导致其它容器无硬件资源可用,发生停服。
Docker 提供了限制内存,CPU 或磁盘 IO 的方法, 在 docker create 或者 docker run 的时候可以对容器所占用的硬件资源大小以及多少进行限制。
限制CPU
相对限制
-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
终端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的限制
-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
docker run -it --memory=200M lijiahao/ubuntu-stress --vm 1 --verbose -vm-bytes 500M
启动失败,因为内存不够
磁盘 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