一、镜像(Image)

    Docker Image是需要定制化Build的一个“安装包”,包括基础镜像+应用的二进制部署包。这是一个没有运行的容器,或者说是没有启动的应用。类似一个模板,基于这个模板,可以构建出我们需要的环境。比如我们需要一个Java的运行环境,那么这个镜像中就需要有基础操作系统、JDK的环境,如果是Web应用,就需要有Tomcat的支持,当然也可以直接运行SpringBoot,用它内嵌的Tomcat。

    镜像是分层的,也就是说,我们可以按照需求向上叠加。

1.搜索镜像,例如搜索hello-world

docker search hello-world

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker

2.docker拉取下载

docker pull hello-world

可以在命令后面加上:版本号,下载指定的版本,不加默认下载最新的,为了便于后期测试,此处在拉取tomcat

若想拉取指定版本的镜像,目前只有到docker的官网查看https://hub.docker.com/

例如查看tomcat的版本

docker 相同镜像 两个实例 docker一个镜像多个容器_docker 相同镜像 两个实例_02

3.查看所有下载的镜像,列出本地主机已有的所有镜像

docker images  或者  docker image ls

docker 相同镜像 两个实例 docker一个镜像多个容器_docker 相同镜像 两个实例_03

在列出的信息中,可以看到一些字段信息

REPOSITORY表示来自哪个仓库库

TAG是镜像的标记,用于区分仓库中的多种镜像

IMAGE ID是其ID号(唯一)

CREATED是创建时间

SIZE是镜像大小

4.docker删除镜像,使用 docker rmi 加镜像名,这里需要注意,有该镜像创建的容器存在时,镜像文件默认是无法删除的,所以删除镜像前最好删除所有依赖该镜像的容器,不要用强制删除

docker rmi -f 镜像ID或者镜像名:TAG
# 删除指定本地镜像
# -f 表示强制删除

5.创建镜像有3种方法 :

1.基于已有镜像的容器创建时使用docker commit;
2.基于本地模板导入;
3.基于Dockerfile创建。

6.其他的操作镜像的命令还包括:保存镜像使用docker save;载入镜像使用docker load;上传镜像使用docker push 等。

二、容器(Container)

DockerContainer是Image的实例,可以运行不同操作系统的Image。Docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除。可以把容器看作一个最小化版的Linux。并且每个容器都是相互隔离的,可以在其中运行自己需要的环境而不影响其他环境。

1.运行上面下载的镜像tomcat,使用docker run创建一个新的容器并运行一个命令

docker run --name tom -d -p 8080:8080 tomcat

docker 相同镜像 两个实例 docker一个镜像多个容器_docker_04

执行说明:此处的tom是自定义容器的名称,-d表示后台运行,-p表示创建自己的虚拟网卡,与外界隔离,第一个8080是宿主机的端口,开放给外界的,第二个8080是容器的端口

命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS参数说明:

详情参考:https://www.runoob.com/docker/docker-run-command.html

2.进入容器的几种方法

(1)使用docker attach

Docker提供了attach命令来进入Docker容器,只需要加上要进入的容器ID就可以进入容器了。但是使用该命令有一个问题,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法进行操作。所以,这样的命令是无法用在生产环境中的。

(2)使用SSH

看到这个会想到虚拟机,也就是说,如果想通过这种方式进入,首先要在容器中安装SSH Server,然后通过SSH以客户端的方式连接,这种方式虽然能够解决问题,但是对于使用来说太大材小用了。

(3)使用exec

Docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,先执行Dockerps获取容器的ID,然后执行docker exec -it{容器的ID}/bin/bash,这种方式虽然方便,但是有版本的限制。

(4)使用nsenter

nsenter是一个小工具,它可以进入命名空间,或者在现有的命名空间中产生一个新的进程系统一般会为我们默认安装nsenter,如果没有安装就手动执行一下安装命令:

wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz

tar -xzvf util-linux-2.24.tar.gz

cd util-linux-2.24/

./configure --without-ncurses

make nsenter

cp nsenter /usr/local/bin

安装好后,我们需要使用docker inspect命令来获取运行的容器的进程ID,先执行docker p获取想要进入的容器的CONTAINER ID,然后执行docker inspect {容器 ID},一般会输出很多信息,所以截取其中需要的部分,执行docker inspect -f {{.State.Pid}} {容器 ID},这样就可以获取运行的进程的 PID 了。然后执行 nsenter --target {运行容器的 PID} --mount --uts --ipc --net -- pid /bin/bash,就可以进入容器中了,如果嫌这些操作麻烦,可以使用网上已经封装好的脚本进入。

3. 运行docker ps可以看到所有正在运行的容器的状态。

docker ps

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker_05

例如:

上述docker run --name tom -d -p 8080:8080 tomcat后,打开浏览器,使用虚拟机的ip:8080后没打开tomcat的admin管理页面,现在默认的tomcat镜像,都不再提供admin界面了,需要自己修改

解决步骤:

(1) 查看docker container id

docker ps

(2)进入容器

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker_06

这里有报错“mesg: ttyname failed: No such file or directory”, 解决方法是在 nsenter 指令后面指定一个执行的shell  /bin/bash

如下所示即可

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker_07

(3)查看目录,发现ll、ls以及vim指令都不可以使用,执行命令export PATH=/bin:/usr/bin:$PATH即可使用ls,然后安装vim

export PATH=/bin:/usr/bin:$PATH
apt-get update
apt-get install vim

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker_08

(4)进入tomcat目录,查看文件目录

docker 相同镜像 两个实例 docker一个镜像多个容器_docker 相同镜像 两个实例_09

(5)分别执行以下步骤,将webapp.dist内的文件移动到webapp中

docker 相同镜像 两个实例 docker一个镜像多个容器_docker_10

(6)退出,重新刷新浏览器

docker 相同镜像 两个实例 docker一个镜像多个容器_tomcat_11

4.启动守护式容器:守护式容器(daemonized container)没有交互式会话,适合运行应用程序和服务。守住容器可以添加-d参数来实现。如果想查看日志中的输出,使用docker logs获取容器运行时的输出日志,可以加上一tail参数设置要显示的条数。

5.其他的容器操作命令还包括:创建容器使用docker create;终止容器使用docker stop;启动容器使用docker start;重启容器使用docker restart;删除容器使用 docker rm:导出容器使用docker export等。

当docker重启后,对容器的操作

docker 相同镜像 两个实例 docker一个镜像多个容器_docker_12

docker 相同镜像 两个实例 docker一个镜像多个容器_Docker_13

docker 相同镜像 两个实例 docker一个镜像多个容器_docker 相同镜像 两个实例_14

三、仓库

仓库是存放镜像的地方,仓库又可以分为公有仓库和私有仓库。

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时,只需要从仓库上“pull”下来就可以了。

1.仓库登录使用docker login。

2.管理私有仓库。

(1)假设私有仓库地址为192.168.0.100,端口为5000;

(2)docker tag ubuntu:l4.04192.168.0.100:5000/test(更改标签名〉;

(3)docker push 192.168.0.100:5000/test(push镜像,会自动“push”到192.168.0.100地址

的机器上):

(4)curl http://192.168.0.100:5000/vl/search(查看仓库192.168.0.100:5000中是否含有test镜像);

(5)docker pull 192.168.0.100:5000/test(在任何一台能访问到192.168.0.100地址的机器上下载镜像)。

若想自己搭建仓库,推荐使用Harbor,是一款非常专业的私有仓库管理软件。