目录

docker基础

安装及命令

Docker命令

常用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker version  
docker info  
docker pull  
docker login  
docker logout  
docker images  
docker ps -a  
docker start|stop|restart  
docker rm xxxx  
docker rmi xxxx  
docker exec -it `name OR id` /bin/bash

批量停止删除容器和镜像

停止所有容器

1
docker stop $(docker ps -aq)

删除所有的容器

1
docker rm $(docker ps -aq)

删除所有的镜像

1
docker rmi $(docker images -q)

Docker目录拷贝

本机/root/test目录拷贝到容器内/root目录内

1
docker cp /root/test 28a186bbebd4:/root/

本机/root/test目录拷贝到容器内,并更名为/test123.注意命令后没有/.

1
docker cp /root/test 28a186bbebd4:/test123

将容器内的/test目录拷贝到主机的/root目录内.

1
docker cp  28a186bbebd4:/test /root/

Docker 文件拷贝

本机1.db文件拷贝到容器内root目录内.

1
docker cp 1.db 28a186bbebd4:/root/

将容器内的/root/1.db文件拷贝到主机的当前目录.

1
docker cp 28a186bbebd4:/root/1.db .

Docker命令补全

安装 bash-completion

1
sudo yum install -y bash-completion

根据官方文档进一步配置

官网链接

1
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

重新进入终端即可补全命令。

Docker镜像

容器创建镜像

通过容器提交生成镜像

1
docker commit 容器名 镜像名

保存镜像到文件

1
docker save 镜像名 > 文件名.tar 

从文件恢复到镜像

1
docker load < 文件名.tar

通过镜像启动新容器

1
docker run --name 容器名 相关参数 最后接新的镜像名

例如

赋予容器所有权限

1
docker run -it --name test -d --privileged=true centos:7.6.1810 /usr/sbin/init 

容器暴露端口给外面访问,容器内20、80,容器外2000、8080

1
docker run -it --name test -p 2000:20 -p 8080:80 -d centos:7.6.1810 /usr/sbin/init

容器不间断运行,docker重启容器会自动重启不用人工干预。

做数据持久化存储。本地目录容器目录映射。容器内端口5000 容器外端口5000。

容器内目录:/var/lib/registry

容器外目录:/opt/registry

1
docker run -it --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry

退出容器后立即销毁

1
docker run -it --rm --name test2 alpine sh

进入容器

1
docker exec -it 容器名/容器id /bin/bash 

导入导出镜像

导出镜像

1
2
3
docker images
# 查看IMAGE ID
docker save bb2b73d4a4a6 > xxx.tar

导入镜像

1
docker load < xxx.tar

修改镜像名

1
docker tag bb2b73d4a4a6 xxx/xxx:latest

Docker hub

上传本地镜像

登录

1
docker login -u 用户名 ip/域名 -p 密码

上传镜像前打标签

1
docker tag SOURCE_IMAGE[:TAG] harbor.lhp.com/images/IMAGE[:TAG]

上传镜像

1
docker push harbor.lhp.com/images/IMAGE[:TAG]

下载镜像

1
docker pull harbor.lhp.com/images/alpine:latest

登录成功信息查看

1
2
3
4
5
6
7
cat /root/.docker/config.json
auth后面字段可以用base64进行解码
#加密
echo test|base64
dGVzdAo=
#解密
echo "YWRtaW46SGFyYm9yMTIzNDU=" | base64 -d

自动构建镜像

Docker hub创建仓库

  • 链接 GitHub
  • 配置 Build Rules
Source TypeSourceDocker TagDockerfile location
BranchMasterLatest/
Tag/^v([0-9.]+)$/{\1}/

Tag

Github Tag

  • /^v([0-9.]+)$/ 对应 v1.0 或 v1.0.0
  • /^([0-9.]+)$/ 对应 1.0 或 1.0.0
  • /^([0-9]+)$/ 对应 20210101

Docker Tag

  • {sourceref} 对应 Github Tag
  • {\1} 对应 Github Tag 去除 v

Github push

  • 正常 commit 并 push 到 GitHub
  • Docker Hub 自动构建 master 分支为 latest 镜像
  • 本地 tag commit 并 push tag
  • Docker Hub 自动构建 tag 标签为 tag名 镜像

创建标签

1
2
3
4
5
6
git log
# 复制 commit ID
git tag -a v1.0.0 commitID -m "v1.0.0"
# 本地 tag 版本号标签
git push origin v1.0.0 
# 提交本地标签到 GitHub

删除标签

1
2
git tag -d 标签名
git push origin :refs/tags/标签名

Docker安装

Docker官方脚本安装

下载一键安装脚本

1
curl -fsSL https://get.docker.com -o get-docker.sh

运行一键安装脚本(阿里云加速镜像)

1
sudo sh get-docker.sh --mirror Aliyun

Docker官方手动升级

升级yum

1
yum update

安装依赖包

1
2
3
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

配置仓库(国内用户推荐使用下面阿里云加速镜像)

1
2
3
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

配置仓库(阿里云加速镜像)

1
2
3
sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

排序查看仓库内文件

1
yum list docker-ce --showduplicates | sort -r

安装最新版Docker

1
sudo yum install docker-ce docker-ce-cli containerd.io

Docker启动命令

启动Docker

1
2
3
sudo systemctl start docker
sudo /etc/init.d/docker restart

查看Docker版本

1
sudo docker version

设置Docker开机自动启动

1
sudo systemctl enable docker

Docker-compose 安装

  1. 官方安装 - 速度慢,有可能被DNS污染导致失败.
  2. 手动安装 - 手动下载,离线安装.
  3. PIP 在线安装 - 使用 Python 的 pip 包管理工具在线安装.

官方安装

官网选择版本 https://github.com/docker/compose/releases 以下命令手动修改版本号,例如v2.2.3

1
curl -L https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

执行权限

1
chmod +x /usr/local/bin/docker-compose

检查 docker compose 版本

1
docker-compose version

手动安装

官网选择版本 https://github.com/docker/compose/releases 选择相应版本,下载到本地或者服务器中. 更名为docker-compose,并移动到/usr/local/bin目录下.

添加执行权限

1
chmod +x /usr/local/bin/docker-compose

检查 docker compose 版本

1
docker-compose version

pip在线安装

安装依赖

1
yum -y install epel-release

安装 PIP

1
yum -y install python-pip

升级 PIP

1
pip install --upgrade pip

升级报错

You are using pip version 8.1.2, however version 22.0.3 is available

解决

1
2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py >> get-pip.py
python get-pip.py

3.6版本的get-pip.py

1
2
curl https://bootstrap.pypa.io/get-pip.py >> get-pip.py
python get-pip.py

检查 PIP 版本

1
2
pip --version
pip 21.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

安装 docker compose。

1
pip install -U docker-compose

检查 docker compose 版本

1
2
3
4
5
6
docker-compose version

docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

Docker配置镜像加速及私有仓库

配置保存命令

配置daemon.json需要重载并重启生效

编辑 daemon.json

1
vi /etc/docker/daemon.json

重新加载 daemon.json

1
sudo systemctl daemon-reload

重启 Docker

1
sudo systemctl restart docker

配置镜像加速

公共镜像加速

添加Docker 中国官方镜像加速

1
2
3
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

更多公共镜像加速服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://registry.docker-cn.com",
    "https://reg-mirror.qiniu.com",
    "https://dockerhub.azk8s.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

私有镜像加速

可使用IP反向代理域名来配置私有镜像加速服务. 请注意镜像加速的 HTTP/HTTPS 协议,以及开放防火墙端口.

私有域名镜像加速

1
2
3
4
5
{
    "registry-mirrors": [
      "https://registry.yourdomain.com"
    ]
}

私有IP镜像加速

1
2
3
4
5
{
    "registry-mirrors": [
      "http://101.102.103.104:5000"
    ]
}

配置私有仓库

私有仓库可以使用内网 IP公网 IP的形式配置.

使用反向代理配置了域名的私有仓库无需配置daemon.json.

内网IP

1
2
3
4
5
{
    "insecure-registries": [
      "192.168.1.5:5000"
    ]
}

公网IP

1
2
3
4
5
{
    "insecure-registries": [
      "101.102.103.104:5000"
    ]
}

同时配置镜像加速和私有仓库

1
2
3
4
{
    "registry-mirrors": ["https://registry.yourdomain.com"],
    "insecure-registries": ["192.168.1.5:5000"]
}

更多的镜像加速服务和私有仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "registry-mirrors": [
      "https://registry.yourdomain.com",
      "https://hub-mirror.c.163.com",
      "https://mirror.baidubce.com"
    ],
    "insecure-registries": [
      "192.168.1.5:5000",
      "101.102.103.104:5000"
    ]
}

Docker迁移/var/lib/docker目录

前言

由于/var/lib/docker/overlay2目录占用磁盘空间过大,即使使用docker system prune -a命令也无法清理overlay2目录下的文件,手动删除则会导致容器无法启动.所以只有将 docker 根目录迁移至空间更大的目录.

迁移流程

停止docker服务

1
systemctl stop docker

迁移目录

创建新的 docker 根目录,确保创建的目录空间容量够大.

1
mkdir -p /home/docker/lib

迁移/var/lib/docker目录至/home/docker/lib

1
rsync -avz /var/lib/docker /home/docker/lib/

配置devicemapper.conf,先查看该文件是否存在.如不存在则新建.

1
2
mkdir -p /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/devicemapper.conf

写入以下代码保存:

1
2
3
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd  --graph=/home/docker/lib/docker

重加载 docker

1
2
3
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

检查

执行以下命令检查

1
docker info

确认显示信息中 Docker Root Dir 路径正确

1
2
3
 Docker Root Dir: /home/docker/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/

完成

再次启动容器,检查无误后可删除原路径/var/lib/docker/中的文件.

Docker 私有镜像仓库

安装服务端

本文以部署至公网,开启账号密码,并配置域名反向代理为例. 命令参数过多,为方便配置参数,建议使用docker compose部署.

创建htpasswd账号密码

启动一个一次性容器用于创建账号密码.密码文件路径以/root/registry/htpasswd为例,账号密码以admin12345678为例.

1
2
3
docker run --rm --entrypoint \
    htpasswd httpd:2 -Bbn \
    admin 12345678 > /root/registry/htpasswd

docker-compose.yml

volumes 挂载htpasswd密码文件,数据目录,时区文件.配置文件config.yml作为高级用户可选挂载. environment 环境变量开启认证,并开启删除镜像功能.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3"
services:
  registry:
    image: registry:2
    container_name: registry
    volumes:
      # - ./config.yml:/etc/docker/registry/config.yml
      - ./htpasswd:/auth/htpasswd
      - ./registry:/var/lib/registry
      - /etc/localtime:/etc/localtime
    ports:
      - 5000:5000
    environment:
      - REGISTRY_AUTH=htpasswd
      - REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
      - REGISTRY_STORAGE_DELETE_ENABLED=true
    networks:
      - registry
    restart: always

networks:
  registry:

启动

1
docker-compose up -d

成功启动后私有镜像仓库内网地址为: 192.168.1.5:5000 可根据需求使用域名配置反向代理,例如: https://registry.yourdomain.com

注意需开放防火墙 5000 端口

配置客户端

CentOS为例,创建或修改/etc/docker/daemon.json文件.

注意,如使用域名配置反向代理并开启HTTPS,则无需配daemon.json文件.

1
2
3
4
5
{
    "insecure-registries": [
      "192.168.1.5:5000"
    ]
}

1
2
3
4
5
{
    "insecure-registries": [
      "101.102.103.104:5000"
    ]
}

使用

登录

1
2
3
4
docker login registry.yourdomain.com
docker login 192.168.1.5:5000
docker login 101.102.103.104:5000
# 使用上文创建的账号密码 admin 12345678 登录

登出

1
2
3
docker logout registry.yourdomain.com
docker logout 192.168.1.5:5000
docker logout 101.102.103.104:5000

Push

将现有镜像 tag 为私有仓库镜像名

1
2
3
4
5
docker images
# 获取现有镜像的 IMAGE ID
docker tag 102816b1ee7d registry.yourdomain.com/mysql:8.0.13
docker tag 102816b1ee7d 192.168.1.5:5000/mysql:8.0.13
docker tag 102816b1ee7d 101.102.103.104:5000/mysql:8.0.13

Push 至私有镜像仓库

1
2
3
docker push registry.yourdomain.com/mysql:8.0.13
docker push 192.168.1.5:5000/mysql:8.0.13
docker push 101.102.103.104:5000/mysql:8.0.13

Pull

1
2
3
docker pull registry.yourdomain.com/mysql:8.0.13
docker pull 192.168.1.5:5000/mysql:8.0.13
docker pull 101.102.103.104:5000/mysql:8.0.13

查看镜像仓库清单

1
curl -u admin:12345678 -X GET https://registry.yourdomain.com/v2/_catalog

查看镜像 tag 清单

1
curl -u admin:12345678 -X GET https://registry.yourdomain.com/v2/mysql/tags/list

删除镜像

1
docker-compose.yml`环境变量中开启`REGISTRY_STORAGE_DELETE_ENABLED=true
获取镜像 digest hash
1
2
3
curl -u admin:12345678 --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET https://registry.yourdomain.com/v2/mysql/manifests/8.0.13
# 获取 digest hash 如下
sha256:45a2a291xxx223123fc03d9be551e362b460exxs56787736919baa
删除镜像清单
1
curl -u admin:12345678 -I -X DELETE https://registry.yourdomain.com/v2/mysql/manifests/sha256:45a2a291xxx223123fc03d9be551e362b460exxs56787736919baa
清理磁盘空间
1
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
手动删除目录

完成上述操作后还可以删除存储目录中的空目录文件,如不删除依旧可以被上述查看镜像仓库的命令查询到结果. 依照上文示例,挂载存储目录路径如下:

./registry/docker/registry/v2/repositories

警告
本文最后更新于 February 24, 2022,文中内容可能已过时,请谨慎使用。