Docker容器管理

root
233
文章
0
评论
2020年5月7日18:59:54 评论 10379字阅读34分35秒

Docker容器管理

容器启动方式

交互式启动

-i 交互式启动

-t 开一个终端

docker container run -it 镜像名/镜像ID

[root@hwf ~]# docker container run -it 1d622ef86b13
root@a56369d31aeb:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

定义容器名称进行启动

docker container run -it --name="Kk" 镜像ID号

要是启动不了,在后面加上/bin/bash

docker container run -it --name="Kk" 镜像ID号 /bin/bash

守护进程式启动

-d 守护进程,后台运行的方式

docker run -d --name="Kk_nginx" 镜像ID/镜像名称

[root@hwf ~]# docker container run -d --name="Kk_nginx" nginx:1.16

如果没有下载镜像,也可以使用run命令,在启动容器时会自动去远程仓库进行拉去镜像

查看已经启动的容器

docker container ls

docker container ls -a 显示所有容器

[root@hwf ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a56369d31aeb        1d622ef86b13        "/bin/bash"         19 minutes ago      Exited (0) 15 minutes ago               busy_goldberg
a7863eaea588        hello-world         "/hello"            24 minutes ago      Exited (0) 24 minutes ago                       laughing_leavitt
6a20aaccf72b        hello-world         "/hello"            24 minutes ago      Exited (0) 24 minutes ago                       thirsty_meitner

 

CONTAINER ID:

  • 容器的唯一ID

IMAGE:

  • 镜像名称

NAME:

  • 容器的名字(可以自动生成,也可以手动生成)

STATUS:

  • 容器的运行状态[ Exitted退出状态,up开启状态 ]

 

查看容器的详细信息

docker container inspect 容器名称

[root@hwf ~]# docker container inspect Kk_nginx

可以看到IP地址,这个地址是可以通过宿主机进行直接访问的

                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",

检查nginx是否可用,这个地址windows上访问不了,只能在linux上访问

[root@hwf ~]# curl -I 172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 07 May 2020 08:49:28 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes

 

显示容器正在干什么

docker container ls -a --no-trunc 容器ID/容器名

查看容器

docker container ls -a等同于 docker ps -a

容器的应用场景

交互式的容器:

  • 工具类
    • 开发
    • 测试
    • 临时性的任务

这类容器使用的时候都会在启动的后面加一个 --rm当容器退出时自动删除容器

docker container run -it --name="Kk_ubu" --rm 镜像的ID/镜像的名称

[root@hwf ~]# docker container run -it --name="Kk_ubu" --rm 1d622ef86b13 
root@9b3dccfcafaf:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

守护式容器:

  • 服务

因为服务式的容器只能在内部使用,外部无法访问的内部容器,要添加一个映射端口,可以式外部的用户访问到自己

docker run -d -p 8080:80 --name="Kk_nginx" nginx:1.16

8080:代表你宿主机的IP地址加上8080端口就可以访问到docker容器里的nginx服务【相当于外部的端口】

80:代表把8080端口映射为docker容器的80端口【映射的内部端口】

[root@hwf ~]# docker run -d -p 7070:80 --name="Kk_ng" nginx:1.16
4bb42897f1ead28ebfb1c50527047bcbbd6dbdba4cbafd5c091e8b27c187c294
[root@hwf ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4bb42897f1ea        nginx:1.16          "nginx -g 'daemon of…"   8 seconds ago       Up 7 seconds        0.0.0.0:7070->80/tcp   Kk_ng
7dd636e4da25        nginx:1.16          "nginx -g 'daemon of…"   56 minutes ago      Up 56 minutes       80/tcp                 Kk_nginx

容器的重启

对于一个关闭的容器

不加-i 就是启动起来不连接进去

docker container start -i 交互式容器ID/交互式容器名称

不加-i 适合守护进程容器,不用连接进去

docker container start 守护式容器ID/守护式容器名称

容器的停止

容器的停止stop,这种方式式温柔的停止,可以防止数据在暴力停止的时候丢失

docker contariner stop 守护式容器ID/守护式容器名称

交互式容器的停止,直接exit

exit

容器的连接方法

比如说是,交互式容器在启动的时候没有加-i参数,它现在正在后台运行,我想要连接进去,这种情况下就会有两种连接方式,前提式这个容器要打开

attach的方式

docker container start 交互式容器名称/交互式容器ID

[root@hwf ~]# docker container start busy_goldberg 
busy_goldberg
[root@hwf ~]# docker container ls 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4bb42897f1ea        nginx:1.16          "nginx -g 'daemon of…"   33 minutes ago      Up 33 minutes       0.0.0.0:7070->80/tcp   Kk_ng
a56369d31aeb        1d622ef86b13        "/bin/bash"              3 hours ago         Up 2 seconds                               busy_goldberg

docker container attach 后台容器名称/后台容器ID

[root@hwf ~]# docker container attach busy_goldberg
root@a56369d31aeb:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

exec子进程的方式登陆

docker container exec -it 交互式容器ID/交互式容器名称 /bin/bash

这个是重点,在登陆使用容器的时候,退出不会关闭容器,对其它正在使用这个容器的人没有任何影响

如何把交互式容器的界面放到后台

Ctrl+p+q,先按Ctrl再按p再按q

这样就可以在后台运行

容器的删除

docker container rm -f `docker container ls -a -q`

这个加了-f全部容器都会删除

不加-f运行中的容器不会删除,没有运行的容器全部都会被删除

容器的网络访问

测试两个容器主机能否互相通讯

实验准备:

  • 建立两个centos6.9的容器,安装iproute*进行测试

docker container run -it --name="Kk_cent6.9" centos:6.9

yum -y install iproute*

[root@c1a18e500368 /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.080 ms
^C
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1329ms
rtt min/avg/max/mdev = 0.066/0.073/0.080/0.007 ms
[root@c1a18e500368 /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.132 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1365ms
rtt min/avg/max/mdev = 0.072/0.102/0.132/0.030 ms

通过小实验发现,镜像容器内的主机地址是可以相互通讯的,在一个广播域内

容器的外部访问

前面在守护进程式容器里已经写过了-p参数的一些,这里在写几个

指定外部IP地址访问容器

docker container run -it -p 10.0.0.100:777:80 --name="Kk_centos6.9" centos:6.9

这样只能通过10.0.0.100的地址才能访问到容器

指定外部IP地址访问容器,默认端口号匹配

docker container run -it -p 10.0.0.01::80 --name="kK_centos6.9" centos:6.9

指定多个端口进行映射[适用于多服务]

docker container run -it -p 8080:80 -p 33060:3306 -p 220:22 --name --name="kK_centos6.9" centos:6.9

查看容器运行了什么进程

docker container top 容器名称/容器ID

[root@hwf ~]# docker container top Kk_cont7.1 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                40949               40931               0                   14:09               pts/0               00:00:00            /bin/bash
root                41040               40949               0                   14:10               ?                   00:00:00            /sbin/udevd -d
root                41176               40931               0                   14:12               pts/1               00:00:00            bash

 

查看容器的日志

docker container logs 容器名称/容器ID

[root@hwf ~]# curl -I 172.17.0.3
curl: (7) Failed connect to 172.17.0.3:80; Connection refused
[root@hwf ~]# curl -I 172.17.0.4
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Fri, 08 May 2020 08:26:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes

[root@hwf ~]# docker container logs Kk_nginx 
172.17.0.1 - - [08/May/2020:08:26:06 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"

要想显示的更加详细 添加 -tf参数

-f   实时监控

-t   显示时间

docker container logs -tf Kk_nginx

[root@hwf ~]# docker container logs -tf Kk_nginx 
2020-05-08T08:26:06.413334337Z 172.17.0.1 - - [08/May/2020:08:26:06 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"

 

--tail 10 尾部多少行

docker container logs -tf -tail 10 Kk_nginx

容器的调试

对容器进行设置,检查,配置

查看交互式容器系统版本

cat  /etc/os-release

如何在Docker中进行数据交互

比如/opt/中有一个index.html的文件如何拷贝到容器中

docker container cp 宿主机上的哪个文件 容器名称/容器ID:放到哪里

[root@hwf ~]# docker container cp /opt/index.html Kk_nginx:/usr/share/nginx/html/

将容器的文件下载到本地

docker container cp 容器名/容器ID:文件位置 放到宿主机的什么位置

docker container cp Kk_nginx:/usr/share/nginx/html/index.html /opt/这里还可以给文件改名

[root@hwf ~]# docker container cp Kk_nginx:/usr/share/nginx/html/index.html /opt/xx
[root@hwf ~]# cat /opt/xx
haha

 

Docker的数据卷实现持久化存储

volume实现宿主机和容器的数据共享,类似于共享存储

实现方法:

mkdir -p /opt/html/

echo "hewenfu" >/opt/html/index.html

现在就要做一个把宿主机的/opt/html/和Docker容器中的宿主机目录/usr/share/nginx/html/目录进映射关系

docker container run -d --name="nginx1.16" -p 99:80 -v 宿主机目录:Docker容器目录地址 容器名称/容器ID

docer container run -d --name="nginx1.16" -p 99:80 -v /opt/html/:/usr/share/nginx/html/ nginx:1.16

[root@hwf ~]# mkdir -p /opt/html/
[root@hwf ~]# echo "hewenfu" >/opt/html/index.html

[root@hwf ~]# docker container run -d --name="nginx1.16" -p 99:80 -v /opt/html/:/usr/share/nginx/html/ nginx:1.16
dc212e68fe83d84854b083234638dc34afc3daecdc33a58f16ab741664c38064
[root@hwf ~]# curl 192.168.1.3:99
hewenfu

然后可以在宿主机的文件里修改文件,Docker容器里的nginx站点目录就会跟着变化

[root@hwf ~]# echo "docker container" > /opt/html/index.html 
[root@hwf ~]# curl 192.168.1.3:99
docker container

 

要想查看一个容器是否配置了volume使用的命令:

docker container inspect 容器名称/容器ID

在其中的mounts板块中可以看到容器的映射目录

docker container inspect nginx

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

 

使用数据卷容器

应用在于:在集中管理群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理

把一个系统作为映射模板,通过调用--volumes-from参数就在其它容器创建的时候,调用这个映射模板,就可以完成繁琐的工作

拷贝数据到数据卷中

实践方式:

宿主机操作:

[root@hwf ~]# mkdir -p /opt/volume/{a,b}

[root@hwf ~]# touche /opt/volume/{a,b}/xx.txt

启动数据卷容器

docker container run -it --name="数据卷容器的名字" -v /opt/volume/a:/opt/a -v /opt/volume/b 容器名称/容器ID

[root@hwf ~]# docker container run -it --name="volume_cent1" -v /opt/volume/:/opt/a -v /opt/volume/:/opt/b centos:6.9

ctrl +p +q

 

使用数据卷容器

docker container run -d -p 88:80 --name="nginx1.16" --volumes-from 数据库容器名称 nginx:1.16

[root@hwf ~]# docker container run -d -p 71:80 --volumes-from volume_cent --name="ll" nginx:1.16
ea2a58f4fdfd81db5026d89acf6a4fa2fed8a1f162d558095f92d461c252284e

 

比如说一个服务,你修改了它的配置文件,在宿主机的目录里,那么想要让这个修改后的配置生效,就重启一下对应的容器就可以了

docker 的网络模式

docker 自带3个网络模式:

  • bridge网络
  • host网络模式
  • none网络模式
[root@hwf ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
21ef2f505e7e        bridge              bridge              local
f4ac58fe0476        host                host                local
8e26390a8f01        none                null                local

 

1.none网络

这种网络模式下容器只有lo回环网络,没有其它网卡。none网络可以在容器创建时通过 --network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性

查看host网络模式的容器信息

docker network inspect none

2.host网络

通过命令--network=host指定,使用host模式的容器可以直接使用docker host的IP地址与外接通讯,容器内部的服务端口也可以使用宿主机的端口,不需要进行nat,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能在用了,网络的隔离线不好

[root@hwf ~]# docker container run -it --name="xx" --network=host centos:6.9

查看host网络模式的容器信息

docker network inspect host

3.bridge网络

容器的默认网络模式,docker在安装时会创建一个名为docker0的Linux bridge ,在不指定--network的情况下创建的容器会默认挂载到docker0上面

查看容器的bridge网络模式的ip地址

docker network inspect bridge

[root@hwf ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "21ef2f505e7e71c427113ebdd1008944fa5b0adeac5fd6104aeddfbbed30da44",
        "Created": "2020-05-06T12:51:02.459115291+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },

 

查看主机网桥情况,brctl show,在docker 0 网桥下有2个接口,对应前面容器各自的虚拟网卡,创建一个容器之后一个就是容器创建时创建的虚拟网卡。bridge模式为容器创建独立的网络栈,保证容器内的进程使用独立的网络缓解,使容器之间,容器和docker host之间实现网络隔离

[root@hwf ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242dad3861f	no		veth6637605
							veth8083bc5
virbr0		8000.5254006ed26a	yes		virbr0-nic

这里可以看出docker0网桥上对应了2个容器挂靠的虚拟网卡,此3个容器之间可以互相通信,因为在一同一个网桥下面

容器的重启策略

no 默认策略,在容器退出时不重启容器
on-failure 在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3 在容器非正常退出时重启容器,最多重启3次
always 在容器退出时总是重启容器
unless-stopped 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

 

容器退出的状态码

0 表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)    
125,Docker守护进程本身的错误    
126,容器启动后,要执行的默认命令无法调用    
127,容器启动后,要执行的默认命令不存在    
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

 

docker continer --restart 参数

通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。
--restart选项通常只用于detached模式的容器。

--restart选项通常只用于detached模式的容器。

--restart选项通常只用于detached模式的容器。

容器的重启策略设置为on-failure:3,容器不正常退出就重启,最大次数为3

[root@hwf ~]# docker container run -d --name="nginx_1" --network=bridge --restart=on-failure:3 -p 11:80 nginx:1.16
313e04b4f25936312a9349db71807d3227a20be3219957134b45b3213f5e4210

进行查看容器的重启策略类型

[root@hwf ~]# docker container inspect nginx_1|grep -A 5 -i "restartpolicy"
            "RestartPolicy": {
                "Name": "on-failure",
                "MaximumRetryCount": 3
            },
            "AutoRemove": false,
            "VolumeDriver": "",

 

容器的重启策略设置为always,容器退出就重启

[root@hwf ~]# docker container run -d --name="nginx_2" --network=bridge --restart=always -p 12:80 nginx:1.16
beb3adef38e8688037d8c919bdf4a0c3c22bd44fd64c3d4682972881e70724fc

进行查看容器的重启策略类型

[root@hwf ~]# docker container inspect nginx_2 |grep -i -A 5 "restartpolicy"
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",

 

修改已有容器的--restart参数

[root@hwf ~]# docker update --restart=always nginx_1
nginx_1

 

进行查看

[root@hwf ~]# docker container inspect nginx_1 |grep -i -A 5 "restartpolicy"
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",

 

 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2020年5月7日18:59:54
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Harbor镜像仓库 Docker

Harbor镜像仓库

Harbor镜像仓库 一、Harbor特性介绍 基于角色访问控制 每个人角色不同,需求也不同,因此就需要访问权限控制,根据角色分配相应的权限。例如,开发人员需要对项目构建这就需要用到读写权限(push...
Centos7解决systemctl无法使用 Docker

Centos7解决systemctl无法使用

systemd整合: 因为systemd要求CAPSYSADMIN授权,从而得到了读取到宿主机cgroup的能力,Centos7中已经用fakesystemd代替了systemd来解决依赖问题。如果仍...
Dockaer网络 Docker

Dockaer网络

Dockaer网络 docker本地网络类型 查看本地支持网络类型 docker network ls # docker network ls NETWORK ID NAME DRIVER SCOPE...
Dockerfile练习 Docker

Dockerfile练习

Dockerfile练习 实验一:要求使用centos7基础镜像,搭建httpd+sshd+php的镜像,实现httpd与sshd服务能够正常访问 创建存放dockerfile的目录 mkdir -p...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: