docker的容器及镜像

一、docker 容器基本使用

1、容器状态:

        running、stoped、paused、created(表示刚刚创建还没有启动)

2、查看容器当前状态:

        #docker container ps=docker ps 

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a325be03b2d1        redis:4-alpine      "docker-entrypoint.s…"   20 minutes ago      Up 20 minutes       6379/tcp            redis

CONTAINER ID:指容器ID;      IMAGE:容器启动时的镜像   ;    COMMAND:这个容器内部运行的程序是什么

CREATED:创建时间;    STATUS:状态;      PORTS:监听端口;  NAMES:名称

3、创建容器
       

         #docker  create
         #docker  run
                选项:-t,--tty  //表示给启动的容器附加一个伪终端

                           -i   //表示进入交互式接口模式

                  -i与-t在create时无法使用,原因在于-i-t是为了启动时交互式连入,其它选项create与run的区别不大

                            --name   //指名容器名称

                  注:容器的名称不是特别重要的信息,每一个容器都有一个唯一的标识符 ,即便没有名称,也可以使用标识来引用,但多数情况下,我们都应该给容器起一个名称,但一旦有了名称,容器的名称一定不能同名,因为在一个docker host之上所运行的多个容器默认在同一个名称空间(这里的名称空间指的docker名字取名的生效范围)下

                            --network    //指定网络接口(不指定的话默认是bridge

                            --rm  //如果这个容器停止了则立即将其删除,而不会保留在系统上(表示停止的容器自动被容器引擎予以删除)对于临时的容器可以使用--rm

                            -d //运行在后台

                    注:-d和--rm选项是不能同时存在的,因为送到后台去它不占用你前台,rm无法判断你什么时候终止

 [root@node1 ~]# docker run --name redis -d redis:4-alpine             //在后台运行redis容器
Unable to find image 'redis:4-alpine' locally
4-alpine: Pulling from library/redis
cbdbe7a5bc2a: Pull complete 
dc0373118a0d: Pull complete 
cfd369fe6256: Pull complete 
152ffd6a3b24: Pull complete 
7c01860f13a3: Pull complete 
aa6ecacd3bee: Pull complete 
Digest: sha256:aaf7c123077a5e45ab2328b5ef7e201b5720616efac498d55e65a7afbb96ae20
Status: Downloaded newer image for redis:4-alpine
a325be03b2d1d8905ab6cdbdf7b6d69142181d6b7e795051401097e421d20d84

[root@node1 ~]# docker run --name web -it --rm nginx:1.15-alpine /bin/sh               //运行容器,在容器停止时将其删除
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # exit
这里退出以后,shell不会继续运行下去,因为shell进程在退出时表示终止shell进程,一终止shell进程,就相当于终止了这个容器内唯一的进程。

注意:我们自己在做容器时一定要记住一个基本法则,镜像内唯一要运行的程序一定必须要运行在前台。我们此前在启动服务时,比如httpd它默认一回车会到后台,这在容器内是不被允许的,原因在于如果容器内运行一个httpd,一启动跑后台后,你的容器自己会认为无支撑者,哪怕PID为1都不行

4、dokcer 0

     docker0桥当我们启动一个容器时我们不指定的情况下容器默认会放置在了一个docker桥上,它默认使用的网络地址是172.17.0.0/16网段,而docker0自己的地址则是172.17.0.1

5、docker 在容器内执行命令

    #docker container exec = docker exec

[root@node1 ~]# docker container exec -it redis /bin/sh        //连到redis内部的shell接口
/data # ps aus
PID   USER     TIME  COMMAND
    1 redis     0:06 redis-server
   12 root      0:00 /bin/sh
   17 root      0:00 ps aus
/data # ifconfig     当前容器使用的ip地址
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1086 (1.0 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/data # netstat -tnl  查看所监听的端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      
tcp        0      0 :::6379                 :::*                    LISTEN      
/data # exit

注意:退出shell,此时容器不会终止,因为容器还有redis-server命令,exit终止的只是shell接口,只有终止pid为1的进程容器才会停止,docker只是为了运行单进程,但必要的时候可以从外部以exec的方式进入docker内部来执行其它进程

不进入容器交互式接口,在宿主机上查看该容器监听的端口

[root@node1 ~]# docker container exec redis netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      
tcp        0      0 :::6379                 :::*                    LISTEN      

6、在容器外部停止容器

#docker stop

[root@node1 ~]# docker stop redis
redis

7、删除容器

      #docker  rm

[root@node1 ~]# docker rm redis
redis

注:此时删除容器,那么容器上所创建的数据就不会存在,因为正常情况下,redis的数据都保存在容器内部自己的名称空间上,一旦容器被删除,容器存储空间对应的存储单元就会被删除,因为数据也会丢失(这就涉及后期会讲到docker的存储卷,可以让docker把数据存储到容器之外的位置,这样容器停止以后,直接删除容器,数据并不会丢失;下次在创建一个一模一样的容器,直接加载同一个的目录下的数据就可以了)

8、docker 日志

每一个容器内部有一个内荐的日志信息,docker容器中一个容器只运行一个进程,它可以让进程把日志(容器把进程)发给控制台,只要连入控制台就能查看日志,查看容器内部日志直接使用docker container logs连入控制台直接访问。

      #docker container logs 容器名称 = docker  logs

[root@node1 ~]# docker container logs web
172.17.0.1 - - [16/Nov/2020:09:43:56 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
172.17.0.1 - - [16/Nov/2020:09:45:53 +0000] "GET / HTTP/1.1" 200 612 "-" "ELinks/0.12pre6 (textmode; Linux; -)" "-"

注意docker日志是直接发往终端的没有记录在文件当中,主要便于集中统一日志收集平台来收集日志

9、显示所有容器运行时对资源占用情况(消耗的cpu,内存)

    #docker stats

[root@node1 ~]# docker stats

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
b2ccb924e5d9        web                 0.00%               1.402MiB / 1.781GiB   0.08%               1.93kB / 2.5kB      0B / 0B             2

 

10、显示指定容器内运行的所有进程相关信息

     #docker  container  top

[root@node1 ~]# docker container top web
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12939               12923               0                   04:42               ?                   00:00:00            nginx: master process nginx -g daemon off;
100                 12965               12939               0                   04:42               ?                   00:00:00            nginx: worker process

 

二、docker image

 1、docker  image

 docker 镜像含有启动容器所需要的文件系统及其内容,因此,它的核心作用是用于创建并启动容器

采用分层构建机制,最底层为bootfs,其上为rootfs

a.bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源

b.rootfs:位于bootfs之上,表现为docker容器的根文件系统

                 传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为"只读"模式,完整性自检完成后将其重新挂载为读写模式;

                 docker中,rootfs由内核挂载为“只读"模式,而后通过“联合挂载"技术额外挂载一个"可写"层;

                  

 

2、Docker image layer

    位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image)

    最上层为“可读写”层,其下层的均为“只读”层

    所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。    只有容器层是可写的,容器层下面的所有镜像层都是只读的。

                 

 

3、Docker   Registry

    启动容器时,docker  daemon会试图从本地获取相关镜像,本地镜像不存在时,其将从 Registry中下载该镜像并保存到本地

Docker Registry中的镜像通常由研发人员制作,而后推送至“公共”或者“私有”Registry上保存,供其它人员使用,例如部署到生产环境:

注意:生产环境中不要随意从互联网上下载镜像使用,除非这个镜像特别可靠,不然可能下载下来的镜像里被植入挖矿的代码之类。

 

4、利用已有的镜像层做镜像:

a.首先去docker hub上去创建一个镜像仓库

b.利用已有的镜像去做镜像:在容器可写层中做一些修改,而后把修改结果保存成一个单独的层就可以成为镜像

[root@localhost ~]# docker image pull busybox:latest                        //先下载一个busybox镜像
latest: Pulling from library/busybox
9758c28807f2: Pull complete 
Digest: sha256:a9286defaba7b3a519d585ba0e37d0b2cbee74ebfe590960b0b1d6a5e97d1e1d
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@localhost ~]# docker run --name b1 -it busybox /bin/sh                   //运行容器 在容器中做一个简单修改
/ # ls /
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir /test                  //在容器内创建data目录
/ # mkdir -p /test/web/html                   //在容器内创建 /data/web/html目录
/ # vi /text/web/html/index.html             //写一个测试网页

c.将刚刚修改过的busybox容器保存为镜像

[root@localhost ~]# docker commit b1 572232220/qiuchenyang:v0.1       //基于b1容器去打包镜像并做标签(这里的v0.1指的是第几版本)
sha256:c91978f6004211d1975c77696b1c9faee8274e53ea5ed86590885369d59c422e
[root@localhost ~]# docker image ls                     //查看打包好的镜像
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
572232220/qiuchenyang   v0.1                c91978f60042        2 minutes ago       1.23MB
centos                  7                   8652b9f0cb4c        5 days ago          204MB
busybox                 latest              f0b02e9d092d        5 weeks ago         1.23MB
redis                   4-alpine            e3dd0e49bca5        6 months ago        20.4MB
nginx                   1.15-alpine         dd025cdfe837        18 months ago       16.1MB

注意:我们在打包镜像时有些镜像还在运行中,直接打包会打包不完整,这时我们可以用commit命令的-p选项表示做镜像时先暂停不再让程序往上写数据,这样可以确保我们得到的是一个一致的数据结构

d.测试:我们现在使用打包好的镜像572232220/myimg去运行容器

[root@localhost ~]# docker run --name mybbox1 -it 572232220/qiuchenyang:v0.1
/ # ls
bin   dev   etc   home  proc  root  sys   test  tmp   usr   var
/ # cat /test/web/html/index.html 
<h1>Test Page @BusyBox Web Server</h1>

 

5、镜像上传到Docker hub

[root@localhost ~]# docker login         //输入用户名和密码登录Docker hub
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: 572232220
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
[root@localhost ~]# docker push 572232220/qiuchenyang:v0.1      //推送镜像到docker hub
The push refers to repository [docker.io/572232220/qiuchenyang]
3cc5a2c360e8: Pushed 
d2421964bad1: Mounted from library/busybox 
v0.1: digest: sha256:136abb5593d97640ad79d471ea6d6f552e1c849a64d610ab4c2593216178a6ed size: 734

6、登录docker hub查看镜像

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值