构建私有镜像仓库

Docker Registry

网上有很多的Registry服务器都支持第三方用户注册,而后基于用户名去做自己的仓库,但是使用互联网上的Registry有一个缺陷,那就是我们去推送和下载镜像时都不会很快,而在生产环境中很可能并行启动的容器将达到几十、上百个,而且很有可能每个服务器本地是没有镜像的,此时如果通过互联网去下载镜像会有很多问题,比如下载速度会很慢、带宽会用很多等等,如果带宽不够的话,下载至启动这个过程可能要持续个几十分钟,这已然违背了使用容器会更加轻量、快速的初衷和目的。因此,很多时候我们很有可能需要去做自己的私有Registry。

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,也可以使用官方的Docker Hub。Docker Registry分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

事实上,如果运维的系统环境托管在云计算服务上,比如阿里云,那么用阿里云的Registry则是最好的选择。很多时候我们的生产环境不会在本地,而是托管在数据中心机房里,如果我们在数据中心机房里的某台主机上部署Registry,因为都在同一机房,所以属于同一局域网,此时数据传输走内网,效率会极大的提升。

所有的Registry默认情况下都是基于https工作的,这是Docker的基本要求,而我自建Registry时很可能是基于http工作的,但是Docker默认是拒绝使用http提供Registry服务的,除非明确的告诉它,我们就是要用http协议的Registry。

Docker Private Registry

为了帮助我们快速创建私有Registry,Docker专门提供了一个名为Docker Distribution的软件包,我们可以通过安装这个软件包快速构建私有仓库。

容器时代,任何程序都应该运行在容器中,除了Kernel和init。而为了能够做Docker Private Registry,Docker Hub官方直接把Registry做成了镜像,我们可以直接将其pull到本地并启动为容器即可快速实现私有Registry。

Registry的主要作用是托管镜像,Registry运行在容器中,而容器自己的文件系统是随着容器的生命周期终止和删除而被删除的,所以当我们把Registry运行在容器中时,客户端上传了很多镜像,随着Registry容器的终止并删除,所有镜像都将化为乌有,因此这些镜像应该放在存储卷上,而且这个存储卷最好不要放在Docker主机本地,而应该放在一个网络共享存储上,比如NFS。不过,镜像文件自己定义的存储卷,还是一个放在Docker本地、Docker管理的卷,我们可以手动的将其改成使用其它文件系统的存储卷。

这就是使用容器来运行Registry的一种简单方式。自建Registry的另一种方式,就是直接安装docker-distribution软件。

使用docker-distribution自建Registry

在node02上自建Registry

[root@node02 ~]# yum -y install docker-distribution
[root@node02 ~]# vim /etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry  # 修改此处为一个容量大的磁盘分区目录
http:
    addr: :5000
    
[root@node02 ~]# systemctl start docker-distribution
[root@node02 ~]# ss -antl
State       Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
LISTEN      0      100                          127.0.0.1:25                                               *:*                  
LISTEN      0      128                                  *:22                                               *:*                  
LISTEN      0      100                              [::1]:25                                            [::]:*                  
LISTEN      0      128                               [::]:5000                                          [::]:*                  
LISTEN      0      128                               [::]:22                                            [::]:*

在node01上使用自建的Registry去上传镜像

[root@node01 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://tnj022g0.mirror.aliyuncs.com","https://registry.docker-cn.com"],
    "insecure-registries": ["register.example.com:5000"]
}

[root@node01 ~]# systemctl restart docker
[root@node01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
seancheng1002/b1    v0.2                42a777e26541        2 weeks ago         1.22MB
seancheng1002/b1    v0.1                bb54705dfd51        2 weeks ago         1.22MB
nginx               latest              2073e0bcb60e        2 weeks ago         127MB
centos              latest              470671670cac        5 weeks ago         237MB
busybox             latest              6d5fcfe5ff17        8 weeks ago         1.22MB
[root@node01 ~]# docker tag nginx:latest register.example.com:5000/nginx:latest
[root@node01 ~]# docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
seancheng1002/b1                      v0.2                42a777e26541        2 weeks ago         1.22MB
seancheng1002/b1                      v0.1                bb54705dfd51        2 weeks ago         1.22MB
nginx                                 latest              2073e0bcb60e        2 weeks ago         127MB
register.example.com:5000/nginx   latest              2073e0bcb60e        2 weeks ago         127MB
centos                                latest              470671670cac        5 weeks ago         237MB
busybox                               latest              6d5fcfe5ff17        8 weeks ago         1.22MB
[root@node01 ~]# docker push register.example.com:5000/nginx

使用官方镜像自建Registry

[root@node02 ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
[root@node02 ~]# ss -antl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      100    127.0.0.1:25                  *:*                  
LISTEN      0      128     *:22                  *:*                  
LISTEN      0      100     [::1]:25                   [::]:*                  
LISTEN      0      128      [::]:5000                 [::]:*                  
LISTEN      0      128      [::]:22                   [::]:*

Harbor

无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,通过前面的演示我们可以发现其是非常的简陋的,还不如直接使用官方的Docker Hub去管理镜像来得方便,至少官方的Docker Hub能够通过web界面来管理镜像,还能在web界面执行搜索,还能基于Dockerfile利用Webhooks和Automated Builds实现自动构建镜像的功能,用户不需要在本地执行docker build,而是把所有build上下文的文件作为一个仓库推送到github上,让Docker Hub可以从github上去pull这些文件来完成自动构建。

但无论官方的Docker Hub有多强大,它毕竟是在国外,所以速度是最大的瓶颈,我们很多时候是不可能去考虑使用官方的仓库的,但是上面说的两种自建仓库方式又十分简陋,不便管理,所以后来就出现了一个被 CNCF 组织青睐的项目,其名为Harbor。

Harbor简介

Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。

Harbor的功能

Feathers:

Multi-tenant content signing and validation 多租户内容签名和验证
Security and vulnerability analysis 安全性和脆弱性分析
Audit logging 审计日志记录
Identity integration and role-based access control 身份集成和基于角色的访问控制
Image replication between instances 实例间的镜像复制
Extensible API and graphical UI 可扩展API和图形化界面
Internationalization(currently English and Chinese) 国际化(目前为中英文)
Docker compose
Harbor在物理机上部署是非常难的,而为了简化Harbor的应用,Harbor官方直接把Harbor做成了在容器中运行的应用,而且这个容器在Harbor中依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此VMWare Harbor在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。

Docker Compose官方文档

Harbor部署

主机名IP服务作用
JLJLregistry.example.com192.168.23.180docker
harbor
镜像仓库
JLtest.example.com192.168.23.181docker获取镜像,上传镜像

安装docker

centos8(centos8官方源已下线,建议切换centos-vault源)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

centos6(centos6官方源已下线,建议切换centos-vault源)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo

CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoce/linux/centos/docker-ce.repo

[root@JLregistry ~]# yum -y install docker-ce
[root@JLregistry ~]# systemctl enable --now docker
[root@JLregistry ~]# cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://tnj022g0.mirror.aliyuncs.com"]
}
EOF
[root@JLregistry ~]# systemctl restart docker
[root@JLregistry ~]# systemctl daemon-reload

安装docker compose

[root@JLregistry ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0    982      0 --:--:-- --:--:-- --:--:--   980
100 12.1M  100 12.1M    0     0   102k      0  0:02:01  0:02:01 --:--:-- 91328
[root@JLregistry ~]# chmod +x /usr/local/bin/docker-compose
[root@JLregistry ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
[root@JLregistry ~]# which docker-compose 
/usr/local/bin/docker-compose

安装harbor

[root@JLregistry ~]# cd /usr/src/
[root@JLregistry src]# wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
[root@JLregistry local]# ls
bin  etc  games  harbor  include  lib  lib64  libexec  sbin  share  src
[root@JLregistry local]# cd harbor/
[root@JLregistry harbor]# ls
common.sh             harbor.yml.tmpl  LICENSE
harbor.v2.3.5.tar.gz  install.sh       prepare

生成配置文件

[root@JLregistry harbor]# cp harbor.yml.tmpl harbor.yml
[root@JLregistry harbor]# ls
common.sh             harbor.yml       install.sh  prepare
harbor.v2.3.5.tar.gz  harbor.yml.tmpl  LICENSE

修改配置

[root@JLregistry harbor]# vim harbor.yml
......
hostname: JLregistry.example.com    #设置为Harbor服务器的IP地址或者域名

https:
  port: 443
  certificate: /data/cert/harbor.od.com.crt 
  private_key: /data/cert/harbor.od.com.key
external_url: https://JLregistry.example.com

harbor_admin_password: Harbor12345   #harbor web界面登陆密码

配置域名解析

[root@JLregistry ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.180 JLregistry.example.com

执行安装harbor脚本

[root@JLregistry ~]# cd /usr/local/harbor/
[root@JLregistry harbor]# ./install.sh 
✔ ----Harbor has been installed and started successfully.----

启动harbor

[root@JLregistry harbor]# docker-compose start
Starting log         ... done
Starting registry    ... done
Starting registryctl ... done
Starting postgresql  ... done
Starting portal      ... done
Starting redis       ... done
Starting core        ... done
Starting jobservice  ... done
Starting proxy       ... done

[root@JLregistry harbor]# ss -antl
State   Recv-Q  Send-Q   Local Address:Port    Peer Address:Port  Process  
LISTEN  0       128          127.0.0.1:1514         0.0.0.0:*              
LISTEN  0       128            0.0.0.0:80           0.0.0.0:*              
LISTEN  0       128            0.0.0.0:22           0.0.0.0:*              
LISTEN  0       128               [::]:80              [::]:*              
LISTEN  0       128               [::]:22              [::]:*

编写启动脚本

[root@JLregistry ~]# touch  /start.sh
[root@JLregistry ~]# chmod +x /start.sh 
[root@JLregistry ~]# cat > /start.sh <<EOF
#!/bin/bash

cd /usr/local/harbor/
docker-compose start
EOF
[root@JLregistry ~]# vim /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
/bin/bash -c  /start.sh

[root@JLregistry ~]# chmod +x /etc/rc.local

运行prepare脚本以启用HTTPS
Harbor将nginx实例用作所有服务的反向代理。您可以使用prepare脚本来配置nginx为使用HTTPS

./prepare

如果Harbor正在运行,请停止并删除现有实例
您的图像数据保留在文件系统中,因此不会丢失任何数据

docker-compose down -v

重启docker

docker-compose up -d

JLtest端测试

配置主机解析

[root@JLregistry ~]# vim /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.180  JLregistry.example.com
// 镜像获取地址
[root@JLregistry ~]# cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://in3617d8.mirror.aliyuncs.com"],
  "insecure-registries": ["JLregistry.example.com"]
}
EOF
[root@JLregistry ~]# systemctl restart docker
[root@JLregistry ~]# systemctl daemon-reload

获取官网上的busybox镜像

[root@JLtest ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
3cb635b06aa2: Pull complete 
Digest: sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd0397f25fae164abe1e8a6a
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@JLtest ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
busybox      latest    ffe9d497c324   8 days ago   1.24MB

登录仓库

[root@JLtest ~]# docker login JLregistry.example.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

上传busybox镜像到私有仓库上

[root@JLregistry ~]# docker tag busybox JLregistry.example.com/library/busybox
[root@JLtest ~]# docker images 
REPOSITORY                            TAG       IMAGE ID       CREATED      SIZE
JLregistry.example.com/library/busybox   latest    ffe9d497c324   8 days ago   1.24MB
busybox                               latest    ffe9d497c324   8 days ago   1.24MB
[root@JLtest ~]# docker push JLregistry.example.com/library/busybox
Using default tag: latest
The push refers to repository [JLregistry.example.com/library/busybox]
64cac9eaf0da: Pushed 
latest: digest: sha256:50e44504ea4f19f141118a8a8868e6c5bb9856efa33f2183f5ccea7ac62aacc9 size: 527

登录仓库查看

docker-compose.yml 语法说明

YAML 模板文件语法
默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 p_w_picpath 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。
其它大部分指令都跟 docker run 中的类似。
如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。
p_w_picpath
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。

image
image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

services: 
    web: 
        image: hello-world

build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。 build: /path/to/build/dir 也可以是相对路径,只要上下文确定就可以读取到Dockerfile。 build: ./dir 设定上下文根目录,然后以该目录为准指定Dockerfile。

build:
  context: ../
  dockerfile: path/of/Dockerfile

build都是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。 如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。

context
context选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context

build:
  context: ./dir

container_name
Compose的容器名称格式是:<项目名称><服务名称><序号> 可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:

container_name: app

command
覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

dockerfile
使用dockerfile文件来构建,必须指定构建路径

build:
  context: .
  dockerfile: Dockerfile-alternate

dockerfile指令不能跟image同时使用,否则Compose将不确定根据哪个指令来生成最终的服务镜像。

depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。

version: '2'
services
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

上述YAML文件定义的容器会先启动redis和db两个服务,最后才启动web 服务。

links
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

links:
  - db
  - db:database
  - redis使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:
172.17.2.186 db

相应的环境变量也将被创建。

external_links
链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。

external_links:
  - redis_1
  - project_db_1:mysql
  - project_db_1:postgresql

ports
暴露端口信息。
使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:
  - "3000"
  - "8000:8000"
  - "127.0.0.1:8001:8001"注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数

expose:
  - "3000"
  - "8000"

volumes
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。

volumes:
  - /var/lib/mysql
  - cache/:/tmp/cache
  - ~/configs:/etc/configs/:ro

volumes_from
从另一个服务或容器挂载它的所有卷。

volumes_from:
  - service_name
  - container_name

environment
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

environment:
  - RACK_ENV=development
  - SESSION_SECRET

env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。

env_file: .env
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

# common.env: Set Rails/Rack environment
RACK_ENV=development

extends
基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml。

# common.yml
webapp:
build: ./webapp
environment:
  - DEBUG=false
  - SEND_EMAILS=false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

Docker-compose常用命令

Docker-compose

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

常用选项

-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose  输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

docker-compose up

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

常用选项

-d 在后台运行服务容器
-no-color 不是有颜色来区分不同的服务的控制输出
-no-deps 不启动服务所链接的容器
--force-recreate 强制重新创建容器,不能与-no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器

docker-compose ps

docker-compose  ps  [options] [SERVICE...]    // 列出项目中所有的容器

docker-compose stop

docker-compose stop [options] [SERVICE...]    // 停止正在运行的容器
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)

docker-compose -h

docker-compose -h  // 查看帮助

docker-compose down

docker-compose down [options]   // 停止和删除容器、网络、卷、镜像。

常用选项

–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器

docker-compose logs

docker-compose logs [options] [SERVICE...] // 查看服务容器的输出。

docker-compose bulid

docker-compose build [options] [--build-arg key=val...] [SERVICE...]
// 构建(重新构建)项目中的服务容器。

常用选项

–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

docker-compose pull

docker-compose pull [options] [SERVICE...]  // 拉取服务依赖的镜像。

常用选项

–ignore-pull-failures,忽略拉取镜像过程中的错误
–parallel,多个镜像同时拉取
–quiet,拉取镜像过程中不打印进度信息

docker-compose restart

docker-compose restart [options] [SERVICE...]  // 重启项目中的服务。

常用选项

-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)

docker-compose rm

docker-compose rm [options] [SERVICE...]  // 删除所有(停止状态的)服务容器。

常用选项

–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷

docker-compose start

docker-compose start [SERVICE...] docker-compose start  // 启动已经存在的服务容器。

docker-compose run

docker-compose run [options] [-v  VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...] 在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com在指定容器上执行一个ping命令。

docker-compose scale

docker-compose scale web=3 db=2  // 设置指定服务运行的容器个数。通过service=num的参数来设置数量

docker-compose pause

docker-compose pause [SERVICE...]   // 暂停一个服务容器

docker-compose kill

docker-compose kill [options] [SERVICE...]   // 通过发送SIGKILL信号来强制停止服务容器。

docker-compose config

docker-compose config [options]  验证并查看compose文件配置。

常用选项

–resolve-image-digests 将镜像标签标记为摘要
-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个

docker-compose create

docker-compose create [options] [SERVICE...] // 为服务创建容器

常用选项

–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
–no-build:不创建镜像,即使缺失
–build:创建容器前  ,生成镜像

docker-compose exec

docker-compose exec [options] SERVICE COMMAND [ARGS...]  // 进入到容器

常用选项

-d 分离模式,后台运行命令。
–privileged 获取特权。
–user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器

docker-compose port

docker-compose port [options] SERVICE PRIVATE_PORT // 显示某个容器端口所映射的公共端口。

常用选项

–protocol=proto,指定端口协议,TCP(默认值)或者UDP
–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)

docker-compose push

docker-compose push [options] [SERVICE...] // 推送服务依的镜像

常用选项

–ignore-push-failures 忽略推送镜像过程中的错误

docker-compose stop

docker-compose stop [options] [SERVICE...]  // 停止运行的容器

docker-compose uppause

docker-compose unpause [SERVICE...]  // 恢复处于暂停状态中的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉只只

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值