安装docker
# yum remove -y docker docker-common docker-selinux docker-engine
# yum install -y yum-utils device-mapper-persistent-data lvm2
# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
# sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# yum makecache fast
# yum install docker-ce -y
Install Docker Engine on Ubuntu
Docker - 原理
- docker 三大要素
- cgroup
- namespace
- unionFS
- CGroup
全称是control group,用来限定一个进程的资源使用。由Linux 内核支持,可以限制和隔离Linux进程组所使用的物理资源。比如cpu、内存、磁盘、网络IO,是Linux container技术的物理基础。 - NameSpace
是一个资源隔离技术,主要是用来隔离进程ID,IPC,Network等系统资源
linux 共有6种 namespace 类型:- IPC: IPC(信号量、消息队列、共享内存等)隔离
- Network: 网络设备、网络栈、端口等隔离
- Mount: 文件系统挂载点隔离
- PID: 进程编号隔离
- User: 用户和用户组隔离
- UTS: 主机和域名隔离
从linux内核4.6开始提供了第7种namespace: CGroup namespace主要用于cgroup根目录隔离
- unionFS
unionFS 可以把文件系统上多个目录内容联合挂载到同一个目录下,而目录的物理位置是分开的。解决了docker运行后的container挂载宿主机目录问题。 - docker的网络模式
Driver Description bridge The default network driver. host Remove network isolation between the container and the Docker host. none Completely isolate a container from the host and other containers. overlay Swarm Overlay networks connect multiple Docker daemons together. ipvlan Connect containers to external VLANs. macvlan Containers appear as devices on the host’s network.
https://docs.docker.com/engine/network/
docker 存储
docker system df
root@ip-172-20-60-86:~# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 17 10 3.648GB 507.3MB (13%)
Containers 11 11 80.18MB 0B (0%)
Local Volumes 2 1 18.88GB 263.9kB (0%)
Build Cache 22 0 109.9MB 109.9MB
root@ip-172-20-60-86:~#
安全清理无用的没有再用的 docker images
docker system prune --all --force --volumes > /dev/null
docker 启动参数
--storage-opt dm.basesize=20G # 表示限制单个容器最多占用 20G 空间,将应用于任何新建容器。
sudo dockerd --storage-opt dm.basesize=50G
ubuntu 修改OS源
sed -i 's!archive.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list
sed -i 's!security.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list
root@ip-172-20-60-86:~# docker stats --no-stream image-tools-web
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5fd1fc573072 image-tools-web 0.00% 7.598MiB / 31.34GiB 0.02% 64.8GB / 44.1GB 4.58GB / 120GB 11
root@ip-172-20-60-86:~#
Docker event state

docker - cp
# docker create --name ae docker.io/anchore/enterprise:latest
# docker cp ae:/docker-compose.yaml ~/aevolume/docker-compose.yaml
docker - history
docker history nginxphp:20191205.3 --no-trunc=true
/etc/sysctl.conf 设置网络转发
# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
fs.file-max= 65535
EOF
# 生效
# sysctl --system
查看本地镜像inspect
docker inspect registry.local:5000/k8s/etcd:3.5.12-0
crictl inspecti registry.local:5000/k8s/etcd:3.5.12-0
/etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://mirror.ccs.tencentyun.com",
"http://hub-mirror.c.163.com",
"http://f1361db2.m.daocloud.io"
],
"bip": "172.150.0.1/16",
"default-address-pools": [
{
"base": "172.100.0.0/16",
"size": 24
},
{
"base": "172.120.0.0/16",
"size": 24
}
],
"experimental": true,
"log-driver":"json-file",
"log-opts": {
"max-size":"500m",
"max-file":"3"
},
"data-root": "/data/docker_lib/data",
"insecure-registries": [
"10.0.0.10:5000",
"registry.local:5000"
]
}
根据磁盘映射id,找到容器id
通过 d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383,找到容器。也可能是镜像层
[root@RJYF-Harbor-NZM-01 overlay2]# du -sh ./* | grep G
1.8G ./c6f249a33479f265cb56d2140e18765a8901cb2f1a8bc8b682510f472a960769
41G ./d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383
[root@RJYF-Harbor-NZM-01 overlay2]# pwd
/var/lib/docker/overlay2
[root@RJYF-Harbor-NZM-01 overlay2]# docker ps -aq | xargs docker inspect --format '{{.Name}},{{.State.Pid}},{{.Id}},{{.GraphDriver.Data.WorkDir}}' | grep d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383
download-docker-images.sh
#!/bin/bash
set -x
date=`date +%H_%M_%S`
images="
platform-test/device-maintenance:dev-f5ced396
iot-device-maintenance/device-maintenance-front:v180-release
"
harbor="harbor.test.com"
tags=" "
for image in $images;do
docker rmi $harbor/$image
docker pull --platform=arm64 $harbor/$image
tags="$harbor/$image $tags"
done
docker save $tags > tags_${date}.tar
Run Postgres
#!/bin/bash
docker stop sonar-db
docker rm sonar-db
docker run -d \
--name sonar-db \
-e POSTGRES_USER=sonar-dbuser \
-e POSTGRES_DB=sonar \
-e POSTGRES_PASSWORD=password \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v /data/pgsql:/var/lib/postgresql/data \
-p 5432:5432 \
--restart always \
registry.local:5000/postgres/postgres:10
Run MySQL
#!/bin/bash
docker stop con-db
docker rm con-db
docker run -d \
--name con-db \
-v /data/mysql:/var/lib/mysql \
-p 3306:3306 \
--restart always \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=root \
-e MYSQL_DATABASE=con \
registry.local:5000/mysql/mysql:5.7.30
dnsmasq 创建自定义dns server
https://hub.docker.com/r/dockurr/dnsmasq
常用命令
强制删除容器
# docker rm -f leslie
# 查看镜像ID和镜像地址
docker images --format "table {{.ID}}\t{{.Repository}}:{{.Tag}}"
# 查看镜像地址
docker images --format "table {{.Repository}}:{{.Tag}}"
# 查看容器的name和镜像地址
docker ps -a --format="{{.Names}}\t{{.Image}}"
# 查看exited状态容器
docker ps -a -f "status=exited" --format={{.Names}}
# 查看running状态容器
docker ps -a -f "status=running" --format={{.Names}}
# 给用户添加docker权限
usermod -a -G docker ec2-user
ubuntu:/etc/default/docker
centos: /etc/sysconfig/docker
# 查看正在运行容器
docker ps
# 查看所有的容器,包括正在运行和停止的。
docker ps -a
# 查看最后两个进程
docker ps -n 2
# 获取所有容器ID
docker ps -a -q
# 查看端口映射
docker ps -l
# 只查看所有docker的name
docker ps -a --format={{.Names}}
# docker inspect
# 获取容器的运行状态
docker inspect -f='{{.State.Running}}' deamon_dave
# 获取运行中容器的PID
docker inspect -f='{{.State.Pid}}' daemon_dave
# ubuntu 后面可以加多个容器标识符
docker inspect -f='{{.State.Running}}' daemon_dave
# redis 查看redis容器的IP地址
docker inspect -f='{{.NetworkSettings.IPAddress}}' redis
# docker rm
# 删除webserver这个容器。前提是这个容器处于停止状态。
docker rm webserver
# 启动
docker start webserver
# 停止
# stop 是向容器发送SIGKILL信号
docker stop webserver
# docker attach
# 只有在容器运行,并且有可用shell的时候。才可以再次附着到已经运行的容器。
docker attach ubuntu
docker attach f1694d43a1b6
# docker logs
# 查看容器运行日志
docker logs deamon_dave
# 类似于tail -f实时监控deamon_dave的日志。-t为每条日志加上时间戳。
docker logs -ft deamon_dave
# 获取最后10行日志
docker logs --tail 10 deamon_dave
# 从最后一行日志开始监控
docker logs --tail 0 -f deamon_dave
# docker top
# 查看容器资源占用。
docker top deamon_dave
# docker exec
# 在容器内部运行进程
docker exec -d ubuntu touch /etc/new_file
docker exec -t -i ubuntu /bin/bash
# docker rm
# 删除不在运行的容器
docker port
# 查看容器的端口映射
# 容器内部的80/tcp端口映射到宿主机的32768随机端口上了。
docker port static_web
80/tcp -> 0.0.0.0:32768
# 获取docker的pid
qikang@LeslieTest:~$ docker inspect --format "{{ .State.Pid }}" NginxWebServer
30300
qikang@LeslieTest:~$ sudo nsenter --target 30717 --mount --uts --ipc --net --pid
root@e064c3b163c5:/#
# 查看所有容器的CONTAINER ID
qikang@LeslieTest:~$ docker ps -a -q
# 查看所有容器的名字
docker ps -a --format={{.Names}}
# 删除exited状态的容器
docker rm $(docker ps -f "status=exited" --format={{.Names}})
# docker images 加速
# vim /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]}
# 镜像的导入导出
# 导出镜像
docker save php:5.6.25-apache | gzip > docker_php5.6.25_apache.tar.gz
# 导入镜像
docker load -i docker_php5.6.25_apache.tar.gz