docker --- (入门必读)

容器

容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。

docker简介

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  • Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
  • Docker 使用客户端-服务器 (C/S) 架构模式:
    Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
  • LXC (Linux Container)容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
  • docker底层语言为go语言

相关网站

Docker官网:https://www.docker.com/
Docker hub :https://hub.docker.com/

docker 与传统虚拟化方式优缺点比较---优点

特性 Docker 传统虚拟化技术(KVM)
启动速度 非常快(秒级) 慢(分钟级)
磁盘使用(模板文件) 小(MB) 大(GB)
性能 一般于宿主机 比宿主机弱
单机系统支持量 大(千计) 小(十计)
管理及应用 更轻松的迁移和扩展

docker 与传统虚拟化方式优缺点比较---局限

  1. Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
  2. LXC(Linux Container)是基于cgroup等linux kernel功能的,因此container的guest系统(Guest是指让给客人访问电脑系统的帐户)只能是linux base的
  3. 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
  4. 网络管理相对简单,主要是基于namespace隔离
  5. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
  6. Docker对disk的管理比较有限
  7. container随着用户进程的停止而销毁,container中的log等用户数据不便收集
  8. Docker 隔离性没有传统虚拟化好,KVM等属于完全隔离

摘自:https://baike.baidu.com/item/Docker/13344470?fr=aladdin#1_4


Docker三核心

Docker Image(镜像)

  1. 文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
  2. Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接实现。

Docker Container(容器)

  1. 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。

Docker Hub/Registry(仓库)

  1. 仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
  2. 仓库分为public registry和private registry
  3. 目前,最大的公开仓库是 Docker Hub(docker公司运营),存放了数量庞大的镜像供用户下载。
  4. Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来即可。

Docker 的底层实现

cgroup

  • cgroup (Control Group)Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。

在 /sys/fs/cgroup/memory/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:

╭─root@du-z ~  
╰─➤  ls /sys/fs/cgroup/memory/docker/196ddbdaa07a5ebdc33cd78a6a575a13cc9319bfe46ed537872b9b960ea4e86b 
cgroup.clone_children               memory.memsw.failcnt
cgroup.event_control                memory.memsw.limit_in_bytes
cgroup.procs                        memory.memsw.max_usage_in_bytes
memory.failcnt                      memory.memsw.usage_in_bytes
memory.force_empty                  memory.move_charge_at_immigrate
memory.kmem.failcnt                 memory.numa_stat
memory.kmem.limit_in_bytes          memory.oom_control
memory.kmem.max_usage_in_bytes      memory.pressure_level
memory.kmem.slabinfo                memory.soft_limit_in_bytes
memory.kmem.tcp.failcnt             memory.stat
memory.kmem.tcp.limit_in_bytes      memory.swappiness
memory.kmem.tcp.max_usage_in_bytes  memory.usage_in_bytes
memory.kmem.tcp.usage_in_bytes      memory.use_hierarchy
memory.kmem.usage_in_bytes          notify_on_release
memory.limit_in_bytes               tasks
memory.max_usage_in_bytes

namespace

  • linux 内核从Linux 2.4.19 版本开始引入namespace的概念。其目的是作系统资源隔离,通过特定的方法使得namespace中的进程看起来拥有自己的全局系统资源(global system resource)。

linux内核中共实现的六种隔离:

  1. mount namespaces :Linux 2.4.19版本内核引入;主要用于隔离文件系统挂载点;使每个容器看上去都有整个文件系统
  2. UTS namespaces : LInux 2.6.19版本内核引入;主要用于隔离nodename和domainname两个系统标识;使每个容器都有自己的hostname和domainname
  3. IPC namespaces :Linux 2.6.19版本内核引入;主要用于隔离信号量,消息队列,共享内存;使只有在同一个IPC namespace 的进程之间才能互相通信; IPC(Inter-Process Communication,进程间通信)
  4. PID namespaces :Linux2.6.24版本内核引入;主要用于隔离进程ID;使每个PID namespace 中的进程可以有其独立的PID,每个容器可以有PID为1的root进程;同一进程在不同PID namespace中有不同的PID;容器中每个进程都有两PID 容器中的PID和宿主机中的PID
  5. Network namespaces:Linux2.6.29版本内核引入;主要用于隔离系统网络资源;使每个容器都有其独立的网络设备,IP地址,端口号,IP路由表等
  6. User namespaces :Linux3.8版本内核引入;主要用于隔离用户和用户组ID;使每一个进程的User ID 和Group ID 在User namespace 内外可以是不同的;使得每一个进程在User namespace里面有root权限,但是在User namespace外面却没有root的权限

Docker 部署安装

docker-ce 社区免费版
docker-ee 企业收费版

第一步:注册阿里云账号并在阿里云“容器镜像服务”中获得加速
第二步:下载阿里云网站新版docker-ce

具体操作:

# vim docker-sbeed.sh
...
#!/bin/bash
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo /etc/yum.repos.d
yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
...

# bash docker-sbeed.sh

Docker简单操作

image相关操作

╭─root@localhost.localdomain ~  
╰─➤  docker image help           

Usage:	docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile         
                 #从dockerfile中创建镜像
  history     Show the history of an image         
                   #可以显示镜像的构建历史 ;docker镜像分层构建,每一层都有一个指令
  import      Import the contents from a tarball to create a filesystem image   
                  #从一个压缩包创建镜像
  inspect     Display detailed information on one or more images     
                  #显示一个或多个image的详细信息
  load        Load an image from a tar archive or STDIN   
                  #从tar包或STDIN加载image
  ls          List images     
                 #列出images
  prune       Remove unused images      
                  #删除未使用的images
  pull        Pull an image or a repository from a registry   
                   #从registry(仓库)中拉取镜像 
  push        Push an image or a repository to a registry   
                 #推送镜像到registry(仓库)中
  rm          Remove one or more images     
                 #删除一个或多个镜像
  save        Save one or more images to a tar archive (streamed to STDOUT by default)    
                 #创建镜像压缩包
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE   
                #改名image(原名文件保留)

实例1:拉取image(pull)

╭─root@localhost.localdomain ~  
╰─➤  docker image pull busybox

#  docker image pull --help

Usage:	docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

##注意:如果在拉取镜像的时候只指定了REPOSITORY的话,默认拉取的是tag为latest的版本

实例2:查看当前有哪些镜像 (ls)

╭─root@localhost.localdomain ~  
╰─➤  docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              db8ee88ad75f        3 weeks ago         1.22MB

实例3: 查看镜像构建历史 (history)

╭─root@localhost.localdomain ~  
╰─➤  docker image history busybox:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
db8ee88ad75f        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:9ceca008111a4ddff…   1.22MB 

实例4:制作镜像压缩包 (save)

方法一:使用-o选项,output

╭─root@localhost.localdomain ~  
╰─➤  docker image save busybox -o busybox-latest.tar
╭─root@localhost.localdomain ~  
╰─➤  ls
anaconda-ks.cfg  busybox-latest.tar  docker-sbeed.sh

方法二:使用标准输出

╭─root@localhost.localdomain ~  
╰─➤  docker image save busybox > busybox-v1.tar 
╭─root@localhost.localdomain ~  
╰─➤  ls
anaconda-ks.cfg  busybox-latest.tar  busybox-v1.tar  docker-sbeed.sh

实例5:使用镜像压缩包 (load)

方法一:使用-i选项 input

╭─root@localhost.localdomain ~  
╰─➤  docker image load -i busybox-latest.tar 
Loaded image: busybox:latest
╭─root@localhost.localdomain ~  
╰─➤  docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              db8ee88ad75f        3 weeks ago         1.22MB

方法二:实用标准输入

docker image load <  busybox-latest.tar

实例6:删除镜像 (rm)

 docker image rm busybox:latest  

实例7:镜像改名 (tag)

╭─root@localhost.localdomain ~  
╰─➤  docker image tag busybox:latest busybox:v1
╭─root@localhost.localdomain ~  
╰─➤  docker image ls                           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              db8ee88ad75f        3 weeks ago         1.22MB
busybox             v1                  db8ee88ad75f        3 weeks ago         1.22MB

例子8:清除不经常使用的镜像 (prune)

╭─root@localhost.localdomain ~  
╰─➤  docker image prune -f
Total reclaimed space: 0B


Container(容器)操作

╭─root@localhost.localdomain ~  
╰─➤  docker container --help

Usage:	docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a running container
                     #将本地标准输入、输出和错误输出追加到正在运行的容器中
  commit      Create a new image from a container's changes
                     #从容器的更改中创建一个新image
  cp          Copy files/folders between a container and the local filesystem
                   #在容器和本地文件系统之间复制文件/文件夹
  create      Create a new container
                    #创建一个新容器
  diff        Inspect changes to files or directories on a container's filesystem
                  #检查容器文件系统上文件或目录的更改
  exec        Run a command in a running container
                   #在正在运行的容器中运行命令(进入容器)
  export      Export a container's filesystem as a tar archive
                     #将容器的文件系统导出为tar包
  inspect     Display detailed information on one or more containers
                    #在一个或多个容器上显示详细信息
  kill        Kill one or more running containers
                     #杀死一个或多个正在运行的容器
  logs        Fetch the logs of a container
                   #获取容器的日志
  ls          List containers
                    #列出容器(containers)
  pause       Pause all processes within one or more containers
                   #暂停一个或多个容器中的所有进程
  port        List port mappings or a specific mapping for the container
                      #列出容器的端口映射或特定映射
  prune       Remove all stopped containers
                     #移除所有停止的容器
  rename      Rename a container
                      #给容器改名
  restart     Restart one or more containers
                   #重启一个或多个容器
  rm          Remove one or more containers
                  #删除一个或多个容器
  run         Run a command in a new container
                 #在新容器中运行命令
  start       Start one or more stopped containers
                  #启动一个或多个停止的容器(stopped)
  stats       Display a live stream of container(s) resource usage statistics
                   #实时显示容器资源使用统计数据
  stop        Stop one or more running containers
                   #停止一个或多个正在运行的容器
  top         Display the running processes of a container
                    #显示容器的运行进程
  unpause     Unpause all processes within one or more containers
                      #继续运行paused状态的容器
  update      Update configuration of one or more containers
                     #更新一个或多个容器的配置
  wait        Block until one or more containers stop, then print their exit codes
                  #阻塞,直到一个或多个容器停止,然后打印它们的退出代码
  ps        #查看正在运行的容器

指定某容器的两种方法:CONTAINER-ID ,CONTAINER-NAME

实例1:运行容器 (run)

-i 交互模式
-t分配终端

╭─root@localhost.localdomain ~  
╰─➤  docker container run -it busybox /bin/sh            

/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # exit
-d 后台运行

╭─root@localhost.localdomain ~  
╰─➤  docker  container run  -d nginx-game:v1 
--name 指定容器名字
-d 后台运行
--rm 容器停掉之后自动删除

╭─root@localhost.localdomain ~  
╰─➤  docker container run --name nginx -d --rm nginx:latest      

实例2:查看正在运行的容器 (ps)

╭─root@localhost.localdomain ~  
╰─➤  docker container ps 

查看所有容器

╭─root@localhost.localdomain ~  
╰─➤  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b967cc0a7a67        busybox             "sh"                9 hours ago         Exited (0) 9 hours ago                         zealous_shaw
ee42b5eff0cd        busybox             "sh"                9 hours ago         Exited (0) 9 hours ago                         intelligent_cerf
db206796c1a0        busybox             "/bin/sh"           9 hours ago         Exited (127) 9 hours ago                       admiring_northcutt

实例3:删除容器 (rm)

╭─root@localhost.localdomain ~  
╰─➤  docker container rm b967cc0a7a67
b967cc0a7a67

批量删除容器

╭─root@localhost.localdomain ~  
╰─➤  docker container rm $(docker ps -aq)
ee42b5eff0cd
db206796c1a0
Error response from daemon: You cannot remove a running container bb47bdca3639aaee6ed332a62fa00c7c0d768fa6a1f6a1d1e1864cab2770b622. Stop the container before attempting removal or force remove

# 不会删除正在运行的container
# rm 不能直接删除dead状态的container

强制删除

docker container rm -f  b967cc0a7a67

实例4:查看容器信息 (inspect)

╭─root@localhost.localdomain ~  
╰─➤  docker inspect db206796c1a0

...#详细信息

实例5:查看容器暴露的端口

方法1: (ps) (注意: 容器需在up运行状态)

╭─root@du-z ~  
╰─➤  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
69fdffa4d862        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       0.0.0.0:32768->80/tcp   frosty_swartz

方法2:(history)

╭─root@localhost.localdomain ~  
╰─➤  docker image history e445ab08b2b |grep EXPOSE
<missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 80                    0B  

方法3: (inspect)

╭─root@localhost.localdomain ~  
╰─➤  docker container inspect bb47bdca3639 |grep Ports -A3      
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
--
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
--
            "Ports": {
                "80/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/ea04a98cd4ee",

实例6:查看容器运行状态 (stats)

╭─root@localhost.localdomain ~  
╰─➤  docker container stats bb47bdca3639


CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
bb47bdca3639        nginx               0.00%               1.387MiB / 976.5MiB   0.14%               648B / 0B           5.04MB / 0B         2

实例7:对容器内存使用量进行限制 (run -m)

╭─root@du-z ~  
╰─➤  docker run -d --name nginx --rm -m 64M nginx

╭─root@du-z ~  
╰─➤  docker stats nginx

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
fdec1b43873d        nginx               0.00%               1.383MiB / 64MiB    2.16%               648B / 0B           0B / 0B             2

实例8:容器改名 (rename)

╭─root@du-z ~  
╰─➤  docker rename nginx nginx1    
╭─root@du-z ~  
╰─➤  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
fdec1b43873d        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        80/tcp              nginx1

实例9:停掉容器 (stop)

╭─root@du-z ~  
╰─➤  docker stop 2ed61f50ef50
2ed61f50ef50

实例10:杀掉容器 (kill)

╭─root@du-z ~  
╰─➤  docker kill 2ed61f50ef50
2ed61f50ef50

kill与stop的区别:

  • kill: 强硬退出,直接退出 -9
  • stop: 优雅退出 -15 ,给10秒钟退出准备,10秒后 kill -9

实例12:查看容器日志 (logs)

╭─root@du-z ~  
╰─➤  docker container logs nginx1
# 持续监听日志 

╭─root@du-z ~  
╰─➤  docker container logs nginx1 -f

实例13:进入容器 (exec)

╭─root@du-z ~  
╰─➤  docker exec -it nginx1 /bin/sh               
# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
# 
# exit

实例14:查看端口映射(port)

╭─root@du-z ~  
╰─➤  docker port b4b75dcb00cc
80/tcp -> 192.168.137.3:32768


Container(容器)端口映射

  • 端口映射使容器可以外部访问

第一类:把容器的端口随机映射为物理机的一个端口(-P 大写)

注意:使用-P选项,是把容器内所有expose的端口都映射为物理机的随机端口

╭─root@du-z ~  
╰─➤  docker run -d -P nginx

╭─root@du-z ~  
╰─➤  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
69fdffa4d862        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       0.0.0.0:32768->80/tcp   frosty_swartz
╭─root@du-z ~  
╰─➤  ss -ntl
State       Recv-Q Send-Q          Local Address:Port                         Peer Address:Port              
LISTEN      0      128                         *:22                                      *:*                  
LISTEN      0      100                 127.0.0.1:25                                      *:*                  
LISTEN      0      128                        :::22                                     :::*                  
LISTEN      0      100                       ::1:25                                     :::*                  
LISTEN      0      128                        :::32768                                  :::*                  

第二类:把容器的端口映射为物理机特定的一个端口(-p 小写)

注意:81 为物理机端口 80为容器端口

╭─root@du-z ~  
╰─➤  docker run -d -p 81:80 nginx

╭─root@du-z ~  
╰─➤  docker ps              
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
fa0c51407f81        nginx               "nginx -g 'daemon of…"   52 seconds ago      Up 50 seconds       0.0.0.0:81->80/tcp   elegant_fermat
╭─root@du-z ~  
╰─➤  ss -ntl
State       Recv-Q Send-Q          Local Address:Port                         Peer Address:Port              
LISTEN      0      128                         *:22                                      *:*                  
LISTEN      0      100                 127.0.0.1:25                                      *:*                  
LISTEN      0      128                        :::81                                     :::*                  
LISTEN      0      128                        :::22                                     :::*                  
LISTEN      0      100                       ::1:25                                     :::*    

第三类:把容器的端口映射为物理机特定网卡上的特定端口(-p 小写)

注意:192.168.137.3:81 <--->0.0.0.0:81

╭─root@du-z ~  
╰─➤  docker run -d -p 192.168.137.3:81:80 nginx

╭─root@du-z ~  
╰─➤  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
d4fd0a2b72f9        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       192.168.137.3:81->80/tcp   laughing_tu
╭─root@du-z ~  
╰─➤  ss -ntl 
State       Recv-Q Send-Q          Local Address:Port                         Peer Address:Port              
LISTEN      0      128             192.168.137.3:81                                      *:*                  
LISTEN      0      128                         *:22                                      *:*                  
LISTEN      0      100                 127.0.0.1:25                                      *:*                  
LISTEN      0      128                        :::22                                     :::*                  
LISTEN      0      100                       ::1:25                                     :::*       

第四类:把容器的端口映射为物理机特定网卡上的随机端口(-p 小写)

╭─root@du-z ~  
╰─➤  docker run -d -p 192.168.137.3::80 nginx

╭─root@du-z ~  
╰─➤  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
b4b75dcb00cc        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        192.168.137.3:32768->80/tcp   loving_hellman
╭─root@du-z ~  
╰─➤  ss -ntl
State       Recv-Q Send-Q          Local Address:Port                         Peer Address:Port              
LISTEN      0      128                         *:22                                      *:*                  
LISTEN      0      100                 127.0.0.1:25                                      *:*                  
LISTEN      0      128             192.168.137.3:32768                                   *:*                  
LISTEN      0      128                        :::22                                     :::*                  
LISTEN      0      100                       ::1:25                                     :::*        

两容器之间建立连接

命令参数

$ run --link  name:alias     

#其中:name一个运行中的容器名;alias 是这个连接的别名
#Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上

Docker 通过两种方式为容器公开连接信息:

  1. 环境变量
  2. 更新 /etc/hosts文件

示例:

#第一步:运行一个mysql容器取名mysqlname

╭─root@du-z ~  
╰─➤  docker run -d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysqlname  mysql            
499490e40651b18d0fd37d4d91268f1c2af0b40c06dfb19b705b7b4ff87cd31c

#第二步:run --link 关联创建nginx容器

╭─root@du-z ~  
╰─➤  docker run -d --link mysqlname:mysql nginx                                                             
2b90eb01945aae98f476bc23ac0766ab840b96a69b933b5b3bc999da5fc38271


#第三步:进入nginx容器查看环境变量

╭─root@du-z ~  
╰─➤  docker ps               
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                 NAMES
2b90eb01945a        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp                awesome_mcclintock
499490e40651        mysql               "docker-entrypoint.s…"   8 minutes ago        Up 8 minutes        3306/tcp, 33060/tcp   mysqlname

╭─root@du-z ~  
╰─➤  docker exec -it 2b90eb01945a sh
# env
MYSQL_PORT_33060_TCP=tcp://172.17.0.4:33060
HOSTNAME=2b90eb01945a
HOME=/root
PKG_RELEASE=1~buster
MYSQL_ENV_MYSQL_MAJOR=8.0
TERM=xterm
MYSQL_PORT_3306_TCP_ADDR=172.17.0.4
NGINX_VERSION=1.17.2
MYSQL_ENV_MYSQL_ROOT_PASSWORD=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_PORT_3306_TCP_PORT=3306
NJS_VERSION=0.3.3
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_33060_TCP_ADDR=172.17.0.4
MYSQL_PORT=tcp://172.17.0.4:3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.4:3306
MYSQL_PORT_33060_TCP_PORT=33060
MYSQL_ENV_MYSQL_VERSION=8.0.17-1debian9
MYSQL_PORT_33060_TCP_PROTO=tcp
MYSQL_NAME=/awesome_mcclintock/mysql


commit制作镜像

第一步:运行容器

╭─root@du-z ~  
╰─➤  docker run -d nginx

第二步:配置环境

# 略

第三步:进行commit提交,制作镜像

╭─root@du-z ~  
╰─➤  docker commit -p b4b75dcb00c nginx-public:v1
sha256:0a23a33fc7f72598deb80d3c4fe16bca13804bd5b171be7f8ec9caef65db6d26
╭─root@du-z ~  
╰─➤  docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-public        v1                  0a23a33fc7f7        10 seconds ago      126MB


## 建议-p (pause)暂停制作镜像

第四步:把镜像制作成压缩包

╭─root@du-z ~  
╰─➤  docker image save nginx-public:v1 > nginx-public.tar    
╭─root@du-z ~  
╰─➤  ls
anaconda-ks.cfg  busybox:v1.tar  docker-sbeed.sh  nginx-public.tar

第五步:发送

# 略

第六步:使用

╭─root@du-z ~  
╰─➤  docker image load < nginx-public.tar 
0b9c86526c2e: Loading layer [==================================================>]  6.656kB/6.656kB
Loaded image: nginx-public:v1
╭─root@du-z ~  
╰─➤  docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-public        v1                  0a23a33fc7f7        8 minutes ago       126MB


私有仓库registry使用

第一步:拉取到registry镜像(查看镜像)

╭─root@node1 ~  
╰─➤  docker pull registry
╭─root@node1 ~  
╰─➤  docker image ls
╭─root@node1 ~  
╰─➤  docker image ls   
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE

registry                                                          latest              f32a97de94e1        5 months ago        25.8MB

第二步:查看镜像信息

╭─root@node1 ~  
╰─➤  docker image history registry     
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f32a97de94e1        5 months ago        /bin/sh -c #(nop)  CMD ["/etc/docker/registr…   0B                  
<missing>           5 months ago        /bin/sh -c #(nop)  ENTRYPOINT ["/entrypoint.…   0B                  
<missing>           5 months ago        /bin/sh -c #(nop) COPY file:507caa54f88c1f38…   155B                
<missing>           5 months ago        /bin/sh -c #(nop)  EXPOSE 5000                  0B                  
<missing>           5 months ago        /bin/sh -c #(nop)  VOLUME [/var/lib/registry]   0B                  
<missing>           5 months ago        /bin/sh -c #(nop) COPY file:4544cc1555469403…   295B                
<missing>           5 months ago        /bin/sh -c #(nop) COPY file:21256ff7df5369f7…   20.1MB              
<missing>           5 months ago        /bin/sh -c set -ex     && apk add --no-cache…   1.29MB              
<missing>           5 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           5 months ago        /bin/sh -c #(nop) ADD file:38bc6b51693b13d84…   4.41MB    

第三步:编写文件

╭─root@node1 ~  
╰─➤  vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],     #阿里云镜像加速地址(每人一个);结尾 “,” 不能省
  "insecure-registries":["192.168.137.3:5000"]    #允许不安全的镜像地址
}

第四步:重启docker

╭─root@node1 ~  
╰─➤  systemctl restart docker

第五步:改镜像名

╭─root@node1 ~  
╰─➤  docker image tag nginx 192.168.137.3:5000/nginx:v1 

第六步:运行registry

╭─root@node1 ~  
╰─➤  docker run -d -v /registry:/var/lib/registry -p 5000:5000 registry
e39972548aca665813421c1b4bff85acc08400d5d0d2810f441498efff94f997

# 绑定数据卷
# 做端口映射

╭─root@node1 ~  
╰─➤  ls /      # 查看自动创建/registry目录
bin   dev  home  lib64  mnt  proc      root  sbin  sys  usr  webroom
boot  etc  lib   media  opt  registry  run   srv   tmp  var

第七步:查看registry容器运行状态,并上传镜像

╭─root@node1 ~  
╰─➤  docker ps |grep 5000    
05df172e9cd2        registry                                            "/entrypoint.sh /etc…"   5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp   funny_swartz

╭─root@node1 ~  
╰─➤  docker image tag nginx 192.168.137.3:5000/nginx:v1

第八步:查看

╭─root@node1 ~  
╰─➤  ls /registry/docker/registry/v2/repositories/                     
nginx

其他人使用

第一步:编写docker daemon文件,并重启docker

╭─root@node2 ~  
╰─➤  vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.137.3:5000"]
}

╭─root@node2 ~  
╰─➤  systemctl restart docker

第二步:拉取镜像

╭─root@node2 ~  
╰─➤  docker pull 192.168.137.3:5000/nginx:v1
v1: Pulling from nginx
f5d23c7fed46: Pull complete 
918b255d86e5: Pull complete 
8c0120a6f561: Pull complete 
Digest: sha256:dc85890ba9763fe38b178b337d4ccc802874afe3c02e6c98c304f65b08af958f
Status: Downloaded newer image for 192.168.137.3:5000/nginx:v1
192.168.137.3:5000/nginx:v1

推荐文章:http://www.bubuko.com/infodetail-2686015.html

推荐文章:http://www.kendd.cn/?s=docker+

原文地址:https://www.cnblogs.com/du-z/p/11338911.html