Docker 入门


什么是容器:

容器技术已经成为应用程序封装和交付的核心技术

容器技术的核心有以下几个内核技术组成:

    — CGroups( Control Groups ) - 资源管理

    — NameSpace - 进程隔离

    — SELinux 安全

由于是物理机上实施隔离,启动一个容器,可以想启动一个进程一样快速


什么是Docker:

Docker是完整的一套容器管理系统

Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术


Docker优点:

相比与传统的虚拟化技术,容器更加简洁高效

传统虚拟机器要给每个VM安装操作系统

容器使用的共享公共库和程序

Docker 入门_第1张图片


Docker 入门_第2张图片


Docker 入门_第3张图片



Docker的缺点

容器的隔离性没有虚拟化强

共用Linux内核,安全性有先天缺陷

SELinux难以驾驭

监控容器和容器排错是挑战



部署Docker


Ubuntu 系列安装 Docker

Docker支持版本

    UbuntuXenial16.04(LTS)

    UbuntuWily15.10

    UbuntuTrusty14.04(LTS)

    UbuntuPrecise12.04(LTS)

Docker目前只能安装在64位平台上,并且要求内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能的不稳定。

用户可以通过如下命令检查自己的内存版本信息

    $ uname -a

    $ cat /proc/version

更新APT镜像源

首先需要安装 apt-transport-https 包支持 https 协议的源

    $ sudo apt-getinstall apt-transport-https ca-certificates

添加源的 gpg 密钥

    $sudo apt-keyadv--keyserver hkp://p80.pool.sks-keyservers.net

获取当前操作系统的代号

    $ lsb_release -c

    Codename:trusty

添加 Docker 的官方 apt 软件源了。

    $ sudo cat < /etc/apt/sources.list.d/docker.list

    debhttps://apt.dockerproject.org/repoubuntu-trustymain

    EOF

添加成功后,更新apt软件包缓存。

    $ sudo apt-get update

分版本的预安装任务

    高于 12.04 LTS的版本

    $ sudo apt-get install-y linux-image-extra-$(uname -r)

    $ sudo apt-get install apparmor

    12.04 LTS版本

   $sudo apt-get install linux-image-generic-lts-trusty

    安装Docker

    $sudo apt-getinstall -ydocker-engine    


CentOS 系列安装Docker

要添加yum 软件源

    $sudo cat > /etc/yum.repos.d/docker.repo<<-'EOF'

        [dockerrepo]

        name=DockerRepository

        baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/

        enabled=1

        gpgcheck=0

        EOF

使用yum 安装docker-engine

    $ sudo yum install -y install docker-engine


Debian操作系统安装Docker

支持版本

    Debiantestingstretch(64-bit)

    Debian8.0Jessie(64-bit)

    Debian7.7Wheezy(64-bit)

更新APT仓库

1. 清理旧的仓库信息

    $apt-getpurgelxc-docker*

    $apt-getpurgedocker.io*

2. 更新和安装软件包

    $apt-getupdate

    $apt-getinstallapt-transport-httpsca-certificates

3. 添加 GPG 键

    $ apt-keyadv--keyserverhkp://p80.pool.sks-keyservers.net:80 --recv-keys58118E89F3A912897C070ADBF76221572C52609D

4. 添加 APT 源 以Debian Jessie 为例

    $sudo cat<> /etc/apt/sources.list.d/docker.list

    deb https://apt.dockerproject.org/repodebian-jessie main

    EOF

    其他两个版本

    deb https://apt.dockerproject.org/repo debian-wheezy main

    deb https://apt.dockerproject.org/repo debian-stretch main

安装Docker

    $sudo apt-get install docker-engine

为非 root 用户授权

    #如果没有就建立一个 Docker 组

    $sudo groupadd docker

    #增加一个用户(用真实的名字替换下面的 ${USER})到 Docker 组,需重登陆来生效

    $sudo gpasswd -a ${USER}docker

    #重启 Docker 服务

    $sudo service docker restart

    更新 Docker

    $apt-get upgrade docker-engine

卸载 Docker

    #卸载软件包

    $sudo apt-get purge docker-engine

    #卸载依赖包

    $sudo apt-get autoremove --purge docker-engine

    #如有必要,执行以下命令,删除全部镜像、容器、数据卷和其他docker相关用户信息

    :

    $rm -rf /var/lib/docker




下面使用 CentOS 7 系统介绍Docker:

    把软件 docker-engine docker-engine-selinux 拷贝到私有yum仓库中

    运行 createrepo .

        # yum -y install -y docker-engine docker-engine-selinux

    启动docker时 最好要将iptables 的规则清空  iptable有的规则可能会影响Docker

    # brctl show
    bridge name	bridge id		STP enabled	interfaces
    # iptables-save 
    //设置开机启动,启动 docker 服务
    # systemctl  enable  docker
    # systemctl  start   docker
    # brctl show
    bridge name	bridge id		STP enabled	interfaces
    docker0		8000.02424ba34d68	no		
    # iptables-save 
    # Generated by iptables-save v1.4.21 on Sun Jan 21 22:48:11 2018
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [2:262]
    :POSTROUTING ACCEPT [2:262]
    :DOCKER - [0:0]
    -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
    -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    -A DOCKER -i docker0 -j RETURN
    COMMIT
    # Completed on Sun Jan 21 22:48:11 2018
    # Generated by iptables-save v1.4.21 on Sun Jan 21 22:48:11 2018
    *filter
    :INPUT ACCEPT [27:3069]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [20:3101]
    :DOCKER - [0:0]
    :DOCKER-ISOLATION - [0:0]
    -A FORWARD -j DOCKER-ISOLATION
    -A FORWARD -o docker0 -j DOCKER
    -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
    -A FORWARD -i docker0 -o docker0 -j ACCEPT
    -A DOCKER-ISOLATION -j RETURN
    COMMIT
    # Completed on Sun Jan 21 22:48:11 2018
    
    # docker version
    Client:
     Version:      1.12.1
     API version:  1.24
     Go version:   go1.6.3
     Git commit:   23cf638
     Built:        
     OS/Arch:      linux/amd64
    
    Server:
     Version:      1.12.1
     API version:  1.24
     Go version:   go1.6.3
     Git commit:   23cf638
     Built:        
     OS/Arch:      linux/amd64


Docker 镜像:

Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库下载( 默认是Docker Hub 公共注册服务器中的仓库 )

        查看系统镜像

        docker images 

        从官方源搜索镜像 (前提 物理机可以连通外网)

        docker search 镜像名

        下载镜像

        docker pull 镜像名

        上传镜像

        docker push 镜像名

        删除本地镜像

        docker rmi 镜像名

        把本机镜像备份为 tar 包

        docker save 镜像名 > 镜像名.tar

        把备份的 tar 包导入到本地镜像

        docker load < 镜像名.tar 

        查看镜像制作历史

        docker history

        查看镜像底层信息

        docker inspect

        修改镜像名称和标签

        docker tag

这里用 busybox 练习
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# docker search busybox
# docker pull busybox 
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              f9b6f7f7b9d3        6 days ago          1.143 MB
在列出的信息中 可以看到几个字段信息
    来自于哪个仓库,比如 busybox
    镜像标记,比如 latest
    它的 ID 号 唯一
    创建时间
    镜像大小
# docker save busybox > busybox.tar
# ls busybox.tar 
busybox.tar
# docker rmi busybox
# docker load < busybox.tar
779f37a09c89: Loading layer 1.355 MB/1.355 MB
Loaded image: busybox:latest
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              f9b6f7f7b9d3        6 days ago          1.143 MB
# docker history busybox
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f9b6f7f7b9d3        6 days ago          /bin/sh -c #(nop)  CMD ["sh"]                   0 B                 
           6 days ago          /bin/sh -c #(nop) ADD file:3e663b99b5cb560010   1.143 MB

镜像的实现原理

Docker 使用Union FS 将这些不同的层结合到一个镜像中去。

通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,LiveCD正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS上构建的容器也是利用了类似的原理。


Docker 容器:

容器是独立运行的一个或一组应用,以及它们的运行态环境。

对应的虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

容器常用命令列表

    – docker run //运行容器

    – docker ps //查看容器列表

    – docker stop //关闭容器

    – docker start //启动容器

    – docker restart //重启容器

    – docker attach|exec //进入容器

    – docker inspect //查看容器底层信息

    – docker top //查看容器进程列表

    – docker rm //删除容器

    

启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动.

新建并启动  

命令主要为docker run 

例如 下面命令输出一个'Hello world' 之后终止容器
    # docker run centos /bin/echo 'Hello world'
    Hello world
    下面的命令则启动一个 bash 终端,允许用户进行交互。
    # docker run -it  centos /bin/bash
    [root@b45c34328e05 /]#echo Hello world
    Hello world
   [root@b45c34328e05 /]# ls
    anaconda-post.log  dev  home  lib64       media  opt   root  sbin  sys  usr
    bin                etc  lib   lost+found  mnt    proc  run   srv   tmp  var
    [root@b45c34328e05 /]# exit
    exit
    -t 选项 让Docker分配一个伪终端 并绑定到容器的标准输入上
    -i 选项 则让容器的标准输入保持打开


启动已终止容器

可以利用 docker start 命令 直接将一个已经终止的容器启动运行

使用 docker ps 命令查看容器信息 
终止状态的容器可以用 docker ps -a 看到
# docker ps  -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
b45c34328e05        centos              "/bin/bash"         47 seconds ago      Exited (0) 40 seconds ago                       sharp_carson
# docker start b45c34328e05
b45c34328e05
# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
b45c34328e05        centos              "/bin/bash"         About a minute ago   Up 5 seconds                            sharp_carson


后台运行

需要让Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下 

可以docker run 添加 -d 参数来实现 启动后会返回唯一的 id 

# docker run -d centos /bin/sh -c "while true;do echo hello world; sleep 1;done"
3a5f25a937544c37c10c37443c848d0c818859995cf74232c16d04f25c5ec932   
# docker logs 3a5f    //可以通过简写id  使用docker logs 命令获取容器的输出信息
hello world
hello world
hello world
hello world
# docker ps            //查看容器信息
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
3a5f25a93754        centos              "/bin/sh -c 'while tr"   About a minute ago   Up About a minute                       happy_goldstine


终止容器

可以使用 docker stop 来终止一个运行中的容器

当Docker 容器中指定的应用终结时,容器也自动终止,用户通过exit 命令 或者 Ctrl + d 来退出终端时,所创建的容器立刻终止。

# docker stop 3a5f
3a5f
# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b45c34328e05        centos              "/bin/bash"         45 minutes ago      Up 44 minutes                           sharp_carson
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
3a5f25a93754        centos              "/bin/sh -c 'while tr"   15 minutes ago      Exited (137) 42 seconds ago                       happy_goldstine
# docker restart 3a5f
3a5f
# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3a5f25a93754        centos              "/bin/sh -c 'while tr"   16 minutes ago      Up 4 seconds                            happy_goldstine

此外,docker restart 命令会将一个运行态的容器终止,然后再重新启动它


进入容器

在使用 -d 参数时,容器启动会进入后台。某些时候需要进入容器进行操作

attach 命令 

# docker run -idt centos
7cc5abd320d6e67cc8df2388e840bb168715afd3331364514be91e42be0d7304
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7cc5abd320d6        centos              "/bin/bash"         7 seconds ago       Up 4 seconds                            high_lamarr
# docker attach 7cc
[root@7cc5abd320d6 /]# 
[root@7cc5abd320d6 /]# exit
exit
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
7cc5abd320d6        centos              "/bin/bash"         3 minutes ago       Exited (0) 13 seconds ago                       high_lamarr

但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执操作了。exit 会导致容器关闭

exec 命令

进入容器,退出时不会关闭容器

# docker run -idt centos
f433775528d9616212145b73cc10a04b5b8c0f383c9cd002fe1f6dc984462313
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f433775528d9        centos              "/bin/bash"         7 seconds ago       Up 5 seconds                            berserk_bassi
# docker exec -it f4 /bin/bash
[root@f433775528d9 /]# 
[root@f433775528d9 /]# exit
exit
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f433775528d9        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            berserk_bassi

-i ,-t , -d 参数
-i 选项 则让容器的标准输入保持打开
-t 选项 让Docker分配一个伪终端 并绑定到容器的标准输入上
-d 选项 在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。
# docker exec -i f4 /bin/bash
date
Tue Jan 23 12:15:21 UTC 2018
echo $?
0
exit
# docker exec -t f4 /bin/bash
[root@f433775528d9 /]# date


^C
# docker exec -it f4 /bin/bash
[root@f433775528d9 /]# date
Tue Jan 23 12:18:21 UTC 2018
[root@f433775528d9 /]# exit
exit


删除容器

可以使用 docker rm 来删除一个处于终止状态的容器

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
f433775528d9        centos              "/bin/bash"         29 minutes ago      Up 29 minutes                                   berserk_bassi
7cc5abd320d6        centos              "/bin/bash"         34 minutes ago      Exited (0) 32 minutes ago                       high_lamarr
# docker rm 7cc
7cc
# docker rm f43
Error response from daemon: You cannot remove a running container f433775528d9616212145b73cc10a04b5b8c0f383c9cd002fe1f6dc984462313. Stop the container before attempting removal or use -f
# docker rm -f f43
f43

如果要删除一个运行中的容器,可以添加 -f 参数


清理所有处于终止状态的容器

如果数量太多要一个个删除可能会很麻烦,用 docker rm $( docker ps -aq ) 可以全部处理掉



自定义镜像

docker commit 

• 使用镜像启动容器,在该容器基础上修改

• 另存为另一个镜像


案例 1 

基于centos镜像使用commit创建新的镜像文件 

配置yum源 安装基础工具

# docker run -it centos
[root@7ffa443a9898 /]# rm -rf /etc/yum.repos.d/C*
[root@7ffa443a9898 /]# cat > /etc/yum.repos.d/yum.repo < [yum]
> name=yum 
> baseurl=http://192.168.4.254/rhel7
> gpgcheck=0
> EOF
[root@7ffa443a9898 /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id                                repo name                          status
yum                                    yum                                4620
repolist: 4620

[root@7ffa443a9898 /]# yum provides ifconfig
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
yum/filelists_db                                         | 3.2 MB     00:00     
net-tools-2.0-0.17.20131004git.el7.x86_64 : Basic networking tools
Repo        : yum
Matched from:
Filename    : /sbin/ifconfig
[root@7ffa443a9898 /]# yum -y install net-tools-2.0-0.17.20131004git.el7.x86_64
[root@7ffa443a9898 /]# yum provides vim     
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
2:vim-enhanced-7.4.160-1.el7.x86_64 : A version of the VIM editor which includes
                                    : recent enhancements
Repo        : yum
Matched from:
Provides    : vim = 7.4.160-1.el7

[root@7ffa443a9898 /]# yum -y install vim
[root@7ffa443a9898 /]# exit
exit
# docker ps -qa 
7ffa443a9898
# docker commit 7ffa443a9898 myos:latest        //自定义镜像文件
sha256:d2b307795b544d9ee7529dea3ebdcd5028036ed05ceefbcd02c901ef56ad3318
# docker images | grep myos
myos                 latest              d2b307795b54        50 seconds ago      386 MB
# docker run -it myos                    // 运行 自定义镜像文件
[root@54649cf632cc /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id                                repo name                          status
yum                                    yum                                4620
repolist: 4620


使用 Dockerfile 自定义镜像

• Dockerfile语法格式

– FROM:基础镜像

– MAINTAINER:镜像创建者信息

– EXPOSE:开放的端口

– ENV:设置变量

– ADD:复制文件到镜像

– RUN:制作镜像时执行的命令,可以有多个

– WORKDIR:定义容器默认工作目录

– CMD:容器启动时执行的命令,仅可以有一条CMD


案例2 

基于centos镜像使用Dockerfile文件创建新的镜像文件

# mkdir test
# cd test/
# cp /etc/yum.repos.d/yum.repo yum.repo
# vim Dockerfile 
    FROM centos
    RUN rm -rf /etc/yum.repos.d/*
    ADD yum.repo  /etc/yum.repos.d/yum.repo
    RUN yum -y install net-tools psmisc vim iproute
    CMD [ "/bin/bash" ]

# docker build -t myos:test .
# docker run -itd myos:test
4535d05df622a60d14ee995cf2a7a53d75dd480a96c2f921cde027d6f1797f55
# docker exec -it 4535 /bin/bash
[root@4535d05df622 /]# yum repolist 
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
repo id                                                   repo name                                                 status
docker                                                    docker                                                       2
yum                                                       yum                                                       4620
repolist: 4622


案例3

基于刚刚建立myos:test 镜像 创建 部署Apache 服务 镜像

# mkdir httpd
# cd httpd/
# vim Dockerfile
    FROM myos:test
    RUN yum -y install httpd
    ADD index.html  /var/www/html/index.html
    ENV EnvironmentFile=/etc/sysconfig/httpd
    CMD [ "/usr/sbin/httpd","-DFOREGROUND" ]
# docker build -t myos:httpd .
# docker run -d -p 80:80 myos:httpd
# curl  http://192.168.4.1
hello world


案例4 

基于刚刚建立myos:test 镜像 创建 部署sshd 服务 镜像

# mkdir ssh
# cd ssh/
# vim Dockerfile
    FROM myos:test
    RUN yum -y install openssh-server 
    ENV EnvironmentFile=/etc/sysconfig/sshd
    RUN /usr/sbin/sshd-keygen &> /dev/null
    RUN echo '123' | passwd --stdin root
    EXPOSE 22
    CMD [ "/usr/sbin/sshd","-D" ]
# docker build -t myos:sshd .
# docker run -d -p 222:22 myos:sshd
# ssh -X  -p 222 [email protected]
    The authenticity of host '[192.168.4.1]:222 ([192.168.4.1]:222)' can't be established.
    ECDSA key fingerprint is 7d:c1:ca:40:0d:1d:c4:78:9c:0a:e1:1b:5d:b9:30:60.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[192.168.4.1]:222' (ECDSA) to the list of known hosts.
    [email protected]'s password: 
    X11 forwarding request failed on channel 0
[root@015c6cab3064 ~]#


案例5 

基于刚刚建立myos:test 镜像 创建 部署 同时使用 ssh  和 apache 服务镜像# mkdir httpdandssh

# cd httpdandssh/
# vim start.sh
#!/bin/bash
    EnvironmentFile=/etc/sysconfig/sshd
    /usr/sbin/sshd -D &
    EnvironmentFile=/etc/sysconfig/httpd
    /usr/sbin/httpd -DFOREGROUND &
    wait
# vim Dockerfile
    FROM myos:test
    RUN yum -y install openssh-server httpd
    ADD index.html  /var/www/html/index.html
    RUN /usr/sbin/sshd-keygen &> /dev/null
    RUN echo '123' | passwd --stdin root
    ADD start.sh /etc/init.d/start.sh
    RUN chmod 755 /etc/init.d/start.sh
    EXPOSE 22 80
    CMD [ "/etc/init.d/start.sh" ]
# cp ../httpd/index.html index.html
# docker build -t httpd:sshd .
# docker run -d -p 222:22 -p 80:80 httpd:sshd

# curl http://192.168.4.1
    hello world
# ssh -X -p 222 [email protected]
    The authenticity of host '[192.168.4.1]:222 ([192.168.4.1]:222)' can't be established.
    ECDSA key fingerprint is 29:cf:ac:95:4d:d7:2b:36:10:d1:e9:c6:31:7e:72:c7.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[192.168.4.1]:222' (ECDSA) to the list of known hosts.
    [email protected]'s password: 
    X11 forwarding request failed on channel 0
[root@f072715497ba ~]# exit
logout
Connection to 192.168.4.1 closed.


Docker 仓库

仓库(Repository)是集中存放镜像的地方。

注册服务器 registry 基础概念

共享镜像的一台服务器(镜像化的一台服务器)

Docker 入门_第4张图片


Docker Hub


目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000的镜像。大部分需求,都可以通过在Docker Hub 中直接下载镜像来实现。

    登录

可以通过执行docker login 命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。

    基本操作

用户无需登录即可通过docker search 命令来查找官方仓库中的镜像,并利用dockerpull 命令来将它下载到本地。


私有仓库



有时候使用Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。

# vim /etc/docker/daemon.json
# cat /etc/docker/daemon.json
{
    "insecure-registries" : ["192.168.4.1:5000"]
}

# systemctl restart docker
在安装了Docker 后,可以通过获取官方 registry 镜像来运行
# docker run -id -p 5000:5000 registry
创建好私有仓库之后,就可以使用docker tag 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。
例如私有仓库地址为192.168.4.1:5000
# docker tag busybox:latest 192.168.4.1:5000/busybox
# docker tag myos:test 192.168.4.1:5000/myos_test
# docker tag httpd:sshd 192.168.4.1:5000/httpd_sshd
使用docker push	上传标记的镜像
# docker push 192.168.4.1:5000/busybox
The push refers to a repository [192.168.4.1:5000/busybox]
779f37a09c89: Pushed 
latest: digest: sha256:4efd5033df5ddf3cff692505ae2a8e6d492014dbadd2f7281ccda9f744d41901 size: 527
# docker push 192.168.4.1:5000/myos_test
The push refers to a repository [192.168.4.1:5000/myos_test]
8202e413fce3: Pushed 
0d281e60bd3c: Pushed 
b41d6696cce4: Pushed 
0aeb287b1ba9: Pushed 
latest: digest: sha256:860417d703ab3dce337a7f69ccaa417b67842729114d9f34f3760525e4e8a604 size: 1155
# docker push 192.168.4.1:5000/httpd_sshd
The push refers to a repository [192.168.4.1:5000/httpd_sshd]
67de9bddfeb9: Pushed 
7ed802e5e1cf: Pushed 
7fa005843c99: Pushed 
c68f5228f676: Pushed 
0b433cb3a604: Pushed 
1e0fef9107ab: Pushed 
8202e413fce3: Mounted from myos_test 
0d281e60bd3c: Mounted from myos_test 
b41d6696cce4: Mounted from myos_test 
0aeb287b1ba9: Mounted from myos_test 
latest: digest: sha256:5ac74ff037126e46123abe22ce81b56879e9b916e191809303b9efedacf6d85d size: 2403
用 curl 查看仓库中的镜像。
# curl -XGET "http://192.168.4.1:5000/v2/_catalog"
{"repositories":["busybox","httpd_sshd","myos_test"]}
# curl -XGET "http://192.168.4.1:5000/v2/busybox/tags/list"
{"name":"busybox","tags":["latest"]}
# curl -XGET "http://192.168.4.1:5000/v2/httpd_sshd/tags/list"
{"name":"httpd_sshd","tags":["latest"]}
使用启动仓库中的镜像
# docker run -it 192.168.4.1:5000/busybox
/ # 
/ # 
/ #