docker学习笔记(二):镜像及容器

1启动这个容器:            docker    run  -itd      centos 

     查看这个容器:            docker   ps

[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2e1518f22125        centos              "/bin/bash"         9 seconds ago       Up 5 seconds                            upbeat_lichterman
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2e1518f22125        centos              "/bin/bash"         14 seconds ago      Up 10 seconds                           upbeat_lichterman

2、如何进入到一个容器下:      docker   exec         容器ID (CONTAINER ID)     bash

exec  后面可以更  容器 ID(前六位)   ,         也可以是  容器的 NAMES

[root@localhost_001 ~]# docker exec -it 2e1518 bash
[root@2e1518f22125 /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@2e1518f22125 /]# df -h 
Filesystem      Size  Used Avail Use% Mounted on
overlay          36G  4.3G   32G  12% /
tmpfs            64M     0   64M   0% /dev
tmpfs           489M     0  489M   0% /sys/fs/cgroup
/dev/sda3        36G  4.3G   32G  12% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           489M     0  489M   0% /proc/asound
tmpfs           489M     0  489M   0% /proc/acpi
tmpfs           489M     0  489M   0% /proc/scsi
tmpfs           489M     0  489M   0% /sys/firmware
[root@2e1518f22125 /]# free 
              total        used        free      shared  buff/cache   available
Mem:         999700      636412       96948        1772      266340      176564
Swap:       4194300        7648     4186652

注释:容器就是一个阉割版的操作系统,大约只有100M: 可以看到磁盘和内存都和宿主机的大小是一样的;并且可以使用的命令只有600多个;

如下:在容器是不能查看IP地址的,所有需要安装 net-tools 这个包;

ot@2e1518f22125 /]# ifconfig 
bash: ifconfig: command not found
[root@2e1518f22125 /]# yum install -y net-tools
[root@2e1518f22125 /]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 2446  bytes 9684204 (9.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2072  bytes 115550 (112.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

注释:可以看到IP地址变成172.17.0.2,这是docker生成的一个网段,类似于vmware的net8 NAT模式,每开启一个docker就会生成一个新的网卡生成;

然后此时查看宿主机也有这几个网段了;

[root@localhost_001 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:5bff:fe9e:626f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:5b:9e:62:6f  txqueuelen 0  (Ethernet)
        RX packets 2100  bytes 88502 (86.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2462  bytes 9685740 (9.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3、现在可以把这个容器的变更保存到镜像里去,做成一个新的镜像了;比如:在这个容器里安装 net-tools 命令,下次可以直接使用这个容器,这样可以查看ifconig这个命令,而就不需要再重新安装了;

docker commit -m "install net-tools" -a "yuanhh" 2e1518f22125 centos_with_net
 -m   "后面跟加的一些改动信息"        -a   "表示那个作者改动的"

[root@localhost_001 ~]# docker commit -m "install net-tools" -a "yuanhh" 2e1518f22125 centos_with_net
sha256:e9fff0b4ad1ad2fba2c142532ebc085e04105b56e707ee343f5b2029b88328d8
[root@localhost_001 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos_with_net     latest              e9fff0b4ad1a        15 seconds ago      280MB
ubuntu              latest              94e814e2efa8        39 hours ago        88.9MB
centos              latest              1e1148e4cc2c        3 months ago        202MB
fenye               latest              1e1148e4cc2c        3 months ago        202MB
yuanhh              190312              1e1148e4cc2c        3 months ago        202MB

4、可以运行上面生成的那个镜像试试;    docker   run  -itd    centos_with_net

并进入这个容器:       docker exec -it dreamy_aryabhata bash

[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
288405f3fde6        centos_with_net     "/bin/bash"         12 seconds ago      Up 8 seconds                            dreamy_aryabhata
2e1518f22125        centos              "/bin/bash"         20 minutes ago      Up 20 minutes                           upbeat_lichterman

[root@localhost_001 ~]# docker exec -it dreamy_aryabhata bash
[root@288405f3fde6 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

注释:发现可以直接运行这个ifconfig 这个命令,因为这个容器是之前的容器保存成镜像的,并且还发现和之前的那个容器是在一个网段的; 172.17.0.3

5、docker使用模板创建镜像:

1、首先去官网openvz.org 下载一个模板:  https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz

[root@localhost_001 ~]# wget https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
--2019-03-14 10:10:27--  https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:210291971 (201M) [application/x-gzip]
正在保存至: “centos-6-x86-minimal.tar.gz”

2、导入该镜像:    cat   centos-6-x86-minimal.tar.gz |docker   import   -  centos 

[root@localhost_001 ~]# cat centos-6-x86-minimal.tar.gz |docker import - centos6
sha256:afa1f6db949f4ad7ae513ac5de1c9803355fa35ce8420fb3d67fb90d8fe3e48d

3、查看这个镜像:   docker    images                   |  第一个就是;

[root@localhost_001 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              afa1f6db949f        15 minutes ago      512MB
centos_with_net     latest              e9fff0b4ad1a        11 hours ago        280MB
ubuntu              latest              94e814e2efa8        2 days ago          88.9MB
centos              latest              1e1148e4cc2c        3 months ago        202MB
fenye               latest              1e1148e4cc2c        3 months ago        202MB
yuanhh              190312              1e1148e4cc2c        3 months ago        202MB

启动并进入到这个容器:   docker  run  -itd   centos   bash                  |            docker     ps

[root@localhost_001 ~]# docker run -itd centos6 bash         #启动这个容器;
b340e953ed68ca4461a52ea061310bb1f7a5a0773437e79acad158556d13dd4a
[root@localhost_001 ~]# docker ps                 #查看当前运行的容器;
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b340e953ed68        centos6             "bash"              12 seconds ago      Up 6 seconds                            peaceful_herschel
[root@localhost_001 ~]# docker exec -it b340e95 bash        #进入这个容器;
[root@b340e953ed68 /]# 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:16 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:1296 (1.2 KiB)  TX bytes:0 (0.0 b)
[root@b340e953ed68 /]# cat /etc/issue          #查看系统版本
CentOS release 6.8 (Final) 
Kernel \r on an \m

注释:而且和宿主机使用的是同一个内核;  只是主机名不同而已;

4、把现有镜像导出为一个文件:             docker save -o yuanhh_centos_with(新文件名)     centos_with_net(旧文件名)

[root@localhost_001 ~]# docker save -o yuanhh_centos_with  centos_with_net
[root@localhost_001 ~]# ls
yuanhh_centos_with

注释: 我们还可以使用这个文件恢复本地镜像;

docker    load    --input     yuanhh_centos_with    或者       docker     load     <  yuanhh_centos_with

[root@localhost_001 ~]# docker rmi -f centos_with_net       #删除这个镜像, -f 表示强制删除
Untagged: centos_with_net:latest
Deleted: sha256:e9fff0b4ad1ad2fba2c142532ebc085e04105b56e707ee343f5b2029b88328d8
[root@localhost_001 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              afa1f6db949f        33 minutes ago      512MB
ubuntu              latest              94e814e2efa8        2 days ago          88.9MB
centos              latest              1e1148e4cc2c        3 months ago        202MB
fenye               latest              1e1148e4cc2c        3 months ago        202MB
yuanhh              190312              1e1148e4cc2c        3 months ago        202MB
[root@localhost_001 ~]# docker load < yuanhh_centos_with       #恢复;
Loaded image: centos_with_net:latest
[root@localhost_001 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              afa1f6db949f        35 minutes ago      512MB
centos_with_net     latest              e9fff0b4ad1a        12 hours ago        280MB

其中如上导出镜像导入镜像命令:    save      load  是一对;

然后导入镜像和导出镜像命令:        export  和   import  是一对;

5、当然也可以把自己的镜像导入传到 dockerhub官网上去,但是前提需要注册一个用户才可以;

docker  push   image      name

6、容器管理;     docker  create -it  镜像名称                                         docker    start|stop|restart       容器ID

创建一个容器,但是该容器并没有启动:         docker   create -it    centos6   bash           用  docker   ps   -a    才能查看到;

启动一个容器:    docker    start|stop|restart       容器ID(CONTAINER ID)                     启动|关闭|重启

[root@localhost_001 ~]# docker create -it centos bash          #创建一个容器
1c9e512ff5a1e8f4d506963ddeb97a93681de97cae4c7d2b02b9cb3784c2c967
[root@localhost_001 ~]# docker ps -a            #查看这个容器; 状态显示 created 状态
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
1c9e512ff5a1        centos              "bash"              4 seconds ago       Created                                          silly_knuth
8a021ac19c69        fenye               "/bin/bash"         2 minutes ago       Up 2 minutes                                     kind_jones

注释:发现以上页面显示 created  启动状态;           启动成功后用  docker   ps   就可以查看到了;

docker    start   1c9e512ff5a1(容器ID)

[root@localhost_001 ~]# docker start 1c9e512ff5a1
1c9e512ff5a1
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1c9e512ff5a1        centos              "bash"              6 minutes ago       Up 2 seconds                            silly_knuth
8a021ac19c69        fenye               "/bin/bash"         9 minutes ago       Up 8 minutes                            kind_jones
b340e953ed68        centos6             "bash"              11 hours ago        Up 3 minutes                            peaceful_herschel

注释:其实这样子:   docker   run    -tid    镜像名称    就等同于是   先 create  再  start

7、直接进入这个容器操作:  docker run -it centos bash       

可以允许一些命令,然后使用 exit  和 ctrl+d 退出后,这个容器也会停止;  因为没有加 -d  ,   -d 则表示在后台运行这个容器;

[root@localhost_001 ~]# docker run -it fenye bash
[root@3d6aa960c09a /]# ifconig 
bash: ifconig: command not found
[root@3d6aa960c09a /]# yum install -y net-tools > /dev/null
[root@3d6aa960c09a /]# exit            #退出
exit
[root@localhost_001 ~]# docker ps        #退出后发现这个容器也没有在运行了;
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e10f1c3ae75e        centos              "bash"              8 minutes ago       Up 8 minutes                            zealous_galois

注释:  当然也可以只让容器在后台运行:   docker   run    -d    centos 

8、 当然也可以只让容器在后台运行:   docker   run    -d    centos

比如:可以是用  -c 选项让docker 运行一个命令,然后在退出;  docker run -d fenye bash -c "while :;do echo "123";sleep 2;done"

[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4b299a44f97d        fenye               "bash -c 'while :;do…"   41 seconds ago      Up 37 seconds                           eager_chatelet
e10f1c3ae75e        centos              "bash"                   13 minutes ago      Up 13 minutes                           zealous_galois
[root@localhost_001 ~]# 
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
4b299a44f97d        fenye               "bash -c 'while :;do…"   About a minute ago   Up About a minute                       eager_chatelet
#注释:每隔两秒打印 一次123就可以;

9、给容器自定义名称:   如上图最右侧的 NAME 参数;    docker   rum  -itd   --name  ubuntu_test    ubuntu   bash

[root@localhost_001 ~]# docker run -itd --name ubuntu_test ubuntu bash
894dc0c4a29c22a66db30a5ce4c23b558520602b524b5450ad9dfbbef2aab16a
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
894dc0c4a29c        ubuntu              "bash"              17 seconds ago      Up 14 seconds                           ubuntu_test
e10f1c3ae75e        centos              "bash"              20 minutes ago      Up 19 minutes                           zealous_galois

然后进入这个容器时,就可以加 NAME  就可以了;   docker    exec -it    ubuntu_test

当然也可以加 容器 ID 进入:  docker    exec   -it    894dc0c4a29c

[root@localhost_001 ~]# docker exec -it ubuntu_test bash
root@894dc0c4a29c:/# ls     
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

10、也可以让容器 执行完某个命令后直接删除;     docker    run  --rm  -it    fenye   bash    -c   "sleep  60"

[root@localhost_001 ~]# docker run  --rm  -itd fenye  bash -c "sleep 60"
4570ff07657196736ba8246e08c8a6c76278a4b6edf9d8d3479c7360a2163c4a
[root@localhost_001 ~]# 
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
4570ff076571        fenye               "bash -c 'sleep 60'"   3 seconds ago       Up 2 seconds                            eager_wilbur
894dc0c4a29c        ubuntu              "bash"                 8 minutes ago       Up 8 minutes                            ubuntu_test
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
894dc0c4a29c        ubuntu              "bash"              10 minutes ago      Up 10 minutes                           ubuntu_test

11、获取容器运行的历史信息:            docker    logs   容器ID

[root@localhost_001 ~]# docker run -itd  fenye  bash -c "echo yuanhh"
463522739e5ece95445b7ce85d3e112fa3cb99fb34a519fc33c98ee087bf3c89
[root@localhost_001 ~]# 
[root@localhost_001 ~]# docker logs 46352273
yuanhh

注释docker   attach    可以进入一个后台运行的容器, 比如:  docker      attach   aa964fd01624(容器ID)     但是 attach 这个命令并不好用,如果使用这个进入后台容器,再退出exit,然后就会直接退出这个容器了;         也可以使用   ctrl+q  ,临时退出这个容器,不会退出后台程序;

[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
aa964fd01624        fenye               "bash"              5 seconds ago       Up 3 seconds                            gallant_cray
894dc0c4a29c        ubuntu              "bash"              20 minutes ago      Up 20 minutes                           ubuntu_test
[root@localhost_001 ~]# docker attach  aa964fd01624
[root@aa964fd01624 /]# exit
exit
[root@localhost_001 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
894dc0c4a29c        ubuntu              "bash"              25 minutes ago      Up 25 minutes                           ubuntu_test

当然,还有一个办法,   docker   exec  -itd   容器ID(CONTAINEA ID)  bash   这样就算是用exit退出后,容器仍然会在后台运行;

12、删除容器:      docker     rm    容器ID(CONTAINEA ID)   这样可以把容器删除掉,如果在运行着的容器,则需要加上 -f 选项;

[root@localhost_001 ~]# docker rm  288405f3fde6
288405f3fde6
[root@localhost_001 ~]# docker rm  8a021ac19c69
8a021ac19c69

[root@localhost_001 ~]# docker rm  -f e10f1c3ae75e 
e10f1c3ae75e
[root@localhost_001 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
894dc0c4a29c        ubuntu              "bash"              33 minutes ago      Up 33 minutes                           ubuntu_test
1c9e512ff5a1        centos              "bash"              About an hour ago   Up About an hour                        silly_knuth

13、导出容器:                 export      容器ID   >  file.tar                    容器导出之后可以迁移到其它机器去使用的;

[root@localhost_001 ~]# docker export 894dc0c4a29c > file.tar

[root@localhost_001 ~]# 
[root@localhost_001 ~]# ls -ld file.tar 
-rw-r--r-- 1 root root 72308736 3月  14 22:53 file.tar

导入容器并生成镜像:       cat  file.tar   |docker  import    - yuanhh_test            导入容器并生成 yuanhh_test镜像;

[root@localhost_001 ~]# cat file.tar |docker import - yuanhh_test 
sha256:56830bb9c4023bc2bd691fe4f5cce59fcb47d0ce81043d49f3f516c1e330fe75
[root@localhost_001 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yuanhh_test         latest              56830bb9c402        7 seconds ago       69.8MB
centos6             latest              afa1f6db949f        12 hours ago        512MB

 

转载于:https://my.oschina.net/yuanhaohao/blog/3022250

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值