Docker基础

Docker基础

一、基础概念

官方

Docker 三要素

镜像(image)

​ 就是一个只读的模版,镜像可以用来创建Dcoker容器,一个镜像可以创建很多个容器

容器(container)

  1. 独立运行的一个或一组应用.容器是用镜像创建的运行实例
  2. 他可以被启动、开始、停止、删除、每个容器都是相互隔离的、保证安全的平台.
  3. 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序.容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的.

仓库(Repository)

  1. 是集中存放镜像文件的场所
  2. 仓库(Repository)和仓库注册服务器(Registry)是有区别的.仓库注册服务器上往往存放着多个仓库,每个仓库中又包含来多个镜像文件.每个镜像又不同的标签(tag)
  3. 仓库分为公开库(public)和私有仓库(private)两种形式
  4. 最大的公开仓库是 docker hub(https://hub.docker.com)
  5. 存放来数量庞大的镜像仅供用户下载.国内的公开仓库包括阿里云,网易云等

Docker与虚拟机(VM)

docker容器 虚拟机
操作系统 与宿主机共享os 宿主机os上运行虚拟机
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk,vdi等)
运行性能 几乎无额外性能损耗 操作系统额外的CPU,内存消耗大
移植性 轻便,灵活,试应与Linux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,秒级 较慢,10s以上

二、Docker 常用命令

显示 Docker 版本信息

docker version

显示 Docker 系统信息,包括镜像和容器数

docker info

帮助

docker --help

镜像命令

docker images 镜像

[root@localhost docker]# docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
tomcat                                                   8                   02d718ca90fd        9 months ago        530MB
tomcat                                                   latest              891fcd9c5b3a        9 months ago        647MB
tomcat                                                   latest              891fcd9c5b3a        9 months ago        647MB
nginx                                                    latest              f35646e83998        9 months ago        133MB
mysql                                                    5.7                 42cdba9f1b08        9 months ago        448MB
centos                                                   latest              0d120b6ccaa8        11 months ago       215MB
java                                                     8                   d23bdf5b1b1b        4 years ago         643MB
maluuba/tomcat7-java8                                    latest              98a0fcf6d133        4 years ago         662MB
  • REPOSITORY 表示镜像的仓库源
  • TAG 镜像标签
  • IMAGE ID 镜像ID
  • CRAEATE ID 镜像创建时间
  • SIZE: 镜像大小
  • 同一个仓库源可以又多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像,如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker将默认使用 ubuntu:latest 镜像
  • options说明:
    • -a:列出本地所有的镜像(含中间映像层)
    • -q:只显示镜像ID
    • --digests:显示镜像的摘要信息
    • --no-trunc:显示完整的镜像信息

docker search 查询

  • docker [options] 镜像名字
  • options :
    • --no-trunc 显示完整的镜像描述
    • -s: 列出收藏数不小于指定值的镜像
    • --automated: 只列出automated build的类型的镜像:
[root@centos-linux ~]# docker search tomcat
NAME                          DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   2851                [OK]                
tomee                         Apache TomEE is an all-Apache Java EE certif…   83                  [OK]                
dordoka/tomcat                Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base…   55                                      [OK]
bitnami/tomcat                Bitnami Tomcat Docker Image                     36                                      [OK]
kubeguide/tomcat-app          Tomcat image for Chapter 1                      29                                      
consol/tomcat-7.0             Tomcat 7.0.57, 8080, "admin/admin"              17                                      [OK]
cloudesire/tomcat             Tomcat server, 6/7/8                            15                                      [OK]
aallam/tomcat-mysql           Debian, Oracle JDK, Tomcat & MySQL              13                                      [OK]
arm32v7/tomcat                Apache Tomcat is an open source implementati…   10                                      
rightctrl/tomcat              CentOS , Oracle Java, tomcat application ssl…   6                                       [OK]
maluuba/tomcat7-java8         Tomcat7 with java8.                             6                                       
unidata/tomcat-docker         Security-hardened Tomcat Docker container.      4                                       [OK]
amd64/tomcat                  Apache Tomcat is an open source implementati…   2                                       
arm64v8/tomcat                Apache Tomcat is an open source implementati…   2                                       
jelastic/tomcat               An image of the Tomcat Java application serv…   2                                       
99taxis/tomcat7               Tomcat7                                         1                                       [OK]
oobsri/tomcat8                Testing CI Jobs with different names.           1                                       
camptocamp/tomcat-logback     Docker image for tomcat with logback integra…   1                                       [OK]
chenyufeng/tomcat-centos      tomcat基于centos6的镜像                              1                                       [OK]
ppc64le/tomcat                Apache Tomcat is an open source implementati…   1                                       
cfje/tomcat-resource          Tomcat Concourse Resource                       1                                       
softwareplant/tomcat          Tomcat images for jira-cloud testing            0                                       [OK]
picoded/tomcat7               tomcat7 with jre8 and MANAGER_USER / MANAGER…   0                                       [OK]
secoresearch/tomcat-varnish   Tomcat and Varnish 5.0                          0                                       [OK]
s390x/tomcat                  Apache Tomcat is an open source implementati…   0                                       

docker pull 拉取镜像

docker pull tomcat
[root@localhost docker]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
627b765e08d1: Pull complete 
c040670e5e55: Pull complete 
073a180f4992: Pull complete 
bf76209566d0: Pull complete 
f10db7ba7580: Pull complete 
5b2f970878fa: Pull complete 
ed434bfebf18: Pull complete 
f6c437110aa9: Pull complete 
a772951f83db: Pull complete 
752225c3768e: Pull complete 
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost docker]# 

docker rmi 删除镜像

  • 删除一个 docker rmi -f 镜像ID
  • 删除多个 docker rmi -f 镜像1:TAG 镜像名2:TAG
  • 删除全部 docker rmi -f $(docker images -qa)
  • docker rmi -f hello-world
[root@localhost docker]# docker rmi -f tomcat
Untagged: tomcat:latest
Untagged: tomcat@sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Deleted: sha256:46cfbf1293b176161813fa05bb8f7e82df1ec7def5c226c48bc48a60ed305ac7
Deleted: sha256:6748c687a38bae8ee5179c1b7c3fc05347dab445a5322f30e62c80348997d99c
Deleted: sha256:4e78f4eefb564a3492c5840bfcf17a0bed07fda1e59127c66058dd7553ed7f9b
Deleted: sha256:99b6cc44dbf7b0b4809ede178ae7fb27fef1401c8b2415be0dc18b6153ff233f
Deleted: sha256:046e7218b905a3de840f00a2aa7081fc53ace4ffba9661d471d59bfdcfa5b4c1
Deleted: sha256:3095bb61fd62bf2c2fd6849289c6043e8866bf104ca0959be3fc3da5bab0be1e
Deleted: sha256:f33d6ed931ff64c63168af00c7544d148d01fda66831246572ff2bfcacbcf2d6
Deleted: sha256:017b9704876de2443b332b1dfec580d365184b514eb0af43f1d59637e77af9bb
Deleted: sha256:98fc59c935e697d6375f05f4fa29d0e1ef7e8ece61aed109056926983ada0ef4
Deleted: sha256:c21ff68b02e7caf277f5d356e8b323a95e8d3969dd1ab0d9f60e7c8b4a01c874
Deleted: sha256:afa3e488a0ee76983343f8aa759e4b7b898db65b715eb90abc81c181388374e3
[root@localhost docker]# 

容器命令

docker run -it 新建并启动容器

  • docker run -it
  • options
    • --name 容器新名字 为容器指定一个名称
    • -d 后台运行容器 并返回容器ID 也即启动守护式容器
    • -i 以交互式模式运行容器,通常与-t同时使用:
    • -t: 为容器重新分配一个伪输入终端,通常与 -i同时使用:
    • -P:随机端口映射:
    • -p:指定端口映射,有以下四种格式
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • contaninerPor

后台启动 tomcat8 容器 内部端口8080 外部端口9990

root@localhost docker]# docker run  -id  -p 9990:8080  tomcat:8
9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0

非后台启动 tomcat8 容器 内部端口8080 外部端口9990

[root@localhost docker]#  docker run  -it -p 9990:8080  tomcat:8
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-8
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
02-Aug-2021 07:08:48.309 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.69
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jun 30 2021 18:00:00 UTC
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.69.0
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1127.19.1.el7.x86_64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-8/jre
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_302-b08
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat

注意:直接退出 Ctrl+ c 进程结束。 Ctrl+ P+ Q 进程后台运行,退出命令行。

docker ps 进程

  • docker ps 进程
  • options
    • -a 列出当前所有正在运行的容器+历史上运行过的
    • -i 显示最近创建的容器
    • -n 显示最近N个创建的容器 docker ps -n 2
    • -q 静默模式,只显示容器编号
    • --no-trunc 不截断输出.
[root@localhost docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
9d340293e2c2        tomcat:8            "catalina.sh run"   4 seconds ago       Up 3 seconds        0.0.0.0:9990->8080/tcp   sad_kepler

docker exec 在运行的容器中执行命令

  • docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • OPTIONS说明:
    • -d :分离模式: 在后台运行
    • -i :即使没有附加也保持STDIN 打开
    • -t :分配一个伪终端
[root@localhost docker]# docker exec -it determined_feistel /bin/sh
# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
# pwd
/usr/local/tomcat

docker attach :连接到正在运行中的容器。

  • docker attach [OPTIONS] CONTAINER
[root@localhost docker]# docker attach quirky_turing

docker inspect 查看容器内部细节

[root@localhost docker]# docker inspect 9d340293e2c2
[
    {
        "Id": "9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0",
        "Created": "2021-08-02T06:55:06.74894522Z",
        "Path": "catalina.sh",
        "Args": [
            "run"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 112128,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-08-02T06:55:07.22290482Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
   …………省略

docker restart 重启

[root@localhost docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
dff9971e52c7        tomcat:8            "catalina.sh run"   9 minutes ago       Up 9 minutes        0.0.0.0:9990->8080/tcp   loving_haslett
[root@localhost docker]# docker restart dff9971e52c7
dff9971e52c7
[root@localhost docker]#

docker stop 停止

[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7

docker kill 强制停止

[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7

docker start 启动

[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7

docker rm 删除

[root@localhost docker]# docker rm dff9971e52c7
dff9971e52c7

docker rm -f 强制删除

[root@localhost docker]# docker rm -f dff9971e52c7
dff9971e52c7

docker rm -f $(docker ps -a -q) 删除多个容器

[root@localhost docker]# docker rm -f $(docker ps -a -q)
54f5b6f8e1fc
1bbf08d5704c
9d340293e2c2
d9454af4daee
f77680c0be59
fa682e10ef7d
ecd5673894d5
f7d1d0f35211

docker ps -a -q | xargs docker rm 删除多个容器

[root@localhost docker]# docker ps -a -q | xargs docker rm
d6435b9cc59c

img

三、UnionFS(联合文件系统):

Union 文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟机文件系统下

官网文档

四、Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFSbootfs(boot file system)主要包含bootloaderkernel, bootloader主要是弓I导加载kernel, Linux刚启动时会加载bootfs文件系统,Docker镜像的最底层是bootfsc这一层与我们典型的Linux/Unix系统是一样的,包含boot加我器和内核。当boot加我完成之后整个内核 就都在内存中了,此时内存的使用权己由bootfs转交给内核,此时系统也会卸我bootfs

rootfs (root file system),在bootfs之包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件° rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等。

五、Docker 分层镜像

​ 最大的一个好处就是-共享资源

比如:有多个镜像都从相同的base镜像构建而来,name宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。

六、Docker 特点

​ Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被陈作为"容器层",容器层之下的都叫“镜像层”。

七、Docker 容器数据卷

概念:

​ 将运用与运行的环境大包形成的容器运行,运行可以伴随着容器,但那会使我们对数据的要求希望是持久化的容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit 生成新的镜像,数据不会做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了

为来能保存数据在docker 中我们使用卷

能干嘛:

容器的持久化

容器间继承+共享数据

特点:
  1. 数据卷可以在容器之间共享数据
  2. 卷中更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用为止
命令

docker run -it 镜像ID

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

docker run -it -v /myDataVolume:/dataVolumeContainer

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

docker run -it -v /myDataVolume:/dataVolumeContainer:ro 只读

容器内添加
  1. 直接命令添加
  2. Dockerfile添加

Dockerfile体系机构

  • FROM:
    • 基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER
    • 镜像维护者的姓名和邮箱
  • RUN
    • 容器构建时需要运行的命令
  • WORKDIR
    • 指定在创建容器后,终端默认登录进来工作目录,一个落脚点
  • ENV
    • 用来构建镜像过程中设置环境变量
  • ADD
    • 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理URL和解压tar压缩包
  • COPY
    • 类型ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
  • VOLUME
    • 容器数据卷,用户数据保存和持久化工作
  • CMD
    • 指定一个容器启动时要运行的命令
    • Dockerfile 中可以有多个 CMD 命令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  • ENTRYPOINT
    • 指定一个容器启动时需要运行的命令
    • ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
  • ONBUILD
    • 当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子镜像继承后父镜像的 onbuild 会被触发

Dockerfile 文件


# test
FROM centos
VOLUME ["/www/docker/data","/www/docker/data"]
CMD echo "finished,-----success1"
CMD /bin/bash
打包镜像
  • docker build -t ming/centos .
  • Docker 挂载主机目录Docker访问出现cannot open directory .:Permission denied
  • 解决办法:在挂载目录后多加一个--privileged=true参数即可
  • DockerFile添加的数据卷需要执行 docker inspect ID 容器细节中查看 宿主机数据卷目录
  • docker build -f /www/docker/DockerFile -t ming/centos .(在当前目录下 无需指定 Dockerfile 路径)
[root@localhost docker]# docker build -t ming/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["/www/docker/data","/www/docker/data"]
 ---> Running in 13d0ab91d6c7
Removing intermediate container 13d0ab91d6c7
 ---> 129928688111
Step 3/4 : CMD echo "finished,-----success1"
 ---> Running in 33f38d495fc5
Removing intermediate container 33f38d495fc5
 ---> 3f3a98d9b049
Step 4/4 : CMD /bin/bash
 ---> Running in d24c5daed8a7
Removing intermediate container d24c5daed8a7
 ---> 0a6187601a12
Successfully built 0a6187601a12
Successfully tagged ming/centos:latest
[root@localhost docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ming/centos         latest              0a6187601a12        27 seconds ago      209MB
centos              latest              300e315adb2f        7 months ago        209MB

启动容器 www 目录 Dockerfile 中挂载的路径

[root@localhost docker]# docker run -it ming/centos
[root@5e7234752a54 /]# docker ps
bash: docker: command not found
[root@5e7234752a54 /]# ls 
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  www
[root@5e7234752a54 /]# cd www/
[root@5e7234752a54 www]# pwd

八、Docker常用安装

总体步骤

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像
  5. 停止镜像
  6. 移除镜像

九、常见问题

一、镜像文件无法删除

进入如下目录,找到对应的镜像 ID 进行删除即可。

cd /var/lib/docker/image/overlay2/imagedb/content/sha256

二、Docker容器端口映射后突然无法连接

1、关闭防火墙服务

systemctl stop firewalld.service

2、防火墙端口放行

firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload

3、没有启用IP_FORWARD, 0就是未启用

[root@localhost docker]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

解决办法一条命令

echo 'net.ipv4.ip_forward = 1' >> /usr/lib/sysctl.d/50-default.conf

重新加载配置

sysctl -p /usr/lib/sysctl.d/50-default.conf

三、Docker 挂载主机目录Docker访问出现cannot open directory .:Permission denied

在挂载目录后多加一个--privileged=true参数即可

posted @ 2021-08-03 09:07  天葬  阅读(135)  评论(0编辑  收藏  举报