Docker it!

常用命令

通过ssh挂载到远程主机的目录
1
2
3
4
5
6
7
8
# 先数据卷驱动,下载vieux/sshfs
docker plugin install --grant-all-permissions vieux/sshfs

#创建数据卷
docker volume create --driver vieux/sshfs -o sshcmd=username@172.17.122.24:/work/nginx -o password=passwd sshvolume

#使用该数据卷
docker run -d --name nginx -v sshvolume:/usr/share/nginx/html nginx
通过nfs挂载远程主机的目录
1
2
3
#创建数据卷
docker volume create --driver local -o type=nfs -o o=addr=192.168.1.1,rw -o device=:/path/to/dir nfsvolume
docker run -d --name nginx -v nfsvolume:/usr/share/nginx/html nginx
首次启动并挂载到本地的空目录
1
2
docker volume create --driver local -o type=none -o device=/work/volume -o o=bind localvolume
docker run -d --name nginx -v localvolume:/usr/share/nginx/html nginx
删除所有未被使用的数据卷
1
docker volume prune -f
修改docker安装目录

docker默认安装的目录是在/var/lib/docker目录下,如果需要修改到其他目录,可以做如下方法

  1. 将/var/lib/docker内容复制到其他目录,然后建个软连接
  2. 对于版本大于 v17.05.0,修改/etc/docker/daemon.json,加入”data-root”: “/store/software/docker”

然后重启docker服务

打包并导入镜像
1
2
docker save -o ubuntu.tar ubuntu:16.04
docker load -i ubuntu.tar
Dockerfile
1
2
3
4
5
FROM ubuntu:16.04

RUN mkdir -p /work/29418

COPY code /work/29418

在使用Dockerfile构建镜像的时候,默认会将当前目录中的所有内容复制到docker中的builder文件夹中,所以尽量在一个新目录中新建镜像

配置btrfs文件驱动
  1. 将docker的安装目录移动到btrfs问价系统上的目录上

  2. 在/etc/docker/daemon.json文件中添加配置

1
"storage-driver":"btrfs"

重启docker服务,通过docker info查看Storage Driver的类型是btrfs

在容器里面可以使用btrfs的子卷和快照功能,但是无法查看和删除子卷,但是在容器外面却可以

在容器外面查看子卷的情况

btrfs subvolume list ./

avatar

可以看到,如果配置了btrfs驱动,每次启动一个容器docker就会自动新建对应的subvolume,图中最后俩个subvolume是在容器内部新建的

1
2
btrfs subvolume create subvolume1
btrfs subvolume snapshot subvolume1 subvolume1_snapshot  #会新建一个subvolume1_snapshot的目录,内容和subvolume1一样,但是却不会占用双倍的空间
将正在运行的容器打包成镜像
1
sudo docker commit -a "guishaoli@github.com" -m "with some software installed" 593d2327c2c8 ubuntu:custom
搭建内网harbor
  1. 安装docker-compose,harbor对docker-compose的版本都要求,尽量使用最新的吧,

curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

  1. 按装pip

apt-get install python-pip

  1. 下载Harbor包,版本可以换成新的,然后解压

https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.6.1.tgz

  1. 修改配置文件,可能叫harbor.yml,修改hostname为自己的ip,还是http的port,其他的配置可自行百度

  2. 执行./install.sh,没什么问题就可以看见在下载相关镜像并且使用docker-compose启动容器

  3. 在节点上 ,需要配置daemon.json中"insecure-registries":["ip:port"]

限制资源

–cpu 4 4个进程

–cpus 1.5 1.5个cpu核数

–cpuset-cpus=0,1 使用第0和第1个核

-m 最小值是4m,

–memory-swap 使用的swap大小,如果为-1,不限制swap大小,为0或者和-m相同,那么可以使用俩倍与-m大小的swap,如果比-m大,那么可以使用–memory-swap减去-m值的swap大小

–memory-swappiness 主机包容器使用的匿名也swap出来,这个是个比例

–memory-reservation 设置一个内存使用的soft limit,是OOM的阈值,必须小于-m的值

–kernel-memory 内核内存的大小

–oom-kill-disable 是否在OOM的时候杀死容器,只有设置了-m,这个才能设置为false

–device-read-bps 磁盘的读速度

–device-write-bps 磁盘的写速度

–device-read-iops 磁盘每秒io读操作的上限

–device-write-iops 磁盘每秒的IO写操作上限

目前不支持限制单个容器的磁盘空间占用,但是可以使用lvm做逻辑分卷,挂载卷的方式限制挂载的空间的大小

在docker里面运行docker

启动容器时,加上参数--privileged,保证足够的权限

在由于在容器里面运行容器时,其默认网段可能会与宿主容器冲突,需要修改宿主容器的容器网段配置

1
2
3
4
5
6
7
8
9
10
service docker stop

ip link set dev docker0 down

iptables -t nat -F POSTROUTING

brctl addbr bridge0
ip addr add 172.17.10.1/24 dev bridge0
ip link set dev bridge0 up

修改daemon.json,添加如下行

1
"bridge":"bridge0"

重启docker服务

修改容器网段

上面的修改网段的方法需要重启服务,比较麻烦,但是如果容器已经在运行,并且不能重新用docker run启动一个容器,那么就不得不用上面的方法这么做了。

但是如果在容器启动的时候就规划好网段,可以使用以下方法

1
2
docker network create -d brigde --subnet 172.18.10.0/16 mynet
docker run --net-mynet --ip=172.18.10.119 -d --name=con ubuntu

这样就可以指定容器的ip了

如果同一个宿主机的不同容器在不同的网段,即在启动容器的时候指定不同的bridge,那么需要如下的操作让这些容器联通

1
docker network connect mynet one-container #将容器one-container连接到网段mynet中,这样one-container就可以和mynet中的容器联通了
启动docker engine api

通过service docker status找到docker的service文件,ubuntu中一般是在/lib/systemd/system/docker.service,修改这个文件,注释掉原来的ExecStart行,改成ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock,然后systemctl daemon-reload && service docker restart,即可,访问主机的2375端口,就可以获取主机的docker相关信息

官网上有对应的api使用方法介绍,比如1.39版本的api使用地址https://docs.docker.com/engine/api/v1.39/

buildkit

这个是docker官方推出的新的构建镜像工具,当前属于测试阶段,需要docker的版本大于18.09才可以使用。

  1. 需要docker/dockerfile:experimental镜像

  2. 需要moby/buildkit镜像

  3. 安装命令如下

1
2
3
docker run --name buildkit -d --privileged -p 1234:1234 moby/buildkit --addr tcp://0.0.0.0:1234
export BUILDKIT_HOST=tcp://0.0.0.0:1234
docker cp buildkit:/usr/bin/buildctl /usr/local/bin/
  1. Dockerfile中的首行需要添加
1
# sytanx = docker/dockerfile:experimental
  1. 环境变量中export DOCKER_BUILDKIT=1

  2. 在Dockerfile中

1
2
RUN --mount=type=bind,from=ubuntu:16.04,source=/etc,target=/myetc/ \
    ls /myetc

表示将ubnutu:16.04中的镜像中的/etc目录挂载到本次构建镜像的/myetc目录中

docker export import
1
2
3
docker export -o ubuntu.tar ubuntu  # ubuntu是一个容器

docker import ubuntu.tar ubuntu:1209 # 将ubuntu.tar载入成新的镜像

网络模式

  1. host模式,主机模式,直接使用宿主机的ip和端口

  2. container模式,容器模式,和指定的容器共享ip和端口

  3. bridge模式,网桥模式,容器使用独立的network namespace,创建虚拟网卡,然后给容器分配ip和端口,然后在iptables配置DNAT,实现端口转发

  4. none,无网络