docker 基本技术点

207 阅读21分钟

一、介绍

Docker是使用容器container的平台,容器其实只是一个隔离的进程,除此之外啥都没有。这个进程包含一些封装特性,以便和主机还有其他的容器隔离开。一个容器依赖最多的是它的文件系统也就是image,image提供了容器运行的一切包括 code or binary, runtimes, dependencies, and 其他 filesystem 需要的对象**。**

容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,占用的内存不比其他的filesystem多,因此它是轻量级的。相比之下,虚拟机(VM)运行一个成熟的“guest”操作系统,通过hypervisor对主机资源进行虚拟访问。一般来说,vm会产生大量开销,超出应用程序逻辑所消耗的开销。

image.png Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术(rootfs是容器文件系统层技术)

  • IPC 进程间通信隔离
  • Network 隔离网络资源
  • Mount 隔离文件系统
  • PID 进程隔离
  • User 隔离用户权限
  • UTS 用来隔离系统的hostname以及NIS domain name

Linux内核为以上6种namespace隔离提供了系统调用

Cgroups是control groups的缩写,最初由google的工程师提出,后来被整合进Linux内核。Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU、内存、IO等)的机制。

二、安装

参考菜鸟教程 Ubuntu Docker 安装 | 菜鸟教程 (runoob.com)

三、hello word

docker hello word

Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果

root@deeptest-ecs:/data/git/deeptest/ui# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete 
759aa75f3cee: Pull complete 
3fa871dc8a2b: Pull complete 
224c42ae46e7: Pull complete 
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
  • docker:  Docker 的二进制执行文件。
  • run:  与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo "Hello world": 在启动的容器里执行的命令

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现 "对话" 的能力:

root@deeptest-ecs:/data/git/deeptest/ui# docker run -it  ubuntu:15.10 /bin/bash
root@c46b427a2018:/# pwd
/
root@c46b427a2018:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

  • -t:  在新容器内指定一个伪终端或终端。
  • -i:  允许你对容器内的标准输入 (STDIN) 进行交互。

通过运行 exit 命令或者使用 CTRL+D 来退出容器。

root@c46b427a2018:/# exit
exit

问题:退出容器之后,容器的状态是?

启动容器(后台模式)

使用-d参数创建一个以进程方式运行的容器

root@deeptest-ecs:/data/git/deeptest/ui# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
9aae0db40498d2811bb7a3b661e1b6e2e25ed6c109fa654037510d417d7eddcc

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器ID操作( 查看、删除,启动、关闭)容器

可以通过 docker ps 来查看正在运行的容器:

root@deeptest-ecs:/data/git/deeptest/ui# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS        NAMES                                                                                   
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   2 minutes ago   Up 2 minutes                jovial_bose   
  • CONTAINER ID:  容器 ID。
  • IMAGE:  使用的镜像。
  • COMMAND:  启动容器时运行的命令。
  • CREATED:  容器的创建时间。
  • STATUS:  容器状态。
  • PORTS:  容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES:  自动分配的容器名称。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

通过docker logs CONTAINER ID 查看容器日志。

docker logs 9aae0db40498
hello world
hello world
hello world
hello world
hello world
hello world

docker logs NAME 也可以查看容器日志。

docker logs jovial_bose
hello world
hello world
hello world
hello world
hello world
hello world

四、基本命令和常用参数

镜像操作

1. 拉取镜像 docker pull [镜像名称]

root@deeptest-ecs:/home/deeptest# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6e3729cf69e0: Pull complete 
Digest: sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

2. 查看本地镜像 docker images [镜像名称]

root@deeptest-ecs:/data/git/deeptest/ui# docker images
REPOSITORY             TAG       IMAGE ID       CREATED        SIZE
jenkins/jenkins        latest    1360700893a9   11 days ago    471MB
mysql                  8.0.32    412b8cc72e4a   2 weeks ago    531MB
redis                  latest    2f66aad5324a   2 months ago   117MB
ubuntu                 latest    6b7dfa7e8fdb   4 months ago   77.8MB
kennethreitz/httpbin   latest    b138b9264903   4 years ago    534MB
ubuntu                 15.10     9b9cb95443b5   6 years ago    137MB

docker image ls [镜像名称] 类似,可以增加参数 --format ,--filter

root@deeptest-ecs:/home/deeptest# docker image ls --format "{{.Repository}}:{{.Tag}}"
jenkins/jenkins:latest
mysql:8.0.32
redis:latest
ubuntu:latest
kennethreitz/httpbin:latest
ubuntu:15.10

3. 查找镜像 docker search [镜像名称]

root@deeptest-ecs:/home/deeptest# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        18424     [OK]       
unit                                              Official build of NGINX Unit: a polyglot app…   0         [OK]       
bitnami/nginx                                     Bitnami nginx Docker Image                      159                  [OK]
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr25                   [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   86   

4. 查看镜像详细信息 docker image inspect [镜像名称]

root@deeptest-ecs:/home/deeptest# docker image inspect ubuntu
[
    {
        "Id": "sha256:6b7dfa7e8fdbe18ad425dd965a1049d984f31cf0ad57fa6d5377cca355e65f03",
        "RepoTags": [
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2022-12-09T01:20:31.321639501Z",
        "Container": "8bf713004e88c9bc4d60fe0527a509636598e73e3ad1e71a9c9123c863c17c31",
        "ContainerConfig": {
            "Hostname": "8bf713004e88",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"bash\"]"
            ],
            "Image": "sha256:070606cf58d59117ddc1c48c0af233d6761addbcd4bf9e8e39fd10eef13c1bb7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "bash"
            ],
            "Image": "sha256:070606cf58d59117ddc1c48c0af233d6761addbcd4bf9e8e39fd10eef13c1bb7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 77798780,
        "VirtualSize": 77798780,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/merged",
                "UpperDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/diff",
                "WorkDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:6515074984c6f8bb1b8a9962c8fb5f310fc85e70b04c88442a3939c026dbfad3"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

5.查镜像历史 docker image history [镜像名称]

root@deeptest-ecs:/home/deeptest#  docker image history ubuntu
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
6b7dfa7e8fdb   4 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      4 months ago   /bin/sh -c #(nop) ADD file:481dd2da6de715252…   77.8MB 

用 history 子命令,该命令将列出各层的创建信息

6.删除镜像 docker rmi [镜像名称:tag]

root@deeptest-ecs:/home/deeptest# docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763
Deleted: sha256:6b7dfa7e8fdbe18ad425dd965a1049d984f31cf0ad57fa6d5377cca355e65f03
Deleted: sha256:6515074984c6f8bb1b8a9962c8fb5f310fc85e70b04c88442a3939c026dbfad3

当有该镜像创建的容器存在时,镜像文件默认是无法被删除的

docker rmi -f 强制删除镜像,通常不建议这么做,首先停掉容器,然后删除容器,再删除镜像

可以在docker image rm命令中传入当前系统的全部镜像ID,可以通过docker image ls -q获取全部镜像ID

容器操作

1. docker run 启动容器

参数 -d

启动一个后台运行的容器。

root@deeptest-ecs:/data/git/deeptest/ui# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" 9aae0db40498d2811bb7a3b661e1b6e2e25ed6c109fa654037510d417d7eddcc

不加-d参数,容器会占据交互终端,如果 ctr+c 退出,容器就会退出。

参数 -it 容器创建就能登录进去。即分配一个伪终端,前面讲过了。

参数--name

为创建的容器命名。

root@deeptest-ecs:/home/deeptest# docker run -d --name myubuntu  ubuntu:15.10 /bin/sh -c "echo 'hello world'"
ad4c3350db940e164009693cea0eebb7a14799d6ec6bd449bf0c929a9e5f54cf
root@deeptest-ecs:/home/deeptest# 
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS           PORTS          NAMES
ad4c3350db94   ubuntu:15.10      "/bin/sh -c 'echo 'h…"   6 seconds ago        Exited (0) 5 seconds ago        myubuntu

创建一个容器后台运行,并且命名myubuntu,如果加--name,则会随机生成一个名字。

参数 -p

指定端口映射,格式为:宿主机端口:容器端口

root@deeptest-ecs:/home/deeptest# docker run -d  -p 6479:6379 redis
a052a76fe07d92aee7fc33b5ac295c03def4dc0b187d985e7a36a5c0432cc81c
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                                                                        NAMES
a052a76fe07d   redis             "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:6479->6379/tcp, :::6479->6379/tcp                                                    sad_margulis

上面例子启动一个redis容器,并且把容器的内部端口(6379) 映射到宿主机6479上。

测试下,通过redis-cli 访问 宿主机 6479 端口。

root@deeptest-ecs:/home/deeptest# redis-cli -p 6479
127.0.0.1:6479> select 0
OK

没什么问题,可以连接,执行命令。

参数 -v

v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

root@deeptest-ecs:/home/deeptest# docker run -it -v /home/deeptest/test:/soft centos /bin/bash
[root@ef313c67087b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv	sys  tmp  usr  var
[root@ef313c67087b /]# cd soft/
[root@ef313c67087b soft]# touch a.txt
[root@ef313c67087b soft]# ls
a.txt

创建一个容器,并且把宿主机 /home/deeptest/test 挂载到容器 /soft 下面,在容器里面进入到soft 目录,然后创建一个 a.txt 文件,接下来我们进入到宿主机 /home/deeptest/test 目录下面,查看文件是否生成了。

deeptest@deeptest-ecs:~/test$ pwd
/home/deeptest/test
deeptest@deeptest-ecs:~/test$ ls
a.txt

没问题,可以看到文件,说明挂载成功。

参数 -e

为环境设置环境变量

root@deeptest-ecs:/home/deeptest# docker run -it -e TESTENV=hello centos /bin/bash
[root@e941a98fd81a /]# echo $TESTENV
hello
[root@e941a98fd81a /]# 

创建容器,并进入容器,打印变量内容,输出hello 没问题。

参数 -h

为容器设置hostname

root@deeptest-ecs:/home/deeptest# docker run -it -h localhost111  centos /bin/bash
[root@localhost111 /]# hostname
localhost111

参数 --rm

加上参数退出容器之后,容器自动删除

root@deeptest-ecs:/home/deeptest# docker run -it --rm --name mycontos  centos /bin/bash
[root@7c93d8f033c2 /]# exit;
exit
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                        PORTS                                                                                        NAMES
9fe497d91dec   centos            "/bin/bash"              22 minutes ago   Exited (127) 32 seconds ago                                                                                                determined_keldysh
e941a98fd81a   centos            "/bin/bash"              28 minutes ago   Exited (0) 22 minutes ago                                                                                                  great_noyce
ef313c67087b   centos            "/bin/bash"              41 minutes ago   Exited (0) 29 minutes ago  

启动容器,然后退出,列表里面并没有name为 mycontos的容器,容器被自动删除。

参数 -w

指定容器启动默认目录,容器执行命令会在这个目录,默认进入容器也会在这个目录

root@deeptest-ecs:/home/deeptest# docker run -it --rm -w /home  centos /bin/bash
[root@693406160b2e home]# pwd
/home

指定容器默认工作目录/home,进入容器默认在home下面。

参数 -u

指定容器用户,默认不加为root用户

root@deeptest-ecs:/home/deeptest# docker run -it --rm  -u nobody  centos /bin/bash
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)

参数 --restart

容器重启策略,包含3个选项:no,on-failure[:times],always,unless-stopped

root@deeptest-ecs:/home/deeptest# docker run -d --restart=on-failure:3 centos /bin/sh -c "echo1 'hello world'"
9cd915cc9e22bded34359f89f2126dfbe83a20c36d314f6e954d79aeccbc9173
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS                          PORTS                                                                                        NAMES
9cd915cc9e22   centos            "/bin/sh -c 'echo1 '…"   6 seconds ago        Exited (127) 4 seconds ago                                                                                                   practical_gates

root@deeptest-ecs:/home/deeptest# docker logs 9cd915cc9e22
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found

容器由于启动失败,重试了三次,算上第一次启动,一共四次。

2. docker ps 查看正在运行中的容器

root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                                                                                        NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Up 6 days                                                                                                 jovial_bose
750ad37997fd   mysql:8.0.32      "docker-entrypoint.s…"   11 days ago   Up 11 days   33060/tcp, 0.0.0.0:53306->3306/tcp, :::53306->3306/tcp                                       mysql
2d8144ff4481   jenkins/jenkins   "/usr/bin/tini -- /u…"   12 days ago   Up 11 days   0.0.0.0:50280->8080/tcp, :::50280->8080/tcp, 0.0.0.0:50200->50000/tcp, :::50200->50000/tcp   jenkins
f0bcc5fd5938   redis             "docker-entrypoint.s…"   8 weeks ago   Up 11 days   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                    myredis

参数 -a

查看所有容器

root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                     PORTS                                                                                        NAMES
ad4c3350db94   ubuntu:15.10      "/bin/sh -c 'echo 'h…"   6 minutes ago   Exited (0) 6 minutes ago                                                                                                myubuntu
78a7509ed34f   ubuntu:15.10      "/bin/sh -c 'echo 'h…"   7 minutes ago   Exited (0) 7 minutes ago                                                                                                happy_vaughan
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago      Up 6 days                                                                                                               jovial_bose
750ad37997fd   mysql:8.0.32      "docker-entrypoint.s…"   11 days ago     Up 11 days                 33060/tcp, 0.0.0.0:53306->3306/tcp, :::53306->3306/tcp                                       mysql
2d8144ff4481   jenkins/jenkins   "/usr/bin/tini -- /u…"   12 days ago     Up 11 days                 0.0.0.0:50280->8080/tcp, :::50280->8080/tcp, 0.0.0.0:50200->50000/tcp, :::50200->50000/tcp   jenkins
f0bcc5fd5938   redis             "docker-entrypoint.s…"   8 weeks ago     Up 11 days                 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                    myredis

3.docker stop 停掉容器

root@deeptest-ecs:/home/deeptest# docker stop 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND         CREATED       STATUS            PORTS             NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Exited (137) 7 seconds ago jovial_bose

容器状态 Exited,7 秒前退出的

4.docker start 启动容器

root@deeptest-ecs:/home/deeptest# docker start 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps 
CONTAINER ID   IMAGE        COMMAND          CREATED       STATUS         PORTS          NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Up 3 seconds     jovial_bose

5. docker restart 重启容器

root@deeptest-ecs:/home/deeptest# docker restart 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps 
CONTAINER ID   IMAGE         COMMAND       CREATED       STATUS          PORTS                 NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Up 10 seconds          jovial_bose

6. docker rm 删除容器

root@deeptest-ecs:/home/deeptest# docker rm ba513b5d03ef
ba513b5d03ef

7. docker logs 查看容器日志输出。

docker logs 9aae0db40498
hello world
hello world
hello world

8.docker top 查看容器进程

root@deeptest-ecs:/home/deeptest/test# docker top 750ad37997fd
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
systemd+            24421               24399               0                   Apr14               ?                   00:41:09            mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
root                293560              24399               0                   Apr21               ?                   00:00:00            /bin/bash
root                293633              293560              0                   Apr21               ?                   00:00:00            mysql -u root -p
root                330066              24399               0                   Apr21               pts/1               00:00:00            /bin/bash
root                330160              330066              0                   Apr21               pts/1               00:00:00            mysql -u root -p

9. docker attach 进入容器

因为此命令会退出容器终端,会导致容器的停止,建议使用 docker exec

root@deeptest-ecs:/home/deeptest# docker attach 9aae0db40498
hello world
hello world
hello world
hello world
^Chello world
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS                     PORTS                                                                                        NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Exited (0) 6 seconds ago                                                                                                jovial_bose

10. docker exec

命令会退出容器终端,不会导致容器的停止

root@deeptest-ecs:/home/deeptest# docker exec -it  9aae0db40498  /bin/bash
root@9aae0db40498:/# 
root@9aae0db40498:/# 
root@9aae0db40498:/# pwd
/
root@9aae0db40498:/# exit
exit
root@deeptest-ecs:/home/deeptest# docker ps 
CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS              PORTS                                                                                        NAMES
9aae0db40498   ubuntu:15.10      "/bin/sh -c 'while t…"   6 days ago    Up About a minute                                                                                                jovial_bose

11. docker export

导出容器快照

root@deeptest-ecs:/home/deeptest/test# docker export 9aae0db40498 > ubuntu.tar
root@deeptest-ecs:/home/deeptest/test# ls
ubuntu.tar

导出容器,容器信息保存在 ubuntu.tar

12. docker import

导入容器快照

root@deeptest-ecs:/home/deeptest/test# cat ubuntu.tar | docker import - test/ubuntu:v1
sha256:60bb9c34182c19a0373106ea6bdc1e37fc26e066e6acfbb4a996c3fa0ad9cb48
root@deeptest-ecs:/home/deeptest/test# docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
test/ubuntu            v1        60bb9c34182c   8 seconds ago   119MB

使用 docker import 从容器快照文件中再导入为镜像,以上实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1

使用导入的镜像,启动容器

root@deeptest-ecs:/home/deeptest/test# docker run -d test/ubuntu:v1 /bin/bash
93abfa456f7333f6790695463091ac7728075c67d0d3877c05d67dae96723f22
root@deeptest-ecs:/home/deeptest/test# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                        PORTS                                                                                        NAMES
93abfa456f73   test/ubuntu:v1    "/bin/bash"              5 seconds ago   Exited (0) 4 seconds ago                                                                                                   fervent_taussig

创建容器成功。

五、容器互通

容器互通指的是容器之间相互通信,首先想到的就是通过端口号,因为容器可以把内部端口映射到宿主机机上,那么在容器内部访问宿主机的端口就可以访问其他容器。

下面我们介绍另外一种办法。 通过 docker network create 创建一个网络

-d:参数指定 Docker 网络类型,有 bridge、overlay。

root@deeptest-ecs:/home/deeptest/test# docker network create -d bridge test-net
d7669c5645c875210b0363886f962b016cc3d207bd23858fc4ac87ef263ab973

接下来使用这个网络。

启动容器 test1

root@deeptest-ecs:/home/deeptest/test# docker run -itd --name test1 --network test-net ubuntu /bin/bash
e70c36765e3c9148faa967ca899af8bd1adb86e98c2abbcb41f171142b933f0a

启动容器test2

deeptest@deeptest-ecs:~/test$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
Digest: sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21

通过以下命名安装ping 命令

apt-get update
apt install iputils-ping

接下分别进入到容器test1,test2 ,ping 对方容器

docker exec -it bfc377468f96 /bin/bash
root@bfc377468f96:/# ping test1
PING test1 (172.18.0.2) 56(84) bytes of data.
64 bytes from test1.test-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=3 ttl=64 time=0.046 ms
deeptest@deeptest-ecs:~/test$ docker exec -it e70c36765e3c /bin/bash
root@e70c36765e3c:/# ping test2
PING test2 (172.18.0.3) 56(84) bytes of data.
64 bytes from test2.test-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=4 ttl=64 time=0.057 ms

两个容器互相通的。

六、镜像

镜像仓库

在 hub.docker.com 免费注册一个 Docker 账号。

docker login

按照提示输入注册的用户名密码

root@deeptest-ecs:/home/deeptest# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: codewang123
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

拉ubuntu 镜像

root@deeptest-ecs:/home/deeptest# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
dbf6a9befcde: Pull complete 
Digest: sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e47492599ee20739e8eb54fbf
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

基于一个已经存在的镜像,打个tag 创建新镜像 codewang123/ubuntu:18.04

codewang123 为你注册的用户名。

root@deeptest-ecs:/home/deeptest# docker tag ubuntu codewang123/ubuntu:18.04
root@deeptest-ecs:/home/deeptest# docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
test/ubuntu            v1        60bb9c34182c   2 weeks ago     119MB
codewang123/ubuntu        18.04     3b418d7b466a   2 weeks ago     77.8MB
ubuntu                 latest    3b418d7b466a   2 weeks ago     77.8MB

推送镜像到仓库

root@deeptest-ecs:/home/deeptest# docker tag ubuntu codewang123/ubuntu:18.04
root@deeptest-ecs:/home/deeptest# docker push codewang123/ubuntu:18.04
The push refers to repository [docker.io/codewang123/ubuntu]
b8a36d10656a: Pushed 
18.04: digest: sha256:8d741c3fb719fff7991700dbe988d1d549f32b3c24ae2276657f4a4ca0fbe42d size: 529
root@deeptest-ecs:/home/deeptest# docker search codewang123/ubuntu
NAME                 DESCRIPTION   STARS     OFFICIAL   AUTOMATED
codewang123/ubuntu 

搭建私有仓库 harbor

参考下面文章

(15条消息) Docker-Hubor私有镜像仓库的搭建_dockerhub私有仓库搭建_大飞哥~BigFei的博客-CSDN博客

七、制作镜像

使用 Dockerfile 定制镜像

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

八、容器编排

Compose

九、一个例子

复杂例子,涉及到上述所有命令。